单元测试其实分为两种:一种为纯java代码测试,一般位于test
包下;另一种为UI测试,一般位于androiTest
包下。
本篇用到的单元测试框架主要有:
Junit,Mockito,Robolectric,Espresso
一、Junit
详细资料请参考
1、添加依赖
dependencies {
testCompile "junit:junit:4.12"
}
2、创建test文件夹
app
src
main
java
com.woaikakashen
java代码
test
java
com.woaika.kashen
测试代码
3、生成对应的test类
java被测试类:Student.class
test测试类:StudentTest.class
生成方式:
通过AndroidStudio创建,选中Student.class 点击右键,选择GoTo--->Test
来快速创建单元测试方法
运行:选中测试类中的方法右键Run
方法名。
二、Mockito
详细资料请参考资料1
详细资料请参考资料2
1、介绍
用来为提供函数返回结果的模拟(mock)及对函数调用过程的验证。
关键词
mock
: 针对真实的类或者对象,创建一个模拟(代理)的对象。
stub
: 针对一个类或者对象的方法,进行模拟调用及输出。
2、添加依赖
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、常用语法
1. 打桩方法
2. 验证方法
3. 参数匹配器
4. 其他方法
三、Robolectric
详细资料请参考
1、介绍
利用Android SDK和资源来编写测试用例,并将所有的测试用例运行在java虚拟机内。不需要使用模拟器或真机来测试。
2、添加依赖
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、常用语法
四、Espresso
详细资料请参考资料1
详细资料请参考资料2
Espresso需要依赖Android设备.这将导致我们将花费更多时间在编译apk和AndroidTest apk的安装上
4.1、添加依赖
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
}
4.2、设置测试执行器
这个运行器是基于
InstrumentationTestRunner
和GoogleInstrumentationTestRunner
,运行JUnit3和JUnit4来测试你的Android应用程序。
defaultConfig {
...
testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
}
4.3、创建androidTest文件夹
app
src
main
java
com.woaikakashen
java代码
androidTest
java
com.woaikakashen
UI测试代码
test
java
com.woaika.kashen
纯测试代码
4.4、常用注解
@Rule:
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
定义一个测试规则,构造函数参数指定一个需要被测试的页面。当打开app会打开对应的页面执行所定义的测试用例。
@Test:
用来定义一个测试用例
4.5、常用语法
1、访问UI元素
onView()
方法来访问UI元素,withId()
进行id访问,使用withText()
进行文本匹配,然后在执行相应的动作,最后在验证
eg:
//验证id为tvLoanBig的text内容是否为极速大额贷
onView(withId(R.id.tvLoanBig)).check(matches(withText("极速大额贷")));
2、AdapterView
onData
方法来获取DataInteraction
对象,然后在来访问目标元素。Espresso处理加载目标元素到当前层次结构。
3、执行动作
调用
ViewInteraction.perform()
和DataInteraction.perform()
。可以指定一个或者多个动作,Espresso会按照指定的顺序,依次发送动作事件,这些动作是线程安全的.
ViewActions
可以提供一些列常用的方法,我们可以利用写方法来操作UI元素。
- ViewActions.click(): 点击事件
- ViewActions.typeText(): 输入指定的文字内容
- ViewActions.scrollTo(): 滑动
- ViewActions.pressKey(): 按下按键
- ViewActions.clearText(): 清空文本
4、校验结果
调用
ViewInteraction.check()
和DataInteraction.check()
方法,可以判断UI元素的状态,如果断言失败,会抛出AssertionFailedError
异常。
比如:
-
doesNotExist
: 断言某一个view不存在 -
matches
: 断言某个view存在,且符合一列的匹配 -
selectedDescendentsMatch
:断言指定的子元素存在,且他们的状态符合一些列的匹配
4.6、Espresso 自动化测试- RecyclerView
从测试的角度上来看
RecyclerView
不是一个AdapterView
,这意味着你不能使用onData()
去跟你的list items
交互。
1、添加对应的库
dependencies {
// ...
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0');
}
但是这样子的话。gradle就会出现报错了,出现一些依赖关系的冲突,所以我们需要去除一些重复的依赖关系。
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、常用语法
主要用到RecyclerViewActions类
2.1 actionOnItemAtPosition
//点击position为5的item
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItemAtPosition(5, click()));
2.2 actionOnItem
//点击带有 "百度有钱花" 字符串的item
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("百度有钱花")), click()));
hasDescendant
指代的是对应的item的后代中有包含对应文本的内容的.不过使用这个需要小心 因为很有可能会出现两个同样内容的
2.3 scrollToPosition
//滚动到position为5的位置
onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.scrollToPosition(5));
4.7、Espresso 自动化测试- 异步代码测试
由于成本过高,需要大量代码,而且需要实现idlingResource
接口,请查阅:
详细请参考资料
//Espresso的IdlingResource异步接口依赖:
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'
}
最后,希望此篇博客对大家有所帮助,欢迎提出问题及建议共同探讨,如有兴趣可以关注我的博客,谢谢!