Page Object 模式編寫UiAutomator腳本

在咱們學習Page Object Model以前,咱們先了解一下Page Object Model(如下簡稱POM).java

爲何要POM

用UiAutomator啓動UI自動化測試不是一件困難的任務。你只須要查找元素,對元素操做就能夠了。來看一個登陸APP的簡單的腳本。android

 1 package com.gqou.testdemo;
 2 
 3 import android.support.test.InstrumentationRegistry;
 4 import android.support.test.runner.AndroidJUnit4;
 5 import android.support.test.uiautomator.UiDevice;
 6 import android.support.test.uiautomator.UiObject;
 7 import android.support.test.uiautomator.UiSelector;
 8 
 9 import org.junit.Test;
10 import org.junit.runner.RunWith;
11 
12 import static junit.framework.TestCase.assertEquals;
13 
14 /**
15  * Created by guangqian on 2016/4/22.
16  */
17 @RunWith(AndroidJUnit4.class)
18 public class SimpleTest {
19 
20 @Test
21     public void 測試登陸成功() throws Exception{
22 //        查找圖標並點擊啓動app
23         UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
24         uiDevice.findObject(new UiSelector().text("TestDemo")).clickAndWaitForNewWindow();
25 //        輸入用戶名,密碼並點擊Login
26        UiObject usernameObj = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/name_txt"));
27         UiObject pwdObj = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/pwd_txt"));
28         UiObject loginBtn = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/login_btn"));
29         UiObject welcomeTip = uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/welcome_tip"));
30 
31         usernameObj.click();
32         usernameObj.setText("username");
33         pwdObj.click();
34         pwdObj.setText("password");
35 
36         loginBtn.clickAndWaitForNewWindow();
37 
38 //        校驗登陸成功信息
39         assertEquals("congratulations", welcomeTip.getText());
40     }
41 }
View Code

 

你能夠看到,咱們所作的就是查找元素併爲那些元素填值,點擊等操做。
這是一個比較簡單的腳本,腳本維護看起來也很容易。可是隨着時間增加,你會編寫更多的腳本代碼,維護也會變得愈來愈困難。
腳本維護的主要面臨的問題就是:好比有10份腳本使用同一個界面元素,一旦界面元素髮生了變化,你須要更改10份腳本。這不只浪費時間並且還很容易出錯。
本文介紹的腳本維護比較好的方法就是針對元素的查找,操做等操做來建立一個獨立的類文件。這個類文件能夠被使用那些元素的全部腳本重用。未來若是界面元素髮生變化,只須要修改一份類文件就能夠了,不須要再去修改10份腳本文件。
這個方法就叫作Page Object Model。它可讓咱們的代碼更加易於閱讀,維護和重用。
   

什麼是POM

1. Page Object Model是一種設計模式,爲界面對象建立一個對象庫
2. 在這個模式下,應用的每個界面都應該有一個相應的界面類
3. 界面類會查找界面的元素也包含對元素操做的方法
4. 方法的命名應該根據它的行爲來命名,例如:若是程序等待支付網關出如今界面上,方法應該被命名相似waitForPaymentScreenDisplay().
 

POM的優勢

1. POM意味着對界面上的元素的操做從原來的測試用例代碼中分離出來,這樣使咱們的代碼清晰而且易於理解。
2. 第二個好處是對象庫是獨立的。所以咱們能夠經過不一樣的工具使用相同的對象庫來達到不一樣的目的。好比:咱們能夠集成TestNG/JUnit來作功能測試,同時也可使用JBehave/Cucumber作驗收測試。
3. 因爲方法的可重用,咱們的代碼會變得更少,有效性更高。
4. 方法能真實的映射出用戶在界面上的操做行爲,好比:點擊過按鈕以後並跳到主界面,方法名就會相似"gotoHomePage".
 

怎麼實現POM

POM的基本結構是應用的全部元素和元素的操做方法都被封裝在一個類文件中,測試用例代碼只須要調用這個類文件中的方法便可。
 

完整的例子:

 
第一步:打開應用app
第二步:輸入用戶名,密碼,點擊Login
第三步: 驗證登陸成功
 
有兩個界面:登陸界面,歡迎界面,因此咱們要建立兩個界面的類文件LoginActivity,WelcomeActivity
 

