單元測(cè)試其實(shí)分為兩種:一種為純java代碼測(cè)試,一般位于test
包下稀拐;另一種為UI測(cè)試火邓,一般位于androiTest
包下。
本篇用到的單元測(cè)試框架主要有:
Junit钩蚊,Mockito贡翘,Robolectric,Espresso
一砰逻、Junit
1鸣驱、添加依賴(lài)
dependencies {
testCompile "junit:junit:4.12"
}
2、創(chuàng)建test文件夾
app
src
main
java
com.woaikakashen
java代碼
test
java
com.woaika.kashen
測(cè)試代碼
3蝠咆、生成對(duì)應(yīng)的test類(lèi)
java被測(cè)試類(lèi):Student.class
test測(cè)試類(lèi):StudentTest.class
生成方式:
通過(guò)AndroidStudio創(chuàng)建踊东,選中Student.class 點(diǎn)擊右鍵,選擇GoTo--->Test
來(lái)快速創(chuàng)建單元測(cè)試方法
運(yùn)行:選中測(cè)試類(lèi)中的方法右鍵Run
方法名刚操。
二闸翅、Mockito
詳細(xì)資料請(qǐng)參考資料1
詳細(xì)資料請(qǐng)參考資料2
1、介紹
用來(lái)為提供函數(shù)返回結(jié)果的模擬(mock)及對(duì)函數(shù)調(diào)用過(guò)程的驗(yàn)證菊霜。
關(guān)鍵詞
mock
: 針對(duì)真實(shí)的類(lèi)或者對(duì)象坚冀,創(chuàng)建一個(gè)模擬(代理)的對(duì)象。
stub
: 針對(duì)一個(gè)類(lèi)或者對(duì)象的方法鉴逞,進(jìn)行模擬調(diào)用及輸出记某。
2、添加依賴(lài)
dependencies {
testCompile "org.mockito:mockito-core:2.11.0"
}
3构捡、加載方式
方法一:
@Test
public void testIsNotNull(){
Person mPerson = mock(Person.class); //<--使用mock方法
assertNotNull(mPerson);
}
方法二:
@Mock //<--使用@Mock注解
Person mPerson;
@Before
public void setup(){
MockitoAnnotations.initMocks(this); //<--初始化
}
4液南、常用語(yǔ)法
1. 打樁方法
2. 驗(yàn)證方法
3. 參數(shù)匹配器
4. 其他方法
三、Robolectric
1勾徽、介紹
利用Android SDK和資源來(lái)編寫(xiě)測(cè)試用例滑凉,并將所有的測(cè)試用例運(yùn)行在java虛擬機(jī)內(nèi)。不需要使用模擬器或真機(jī)來(lái)測(cè)試喘帚。
2畅姊、添加依賴(lài)
dependencies {
testCompile "junit:junit:4.12"
testCompile "org.robolectric:robolectric:3.0"
}
3、注解配置TestRunner
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class SampleActivityTest {
}
4吹由、常用語(yǔ)法
四若未、Espresso
Espresso需要依賴(lài)Android設(shè)備.這將導(dǎo)致我們將花費(fèi)更多時(shí)間在編譯apk和AndroidTest apk的安裝上
4.1、添加依賴(lài)
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
}
4.2溉知、設(shè)置測(cè)試執(zhí)行器
這個(gè)運(yùn)行器是基于
InstrumentationTestRunner
和GoogleInstrumentationTestRunner
陨瘩,運(yùn)行JUnit3和JUnit4來(lái)測(cè)試你的Android應(yīng)用程序腕够。
defaultConfig {
...
testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
}
4.3、創(chuàng)建androidTest文件夾
app
src
main
java
com.woaikakashen
java代碼
androidTest
java
com.woaikakashen
UI測(cè)試代碼
test
java
com.woaika.kashen
純測(cè)試代碼
4.4舌劳、常用注解
@Rule:
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
定義一個(gè)測(cè)試規(guī)則帚湘,構(gòu)造函數(shù)參數(shù)指定一個(gè)需要被測(cè)試的頁(yè)面。當(dāng)打開(kāi)app會(huì)打開(kāi)對(duì)應(yīng)的頁(yè)面執(zhí)行所定義的測(cè)試用例甚淡。
@Test:
用來(lái)定義一個(gè)測(cè)試用例
4.5大诸、常用語(yǔ)法
1、訪問(wèn)UI元素
onView()
方法來(lái)訪問(wèn)UI元素,withId()
進(jìn)行id訪問(wèn),使用withText()
進(jìn)行文本匹配,然后在執(zhí)行相應(yīng)的動(dòng)作贯卦,最后在驗(yàn)證
eg:
//驗(yàn)證id為tvLoanBig的text內(nèi)容是否為極速大額貸
onView(withId(R.id.tvLoanBig)).check(matches(withText("極速大額貸")));
2资柔、AdapterView
onData
方法來(lái)獲取DataInteraction
對(duì)象,然后在來(lái)訪問(wèn)目標(biāo)元素撵割。Espresso處理加載目標(biāo)元素到當(dāng)前層次結(jié)構(gòu)贿堰。
3、執(zhí)行動(dòng)作
調(diào)用
ViewInteraction.perform()
和DataInteraction.perform()
啡彬「耄可以指定一個(gè)或者多個(gè)動(dòng)作,Espresso會(huì)按照指定的順序庶灿,依次發(fā)送動(dòng)作事件纵搁,這些動(dòng)作是線程安全的.
ViewActions
可以提供一些列常用的方法,我們可以利用寫(xiě)方法來(lái)操作UI元素往踢。
- ViewActions.click(): 點(diǎn)擊事件
- ViewActions.typeText(): 輸入指定的文字內(nèi)容
- ViewActions.scrollTo(): 滑動(dòng)
- ViewActions.pressKey(): 按下按鍵
- ViewActions.clearText(): 清空文本
4腾誉、校驗(yàn)結(jié)果
調(diào)用
ViewInteraction.check()
和DataInteraction.check()
方法,可以判斷UI元素的狀態(tài)峻呕,如果斷言失敗利职,會(huì)拋出AssertionFailedError
異常。
比如:
-
doesNotExist
: 斷言某一個(gè)view不存在 -
matches
: 斷言某個(gè)view存在山上,且符合一列的匹配 -
selectedDescendentsMatch
:斷言指定的子元素存在眼耀,且他們的狀態(tài)符合一些列的匹配
4.6英支、Espresso 自動(dòng)化測(cè)試- RecyclerView
從測(cè)試的角度上來(lái)看
RecyclerView
不是一個(gè)AdapterView
佩憾,這意味著你不能使用onData()
去跟你的list items
交互。
1干花、添加對(duì)應(yīng)的庫(kù)
dependencies {
// ...
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0');
}
但是這樣子的話妄帘。gradle就會(huì)出現(xiàn)報(bào)錯(cuò)了,出現(xiàn)一些依賴(lài)關(guān)系的沖突池凄,所以我們需要去除一些重復(fù)的依賴(lài)關(guān)系抡驼。
dependencies {
// ...
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') {
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
exclude module: 'recyclerview-v7'
}
}
2、常用語(yǔ)法
主要用到RecyclerViewActions類(lèi)
2.1 actionOnItemAtPosition
//點(diǎn)擊position為5的item
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItemAtPosition(5, click()));
2.2 actionOnItem
//點(diǎn)擊帶有 "百度有錢(qián)花" 字符串的item
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("百度有錢(qián)花")), click()));
hasDescendant
指代的是對(duì)應(yīng)的item的后代中有包含對(duì)應(yīng)文本的內(nèi)容的.不過(guò)使用這個(gè)需要小心 因?yàn)楹苡锌赡軙?huì)出現(xiàn)兩個(gè)同樣內(nèi)容的
2.3 scrollToPosition
//滾動(dòng)到position為5的位置
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.scrollToPosition(5));
4.7肿仑、Espresso 自動(dòng)化測(cè)試- 異步代碼測(cè)試
由于成本過(guò)高致盟,需要大量代碼碎税,而且需要實(shí)現(xiàn)idlingResource
接口,請(qǐng)查閱:
//Espresso的IdlingResource異步接口依賴(lài):
compile('com.android.support.test.espresso:espresso-idling-resource:3.0.1') {
exclude module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-idling-resource:3.0.1') {
exclude module: 'support-annotations'
}
最后馏锡,希望此篇博客對(duì)大家有所幫助雷蹂,歡迎提出問(wèn)題及建議共同探討,如有興趣可以關(guān)注我的博客杯道,謝謝匪煌!