Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android測試] AS+Appium+Java+Win 自動化測試之九:PO模式的實例與ReportNg測試報告

[Android測試] AS+Appium+Java+Win 自動化測試之九:PO模式的實例與ReportNg測試報告

編輯:關於Android編程

一、介紹准備

之前在這篇文章有寫過一個例子,但是這個例子只實現了登錄功能,封裝還是不好的,也不能多個用例執行,現在來用上一篇文章封裝之後的方法來寫實例。封裝和例子代碼已打包在底部有鏈接

測試app: 守護2.2.4
appium: 1.4.16
os: win10
android: 小米note,android6.0

二、重寫登錄用例

1. 確定流程

打開app,到達歡迎界面,點擊登錄,輸入帳號密碼,登錄,判斷是否登錄成功。

邏輯注意點:

第一次打開會彈出引導頁面,這個頁面是另一個Activity:AboutActivity 已經登錄過了,就會直接到首頁 第一次到首頁,會有一個dialog,這個會擋住首頁

2. 編寫page

在pages目錄下新建LoginPage.java,繼承PageAppium,實現登錄的界面的控件獲取和存放id值

package com.example.pages;

import com.example.base.PageAppium;

import java.util.List;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

/**
 * ui界面類,界面在這裡處理
 * Created by LITP on 2016/9/22.
 */
public class LoginPage extends PageAppium {

    //登錄界面的登錄按鈕
    public final String LOGIN_BUTTON_ID = "login_btn_login";
    //第一屏的登錄按鈕
    public final String WELCOME_LOGIN_BUTTON_ID = "welcome_login_btn";

    //成功登錄到首頁標識
    public final String INDEX_TEXT = "首頁";

    //是否在關於屏標識
    public final String ABOUT_TEXT = "AboutActivity";

    //關於頁面的按鈕id
    public final String ABOUT_BUTTON_ID = "about_go_button";


    //帳號密碼控件
    public final String NAME_PASS_ELEMENT = "android.widget.EditText";
    //首頁控件
    public final String INDEX_ELEMENT = "tl_index";

    //登錄完成之後的activity名字
    public final String INDEX_ACTIVITY_NAME = "IndexActivity";

    public LoginPage(AndroidDriver driver){
        super(driver);
    }


    /**
     * 是否在歡迎界面
     */
    public boolean isWelcome(){
        return isIdElementExist(WELCOME_LOGIN_BUTTON_ID,3,true);
    }


    /**
     * 獲取關於界面的activity的名字
     * @return
     */
    public String getAboutText(){
        return ABOUT_TEXT;
    }


    /**
     * 獲取關於界面的按鈕
     * @return
     */
    public AndroidElement getAboutButton(){
        return waitAutoById(ABOUT_BUTTON_ID);
    }


    public AndroidElement getWelcmoeLoginButton(){
        return findById(WELCOME_LOGIN_BUTTON_ID);
    }


    public AndroidElement getLoginButton(){
        return findById(LOGIN_BUTTON_ID);
    }

    /**
     * 獲取賬號密碼框的控件
     * @return
     */
    public List getNamePassElement(){
        return getManyElementByClassName(NAME_PASS_ELEMENT,2);
    }


    /**
     * 首頁標識,是否成功登錄
     * @return
     */
    public boolean getIndexflag(){
        /*AndroidElement element =  waitAutoByXp(LoginPage.INDEX_TEXT);
        return  element != null;*/

        AndroidElement element = findById(INDEX_ELEMENT);
        return element != null;
    }


    /**
     * 獲取首頁的一個元素,讓操作程序等待
     */
    public String getIndexElementId(){
        return INDEX_ELEMENT;
    }

    /**
     * 獲取首頁的一個元素,讓操作程序等待
     */
    public AndroidElement getIndexElement(){
        return findById(INDEX_ELEMENT);
    }


    public String getIndexActivity(){
        return INDEX_ACTIVITY_NAME;
    }

}

3. 編寫用例

在cases目錄下新建Login.java,繼承InitAppium,實現用例的初始化操作

package com.example.cases;

import com.example.base.Assertion;
import com.example.base.InitAppium;
import com.example.operation.LoginOperate;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/**
 * 登錄測試用例
 * Created by LITP on 2016/9/22.
 */

public class Login extends InitAppium {

    private LoginOperate loginOperate;


    @BeforeClass
    public void initDriver(){
        Assert.assertNotNull(driver);
        loginOperate = new LoginOperate(driver);
    }

    /**
     * 測試帳號對 密碼不對情況
     */
    @Test(priority = 0)
    public void loginErrorUser(){
        boolean flag = loginOperate.login("13192624740","iuhihj");
        Assertion.verifyEquals(flag,true,"帳號對密碼錯誤是否登錄成功");
        print("帳號密碼不對情況登錄:"+ flag);
    }