LoginActivity.java

 1 package com.gqou.testdemo.pages;
 2 
 3 import android.support.test.uiautomator.UiDevice;
 4 import android.support.test.uiautomator.UiObject;
 5 import android.support.test.uiautomator.UiSelector;
 6 
 7 /**
 8  * Created by guangqian on 2016/4/22.
 9  */
10 public class LoginActivity {
11 
12     UiDevice uiDevice;
13     UiObject mUserName;
14     UiObject mPasswd;
15     UiObject mLogin;
16 
17     public LoginActivity(UiDevice uiDevice){
18         this.uiDevice = uiDevice;
19         mUserName = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/name_txt"));
20         mPasswd = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/pwd_txt"));
21         mLogin = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/login_btn"));
22     }
23 
24     /**
25      * 輸入用戶名
26      * @param userName
27      * @throws Exception
28      */
29     private void setmUserName(String userName) throws Exception{
30         mUserName.click();
31         mUserName.setText(userName);
32     }
33 
34     /**
35      * 輸入密碼
36      * @param pwd
37      * @throws Exception
38      */
39     private void setmPasswd(String pwd) throws Exception{
40         mPasswd.click();
41         mPasswd.setText(pwd);
42     }
43 
44     /**
45      * 點擊登陸按鈕
46      * @throws Exception
47      */
48     private void clickLogin()throws Exception{
49         mLogin.clickAndWaitForNewWindow();
50     }
51 
52     /**
53      * 封裝登陸App操做
54      * @param username
55      * @param pwd
56      * @throws Exception
57      */
58     public void loginApp(String username, String pwd) throws Exception{
59         this.setmUserName(username);
60         this.setmPasswd(pwd);
61         this.clickLogin();
62     }
63 }
View Code

WelcomeActivity.java

 1 package com.gqou.testdemo.pages;
 2 
 3 import android.support.test.uiautomator.UiDevice;
 4 import android.support.test.uiautomator.UiObject;
 5 import android.support.test.uiautomator.UiSelector;
 6 
 7 /**
 8  * Created by guangqian on 2016/4/22.
 9  */
10 public class WelcomeActivity {
11     UiDevice uiDevice;
12     UiObject welcomeTip;
13 
14     public WelcomeActivity(UiDevice uiDevice){
15         this.uiDevice = uiDevice;
16         welcomeTip = this.uiDevice.findObject(new UiSelector().resourceId("com.gqou.testdemo:id/welcome_tip"));
17     }
18 
19     /**
20      * 獲取歡迎提示語內容
21      * @return
22      * @throws Exception
23      */
24     public String getWelcomeTip() throws Exception{
25         return welcomeTip.getText();
26     }
27 
28 }
View Code

POMForLoginTest.java

 1 package com.gqou.testdemo.testcases;
 2 
 3 import android.support.test.InstrumentationRegistry;
 4 import android.support.test.runner.AndroidJUnit4;
 5 import android.support.test.uiautomator.UiDevice;
 6 import android.support.test.uiautomator.UiSelector;
 7 
 8 import com.gqou.testdemo.pages.LoginActivity;
 9 import com.gqou.testdemo.pages.WelcomeActivity;
10 
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.junit.runner.RunWith;
14 
15 import static junit.framework.TestCase.assertEquals;
16 /**
17  * Created by guangqian on 2016/4/22.
18  */
19 @RunWith(AndroidJUnit4.class)
20 public class POMForLoginTest {
21 
22     public static UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
23     private static LoginActivity objLogin;
24     private static WelcomeActivity objWelcome;
25 
26 
27     @Before
28     public void setUp() throws Exception {
29 //        打開應用
30         uiDevice.findObject(new UiSelector().text("TestDemo")).clickAndWaitForNewWindow();
31 //        建立界面實例對象
32         objLogin = new LoginActivity(uiDevice);
33         objWelcome = new WelcomeActivity(uiDevice);
34 
35     }
36 
37 
38 
39     @Test
40     public void 測試App登陸成功() throws Exception {
41 //        登陸app
42         objLogin.loginApp("Tom", "123456");
43 //        獲取主界面提示語
44         String tips = objWelcome.getWelcomeTip();
45 //        判斷提示語是否爲預期
46         assertEquals("congratulations", tips);
47     }
48 }
View Code

 

 

 Good Luck!設計模式

水平有限,歡迎各位大牛點評,多謝支持!app

相關文章
相關標籤/搜索