摘要:開(kāi)始的開(kāi)始最近在做上的自動(dòng)化測(cè)試,從最初的第三方自動(dòng)化測(cè)試框架到后來(lái)的,再到最終完成答疑君客戶(hù)端一些核心流程的自動(dòng)化測(cè)試,期間也是經(jīng)歷了各種大大小小的坑。
開(kāi)始的開(kāi)始
最近在做Android上的自動(dòng)化測(cè)試,從最初的第三方自動(dòng)化測(cè)試框架appium到后來(lái)的Android Support Testing Library,再到最終完成答疑君Android客戶(hù)端一些核心流程的自動(dòng)化測(cè)試,期間也是經(jīng)歷了各種大大小小的坑。這個(gè)系列的文章也是想通過(guò)描述整個(gè)探索道路來(lái)記錄一下整個(gè)Android自動(dòng)化測(cè)試的入門(mén)過(guò)程,同時(shí)也采用了我自己所喜歡的step by step的模式來(lái)介紹整個(gè)流程,以便大家可以很快地操作起來(lái)。
但是,在開(kāi)始的開(kāi)始,我認(rèn)為每一種語(yǔ)言或者特性可能在不同的環(huán)境中都有不同的實(shí)現(xiàn)方式,所以有必要在此貼上我的一些開(kāi)發(fā)環(huán)境以作參考:
IDE: Android Studio
Android SDK: API Level 23
gradle version: 2.8
build tool version: 23.0.2
測(cè)試環(huán)境:真機(jī)(Nexus 6 with Android 6.0.1; MIUI phones若干)
曾經(jīng)和gemini聊到機(jī)器人統(tǒng)治地球的問(wèn)題(這好像是異教徒們的愿景orz...),后來(lái)想了想自動(dòng)化測(cè)試這個(gè)東西其實(shí)也是,讓機(jī)器去模仿人的行為,讓它自己去統(tǒng)治整個(gè)測(cè)試工作。既然是去模仿人的行為,那實(shí)際上也應(yīng)該認(rèn)為機(jī)器只能理解人所能理解的東西。比方說(shuō),當(dāng)我去人為地做一些測(cè)試的時(shí)候,我所期待的只是UI上的變化可以符合我的預(yù)期,至于它背后的數(shù)據(jù)是怎樣的實(shí)際上我并不care。因此,在做自動(dòng)化測(cè)試時(shí)我個(gè)人有個(gè)最基本的思路:
把自己當(dāng)成用戶(hù),只關(guān)注我能看到的東西。Start from Gradle
好了!終于可以開(kāi)始了!既然是采用Gradle進(jìn)行Android工程的構(gòu)建,那自然是少不了Gradle的配置啦!根據(jù)Gradle官方文檔的說(shuō)明,我們首先需要在我們工程的build.gradle中添加如下配置:
android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } }
這里實(shí)際上只做了一件事情,就是為我們的工程指定一個(gè)TestInstrumentationRunner,TestInstrumentationRunner是用來(lái)跑我們所寫(xiě)的所有的測(cè)試用例的。當(dāng)我們采用test的模式來(lái)構(gòu)建工程時(shí),這個(gè)Runner便會(huì)自動(dòng)為我們執(zhí)行所有的的測(cè)試用例,并且返回相應(yīng)的測(cè)試結(jié)果。
另外,我們還需要在build.gradle中增加instrumentation testing所需要的依賴(lài):
dependencies { androidTestCompile "com.android.support:support-annotations:23.1.1" androidTestCompile "com.android.support.test:runner:0.4.1" androidTestCompile "com.android.support.test:rules:0.4.1" }Where am I?
好了!我們現(xiàn)在有工具來(lái)跑測(cè)試了,接下來(lái)只要添加我們的測(cè)試用例了!于是問(wèn)題來(lái)了,我們應(yīng)該在哪里添加測(cè)試用例呢?
如果你在Android Studio中新建一個(gè)工程,會(huì)發(fā)現(xiàn)在src目錄下,和main平行的還有一個(gè)androidTest目錄。一般而言,我們將工程代碼放在src/main/java目錄下,將與之相關(guān)的測(cè)試代碼放在src/androidTest/java目錄下。如下所示:
src/ androidTest/java ----這里存放instrumentation test相關(guān)的代碼 main/java ----這里存放工程代碼
同時(shí),為了讓工程更容易維護(hù),建議將相應(yīng)Class的測(cè)試代碼放到相同名稱(chēng)的包下面,比如,在Package-name下面有一個(gè)Class A:
src/main/java/package-name/A.java
那么,建議將A的測(cè)試類(lèi)放到androidTest下面對(duì)應(yīng)的路徑下:
src/androidTest/java/package-name/ATest.java可以Say Hello了!
好了!我要開(kāi)始變身了!下面我們要向testing的世界say hello了!
我在package-name/module/main包下面有一個(gè)AppStartActivity,作為答疑君的啟動(dòng)頁(yè)。在這個(gè)啟動(dòng)頁(yè)上會(huì)顯示一段文字,我希望通過(guò)自動(dòng)化測(cè)試來(lái)確認(rèn)這個(gè)文字確實(shí)顯示在了屏幕上。
于是,我應(yīng)該在androidTest/package-name/module/main下面創(chuàng)建一個(gè)AppStartActivityTest類(lèi),鍵入如下代碼:
package im.dayi.app.student.module.main; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.ActivityInstrumentationTestCase2; import android.widget.TextView; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * Test for AppStartActivity * Created by Anchorer on 2016/1/13. */ @RunWith(AndroidJUnit4.class) public class AppStartActivityTest extends ActivityInstrumentationTestCase2{ private AppStartActivity mActivity; private TextView mContentView; public AppStartActivityTest() { // 所有的ActivityInstrumentationTestCase2子類(lèi)都需要調(diào)用該父類(lèi)的super(String)構(gòu)造方法 super(AppStartActivity.class); } @Before public void setUp() throws Exception { super.setUp(); // @Before注解表示在執(zhí)行所有的testCase之前要做的事情 injectInstrumentation(InstrumentationRegistry.getInstrumentation()); // getActivity()方法會(huì)在開(kāi)始所有的testCase之前啟動(dòng)相應(yīng)的Activity mActivity = getActivity(); // findViewById()很熟悉吧?找到我要測(cè)試的控件 mContentView = (TextView) mActivity.findViewById(R.id.welcome_content); } @Test public void testPreconditions() { // @Test注解表示一個(gè)測(cè)試用例方法 assertNotNull("AppStartActivity is null", mActivity); } @Test public void testContentDisplayed() { // 這里就是我們測(cè)試的目標(biāo),判斷目標(biāo)控件的text不為空 String content = mContentView.getText().toString(); assertNotNull("AppStartActivity Content is Null", content); } }
相關(guān)代碼的說(shuō)明請(qǐng)見(jiàn)注釋。
接下來(lái),我要開(kāi)始跑這個(gè)測(cè)試用例了。首先,打開(kāi)Android Studio的Build variants窗口,將Test Artifact設(shè)為Android Instrumentation Tests,然后Synchronize一下工程,會(huì)看到androidTest路徑下的背景顏色變成了綠色。
此時(shí),在AppStartActivityTest.java點(diǎn)擊菜單,選擇Run "AppStartActivityTest...",就可以從控制臺(tái)看到測(cè)試已經(jīng)在跑了:
從控制臺(tái)的日志來(lái)看,整個(gè)測(cè)試過(guò)程初期,會(huì)向測(cè)試設(shè)備安裝兩個(gè)APK:APP APK和test APK。整個(gè)測(cè)試結(jié)束之后,會(huì)看到測(cè)試結(jié)果:
以上測(cè)試結(jié)果說(shuō)明,所有test case全部測(cè)試通過(guò)。
好了!這就是整個(gè)自動(dòng)化測(cè)試的大體流程了!接下來(lái)我已經(jīng)迫不及待地想要把Android強(qiáng)大的自動(dòng)化測(cè)試提供的特性分享出來(lái)了!!
附錄Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(1) Hello Testing!
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(2) Testing APIs
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(3) Espresso入門(mén)
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(4) uiautomatorviewer
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(5) AdapterView的測(cè)試
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(6) 會(huì)玩的Espresso
Android自動(dòng)化測(cè)試-從入門(mén)到入門(mén)(7) UI Automator
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/65387.html
摘要:標(biāo)識(shí)一個(gè)測(cè)試方法。附錄自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)的測(cè)試自動(dòng)化測(cè)試從入門(mén)到入門(mén)會(huì)玩的自動(dòng)化測(cè)試從入門(mén)到入門(mén) 根據(jù)該系列文章的第一篇:Hello Testing,大家已經(jīng)對(duì)整個(gè)自動(dòng)化測(cè)試運(yùn)行流程有了一個(gè)基本的了解,接下來(lái)我們?cè)摷芯﹃P(guān)注具體的腳本實(shí)現(xiàn)了!在具體實(shí)現(xiàn)之前,我們先來(lái)了解一下Android提...
摘要:附錄自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)自動(dòng)化測(cè)試從入門(mén)到入門(mén)的測(cè)試自動(dòng)化測(cè)試從入門(mén)到入門(mén)會(huì)玩的自動(dòng)化測(cè)試從入門(mén)到入門(mén) 之前的文章中,我們介紹了Android自動(dòng)化測(cè)試的一些背景,以及Espresso的基本應(yīng)用。除了之前介紹過(guò)的Espresso的相關(guān)用法,Espresso還提供了一些其他的用法,可以讓我們?cè)诓煌瑘?chǎng)景下靈活使用。這篇...
閱讀 936·2021-09-22 16:01
閱讀 2201·2021-08-20 09:37
閱讀 1787·2019-08-30 15:54
閱讀 1774·2019-08-30 15:44
閱讀 1012·2019-08-28 18:23
閱讀 3087·2019-08-26 12:17
閱讀 1154·2019-08-26 11:56
閱讀 1610·2019-08-23 16:20