1. 程式人生 > >APPIUM+JAVA實現對安卓APK的自動化測試----第十四篇【mySelf框架】

APPIUM+JAVA實現對安卓APK的自動化測試----第十四篇【mySelf框架】

由於之前的種種問題,作者痛下決心,義無反顧,瞬間感覺時代在召喚。。。額~好吧不瞎嗶嗶了。

作者首先對APPIUM的一些基本函式做了封裝,事例程式碼如下:

import java.util.concurrent.TimeUnit;

import com.mypublic.mywheel.log.Log4jlog;

import io.appium.java_client.android.AndroidDriver;

public class Android_Click {

    private AndroidDriver<?> driver;
    private Log4jlog ciicLog = new Log4jlog(this.getClass());

    public Android_Click(AndroidDriver<?> driver) {

        this.driver = driver;

    }

    // 1常用函式
    public void clickElementByAccessibilityId(String byAttribute, int timeout)
            throws Exception { //向上丟擲異常

        driver.manage().timeouts().implicitlyWait(timeout, TimeUnit.SECONDS); //等待元素出現
        driver.findElementByAccessibilityId(byAttribute).click(); //查詢並點選元素
        ciicLog.log4jlogInfo("操作提示:點選AccessibilityId元素【" + byAttribute + "】成功"); //打出日誌

    }

。。。程式碼片段

作者為什麼想這麼幹呢,主要目的是為了提供完整的操作日誌,從而可以方便排查錯誤,而且可以當詳細的測試報告來用,作者很懶~世界公認。

其次在這裡封裝後,我們的測試用例的程式碼量和行數將減少很多,到時候用例看起來比較方便。

作者主要封裝了,驅動的啟動和結束,以及常用動作的點選、輸入、拖動、等待、截圖等功能。

在這裡作者將其打成JAR包,提供給用例模組使用。至於具體的程式碼作者就不一個一個的列出了,客觀門理解了作者的用意之後,估計都可以自己實現。

接下來是用例,作者分為了

CASE_INIT //用例的初始化操作

CASE_BODY //用例體,也就是用例的執行操作

CASE_END //用例結束操作

BULID_CASE //為用例的組裝,也就是把 INTI、BADY、END 組裝起來,並且該引數化的引數化,該物件化的物件化,次兩點稍後作者再詳細說明。

CASE_LIST //用例清單,作者做了一個LIST,將用例排序封裝成一個列表提供給作者自己寫的GUI使用。

作者在這裡給出一個自己寫的用例的式樣,客觀看好了。。。

CASE_INIT========================================================================
public class CaseInit {

    public boolean execute_CaseInit_WeiXinInit(String account,String password) {

        try {
        
            //獲取properties屬性值,2016年02月26日,資料引數化和物件化的操作,也就介面元素來自於外部的屬性檔案或者EXCEL,

            在這裡作者也水了一把,BUTTON 結果被作者硬生生的寫成了BOTTON,而且一錯到底,唉唉,見諒見諒。

            OperationPropertiesFile oPf=new OperationPropertiesFile("\\conf\\case.properties");
            String botton_login_name = oPf.getProperties("botton_login_name").toString();
            String botton_otherWayLogin_name = oPf.getProperties("botton_otherWayLogin_name");
            String editText_account_name = oPf.getProperties("editText_account_name");
            String editText_passWord_xpath = oPf.getProperties("editText_passWord_xpath");
            String botton_noSynchronization_id = oPf.getProperties("botton_noSynchronization_id");
            String botton_publicNumber_name = oPf.getProperties("botton_publicNumber_name");
            String botton_proName_name = oPf.getProperties("botton_proName_name");
            String botton_HomeOfEmployees_name = oPf.getProperties("botton_HomeOfEmployees_name");

            //由於封裝了基本操作,所以只用新建物件就可以重複使用了============================================
            //Android_WaitUntil myWaitUntil= new Android_WaitUntil(driver);
            Android_Click myClick= new Android_Click(driver);
            Android_SendKeys mySendKeys= new Android_SendKeys(driver);
            Android_Slide mySlide= new Android_Slide(driver);

            //操作步驟,是不是瞬間覺得操作步驟少了很多很多====================================================
            //登入介面
            myClick.clickElementByName(botton_login_name, 30);
            //使用其他登入方式
            myClick.clickElementByName(botton_otherWayLogin_name, 15);
            //QQ號登入
            mySendKeys.sendKeysElementByName(editText_account_name, account, 15);
            //輸入密碼
            mySendKeys.sendKeysElementByXPath(editText_passWord_xpath, password, 15);
            //點選登入
            myClick.clickElementByName(botton_login_name, 15);
    

            。。。操作步驟省略了,作者使壞中,其實作者希望大家可以自己動手少一些複製黏貼,作者還是很偉大的不會嗎。

            ciicLog.logger.info("【微信公眾號入口】初始化成功");
            //
            return true;
            
        } catch (Exception e) {
            
            ciicLog.logger.error("【微信公眾號入口】初始化失敗" + e.toString());
            e.printStackTrace();
            return false;
            
        }

    }

}

CASE_INIT========================================================================

CASE_BODY 和 CASE_END 也是如此

接下來是BULID_CASE===============================================================

這個作者自認為很精髓啊~~~~~~

public class E1_MicroWelfare {
 