    /**
     * 測試帳號密碼規格不對情況
     */
    @Test(priority = 1)
    public void loginErrorNum(){
        boolean flag = loginOperate.login("1319262asdfsddsasdfsdfsdfsdfsdfsdf4740","dfgd#@$1234fgdsfgdsgdffds");
        Assertion.verifyEquals(flag,true,"帳號密碼格式不對是否登錄成功");
        print("帳號密碼格式不對情況登錄:"+ flag);
    }


    /**
     * 測試帳號密碼為中文情況
     */
    @Test(priority = 2)
    public void loginChinese(){
        boolean flag = loginOperate.login("帳號","密碼");
        Assertion.verifyEquals(flag,true,"帳號密碼為中文是否登錄成功");
        print("帳號密碼為中文情況登錄:"+ flag);
    }



    /**
     * 測試帳號密碼為空情況
     */
    @Test(priority = 3)
    public void loginEmpty(){
        boolean flag = loginOperate.login("","");
        Assertion.verifyEquals(flag,true,"帳號密碼為空是否登錄成功");
        print("帳號密碼為空情況登錄:"+ flag);
    }


    /**
     * 測試帳號密碼正確情況
     */
    @Test(priority = 4)
    public void loginConfim() {
        boolean flag = loginOperate.login("13192624740","xxxxxx");
        print("帳號密碼對的情況登錄:"+ flag);
        Assert.assertTrue(flag,"帳號密碼對的情況登錄");

    }

}

4. 編寫邏輯operate

實現用例的登錄邏輯,繼承OperateAppium

package com.example.operation;

import com.example.base.OperateAppium;
import com.example.pages.LoginPage;

import io.appium.java_client.android.AndroidDriver;

/**
 * 登錄邏輯處理
 * Created by LITP on 2016/9/23.
 */

public class LoginOperate extends OperateAppium {

    private LoginPage loginPage;

    AndroidDriver driver;

    public LoginOperate(AndroidDriver driver){
        super(driver);
        loginPage = new LoginPage(driver);
        this.driver = driver;
    }

    /**
     * 傳遞帳號密碼
     * @param name 帳號
     * @param pass 密碼
     * @return 是否成功登錄到主頁
     */
    public boolean login(String name,String pass){

        sleep(1000);
        //是否在歡迎頁面
        if(getCurrActivity().equals(loginPage.getAboutText())){
            print("關於界面");
            for(int i=0; i<4; i++){
                swipeToLeft(300);
                sleep(500);
            }
            clickView(loginPage.getAboutButton());
            //點擊歡迎頁面的登錄
            clickView(loginPage.getWelcmoeLoginButton());

            //在歡迎界面
        }else if(loginPage.isWelcome()){
            print("點擊登錄");
            clickView(loginPage.getWelcmoeLoginButton());
        }else if(loginPage.getLoginButton() == null){//自動登錄了就輸出成功,返回
            print("自動登錄了,返回,執行注銷");
            return true;

        }

        //輸入內容
        inputManyText(name,pass);

        //點擊登錄
        clickView(loginPage.getLoginButton());

        //等待到首頁
        waitAutoById(loginPage.getIndexElementId());

        //如果在登錄完的界面沒有第一屏就點擊一下中間,關閉引導屏
        if(loginPage.getIndexElement() == null &&
                getCurrActivity().equals(loginPage.getIndexActivity())){
            press();
        }
        //返回是否成功到主頁
        return loginPage.getIndexflag();
    }


}

5. 運行的xml

在這個測試module根目錄下創建testng_login.xml文件,輸入下面的內容右鍵run運行就是運行用例了,不懂的看之前的文章


 
    
        
            
        
    

三、修改資料用例

這個我打包了,最重要的一點就是修改用戶資料之前得先調用 正確的帳號密碼登錄

    @Test
    public void Login() {
        //這裡先登錄,
        boolean flag = loginOperate.login("13192624740", "xxxxxx");

        //斷言是否成功登錄,登錄成功才修改資料
        Assert.assertTrue(flag);
    }

四、測試報告ReportNg

testng自身帶有測試報告,但是內容難以觀看理解,所以這裡利用了ReportNg

1. 導入jar包

這個包是經過修改的,支持中文,放到測試的module的libs文件夾,右鍵add as library,不懂的看前面的文章,

2. 添加監聽器

修改剛剛的testng_login.xml ,添加了listeners,再次運行這個xml,在module目錄下就會看到有test-output測試報告的文件夾,有html和xml格式的


 
    
        
            
        
        
            
            
        
    

3. 查看測試報告

在index.html右擊選擇浏覽器打開

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved