Android UI測(cè)試框架zinc30
Zinc30是一個(gè)強(qiáng)大的Android UI自動(dòng)化測(cè)試框架,支持建立健壯、可維護(hù)的黑盒測(cè)試用例。RD或者QA能夠基于場(chǎng)景設(shè)計(jì)功能級(jí)和系統(tǒng)級(jí)測(cè)試。Zinc30符合Webdriver的 API規(guī)范,以更好地面向?qū)ο缶幊痰姆绞絹聿僮鰽ndroid控件,同時(shí)全面支持Web UI測(cè)試中流行的PageFactory模式。
項(xiàng)目地址:https://code.google.com/p/zinc30/
使 用Zinc30需要將zinc.jar包放入Android Test Project中并加入到build path之中,同時(shí)需要在AndroidManifest.xml的manifest元素下加入:
對(duì)于使用Zinc30的示例項(xiàng)目請(qǐng)?jiān)赿ownloads區(qū)下載 zinc30-sample.zip包,里面包含兩個(gè)項(xiàng)目,zinc30-sample是被測(cè)項(xiàng)目,采用mvp模式書寫;zinc30-sample- test是測(cè)試項(xiàng)目,采用PageFactory模式來書寫測(cè)試用例。兩個(gè)項(xiàng)目導(dǎo)入到eclipse即可直接運(yùn)行。
示例演示
這里以測(cè)試登陸功能為例,假如有兩個(gè)Activity,其中一個(gè)為LoginView,主要是登陸頁面,另一個(gè)為MainView,主要是登陸成功后跳轉(zhuǎn)的頁面。這里也采用PageFactory模式來書寫,先寫ActivityPage:
- public class LoginViewPage extends BaseActivityPage {
- public LoginViewPage(Zinc zinc) {
- super(zinc);
- }
- @FindBy(id = R.id.username)
- private AndroidElement usernameEdit;
- @FindBy(type = AndroidElementType.EditText, index = 1)
- private AndroidElement passwordEdit;
- @FindBy(type = AndroidElementType.Button, text = "登陸")
- private AndroidElement loginButton;
- public MainViewPage login(String username, String password) {
- usernameEdit.clear();
- usernameEdit.sendKeys(username);
- passwordEdit.clear();
- passwordEdit.sendKeys(password);
- loginButton.click();
- return new MainViewPage(zinc);
- }
- }
可以看到,這個(gè)Page頁面主要包括測(cè)試過程中需要操作的元素以及動(dòng)作,其中元素查找有3個(gè)方法:
1、根據(jù)id來查找,即自動(dòng)生成的R文件中的id值;
2、根據(jù)文本來查找,需要帶上元素類型。比如@FindBy(type = AndroidElementType.Button, text = "登陸")為查找寫有登陸文字的Button控件。如果元素類型不確定可以使用Unkown類型;
3. 根據(jù)索引來查找,需要帶上元素類型。比如@FindBy(type = AndroidElementType.EditText, index = 1)為查找第二個(gè)EditText控件。這里index以0標(biāo)識(shí)***個(gè)元素。
接下來我們來看Test Case如何來書寫,其實(shí)Test case主要組合已有的ActivityPage類:
- public class LoginViewTest extends ZincTestCase
{ - public LoginViewTest() {
- super("com.baidu.zinc30.sample", LoginView.class);
- }
- public void testLoginSuccess() {
- LoginViewPage loginViewPage = new LoginViewPage(zinc);
- MainViewPage mainViewPage = loginViewPage.login("zinc", "zinc");
- Assert.assertTrue("should login success",
- mainViewPage.isActivityPresent(MainView.class));
- }
- }
我們寫測(cè)試用例的時(shí)候需要繼承ZincTestCase,它主要完成zinc對(duì)象的初始化。雖然在Test Case這層可以使用zinc對(duì)象,但我們鼓勵(lì)將操作封裝在ActivityPage層。
總結(jié)
Zinc30是全面支持PageFactory模式的(可以參考:http://chon.techliminal.com/page_object/#/intro),因?yàn)樗?方面的優(yōu)點(diǎn):
1)減少重復(fù)代碼,將頁面狀態(tài)的改變和遷移封裝在頁面對(duì)象之中;
2)UI的變動(dòng)只會(huì)影響到相應(yīng)頁面對(duì)象而不會(huì)影響到上層的test case;
3)能夠在不同的test case中重用頁面對(duì)象。
對(duì)于某些操作不在WebDriver的API中,比如滑動(dòng)屏幕、點(diǎn)擊Listview中的某一行或者返回上一頁等操作,我們?cè)贏ctivityPage層直接zinc對(duì)象,它完全兼容Robotium的所有動(dòng)作。