    public boolean caseBefore() {
        // TODO: 準備工作
        // LOG記錄
        ciicLog.log4jlogInfo("【"
                + caseName + "】準備開始");
        // 初始化Appium驅動
        driver = new Android_DriverInit().getMyAndroidDriver();
        // LOG記錄
        ciicLog.log4jlogInfo("【"
                + caseName + "】準備結束");

        if (driver == null) {

            return false;
        } else {

            return true;
        }
        
    }

    public boolean caseInit() {
        // TODO: 初始化工作
    try {
            
            OperationExcel.initReadExcel(oPf.getProperties("parameterTablePath"));
            String account=OperationExcel.readExcelByColumnName("init", "使用者名稱", 1);
            String pasword=OperationExcel.readExcelByColumnName("init","密碼",1);
            OperationExcel.endReadExcel();
            //===========================================================================
            // LOG記錄
            ciicLog.log4jlogInfo("【"
                    + caseName
                    + "】初始化開始");
            // 初始化專案入口,進入公眾號
            CaseInit myweixinInit = new CaseInit(driver);
            boolean tag=myweixinInit.execute_CaseInit_WeiXinInit(account,pasword);
            // LOG記錄
            ciicLog.log4jlogInfo("【"
                    + caseName
                    + "】初始化結束");
            
            if (tag) {

                return true;

            } else {

                return false;
            }
            
            } catch (Exception e) {
                ciicLog.log4jlogError("【" + caseName + "】用例【準備】異常"+ new Date() + e);
                e.printStackTrace();
                return false;
            }
        
    }

    public boolean caseBody() {
        // TODO: 用例體
        // LOG記錄
        ciicLog.log4jlogInfo("【"
                + caseName + "】準備開始"+new Date());

        CaseBody_MicroWelfare caseBody = new CaseBody_MicroWelfare(driver);
        boolean tag=caseBody.excuse_CaseBody();

        // LOG記錄
        ciicLog.log4jlogInfo("【"
                + caseName + "】準備結束"+new Date());

        if (tag) {

            return true;

        } else {

            return false;
        }
        
    }

    public boolean caseEnd() {
        // TODO: 收尾工作
        // LOG記錄
        ciicLog.log4jlogInfo("【"
                + caseName + "】收尾開始");
        // 退出軟體
        CaseEnd end = new CaseEnd(driver);
        boolean tag=end.execute_CaseEnd_weiXinQuit();
        // LOG記錄
        ciicLog.log4jlogInfo("【"
                + caseName + "】收尾結束");
    
        if (tag) {

            return true;

        } else {

            return false;
        }
    
    }

    public boolean caseAfter() {
        // TODO: 善後工作
        return true;
    }

}
BULID_CASE===============================================================

作者在這裡將一個用例分為了BEFORE、 INIT 、BODY 、END 、AFTER 五個階段,第一個階段放入驅動初始化,第二個階段放入專案初始化、第三個放入用例體、第四個放入用例結束操作、第五個放入收尾操作,這裡主要為了實現一種最為複雜的用例就是牽扯到資料庫校驗和用例資料需要還原的操作,作者相信作為一個高階的測試一定已經遇到過這樣的用例過,所以也就不再熬述了。

CASE_LIST=================================================================

public class CaseList extends CaseList_Abstract{

    public ArrayList<String> caseList=new ArrayList<String>();

    public void initCaseList(){
        
        caseList.add(0,"A1_PersonalCenter_myActiveity");
        caseList.add(1,"A2_PersonalCenter_myInformation");
        caseList.add(2,"A3_PersonalCenter_myWelfare");
     。。。這是作者的用例命名法則,大家可以自己約定,不必深究
    }
    
    public boolean relationCaseToRun(int index){
        
        boolean rightOrFalse=false;
               
        try {
        

            
        switch(index){
        
        case 0:

            A1_PersonalCenter_myActiveity A1=new A1_PersonalCenter_myActiveity();
            rightOrFalse=A1.runCase();
            
            if (rightOrFalse!=true){
                
                rightOrFalse=false;
     
            }
            
            
            break;
            
        case 1:
            
            A2_PersonalCenter_myInformation A2=new A2_PersonalCenter_myInformation();
            rightOrFalse=A2.runCase();
            
            if (rightOrFalse!=true){
                
                rightOrFalse=false;
     
            }
            
            
            break;
            
        case 2:
            
            A3_PersonalCenter_myWelfare A3=new A3_PersonalCenter_myWelfare();
            rightOrFalse=A3.runCase();
            
            if (rightOrFalse!=true){
                
                rightOrFalse=false;

。。。這裡類似一個工廠類,就是將用例物件全部準備好,作者喜歡叫填彈,之後麼就是biu~biu~biu~了,哈哈哈

至於如何執行用例,作者是自己寫了一個介面,將用例列表刷在一個LIST上,然後一個一個事例化用例執行,如果覺得麻煩的童鞋可以自己寫一個MAIN函式,

寫法就類似         CaseList  XXX= new    CaseList();

xxx.relationCaseToRun(1);

xxx.relationCaseToRun(2);

xxx.relationCaseToRun(3);

xxx.relationCaseToRun(4);

...一個一個排下去即可。

好啦這就是作者自己是框架想法,在下一篇,作者將針對引數化和物件化講講自己的想法。