一个待测试页面对应多个业务单元,每一个业务单元对应一个测试用例,每一个测试用例都是一条链路(好比点击一个按钮后产生的一系列直接影响如页面跳转等),实现条件覆盖和路径覆盖。
在Android单元测试中,测试用例不须要覆盖全部的方法逻辑(这也是不太现实的),应该专一于本身编写的业务逻辑等代码的测试覆盖,像 Android SDK 里的方法回调是不须要测试的。html
编写单元测试时调用这个方法,验证返回值是否符合预期android
调用该方法,而后验证方法改变的对象的(属性||状态)是否符合预期git
调用该方法,而后验证其行为,好比按钮的点击事件,验证是否弹出Toast、是否有弹框、是否有页面跳转等浏览器
JUnit
断言Mockito
mock数据,数据解耦Robolectric
在JVM上运行单测,不须要模拟器or真机Jacoco
统计测试覆盖率,便于补充完善单测Robolectric
,由于它直接运行于JVM之上,运行单测时速度更快,不须要准备Android环境,不用使用真机||Android模拟器运行测试。当须要进行依赖解耦时,可使用Mock框架app/src/test
目录下app/build.gradle
中引入dependencies {
XXXXXX
testCompile 'junit:junit:4.10'
testCompile 'org.robolectric:robolectric:3.2.2'
testCompile 'org.robolectric:shadows-multidex:3.2.2'
XXXXXX
}
复制代码
app/build.gradle
中引入dependencies {
XXXXXX
testCompile "org.mockito:mockito-core:1.+"
XXXXXX
}
复制代码
app/build.gradle
中引入apply from: 'http://git.caimi-inc.com/client/jacoco-plugin/raw/master/jacoco-plugin.gradle'
复制代码
docs/单元测试
下:好比是WacaiLoginActivity
页面的单测,则文档名为WacaiLoginActivity用例列表
./gradlew jacocoTestReport
app/build/reports/jacoco
生成详细的覆盖率报告,使用浏览器打开index.html
便可查看APP_VERSION
表示当前应用的版本号versionCode
为了介绍单元测试的实施过程,下面以挖财宝挖财帐号登陆页做为单元测试实践案例。该案例的开发和测试涉及到了TextView, EditText, Button, Checkbox, ImageView,包含了各类点击、页面跳转等逻辑。页面以下图所示bash
对页面进行单元测试的时候,咱们首先须要分析页面,针对页面提取出业务逻辑,提取出的业务逻辑如上图所示。根据这些逻辑来设计单元测试的case(带有Test注解的被测试方法),业务逻辑包括需求中的业务以及其余的须要维护的代码逻辑。为了减小单元测试case的维护成本,业务流程不容许跨页面,以页面为基本单位。架构
挖财帐号登陆页的单元测试case设计以下:app
目标页面 | 业务覆盖 | 界面元素 | 逻辑描述 | 最小断言数 | case名称 |
---|---|---|---|---|---|
挖财帐号登陆页 WacaiLoginActivity | 点击左上角返回 | 1. 左上角TextView控件 | 1. 点击左上角TextView控件,关闭结束登陆页 | 1 | testGoBack |
输入帐号、密码 | 1. 帐号输入框(手机/邮箱/帐号) 2. 帐号输入框右侧清空图标ImageView 3. 密码输入框EditText 4. 密码输入框右侧隐藏密码图标ImageView |
1. 向帐号输入框输入内容 2. 向密码输入框输入内容 3. 当帐号输入框没有内容时,帐号输入框右侧清空图标ImageView隐藏 4. 当帐号输入框有内容时,帐号输入框右侧清空图标ImageView显示 5. 当密码输入框没有内容时,隐藏密码图标隐藏 6. 当密码输入框有内容时,隐藏密码图标显示 7. 点击清空图标,帐号输入框文本清空 8. 点击隐藏密码图标,密码输入框文本清空 |
6 | testInputAccountAndPassword | |
点击登陆 | 1. 登陆按钮 2. 帐号输入框 3. 密码输入框 |
1. 点击登陆按钮 2. 帐号密码输入框为空,则弹出Toast,页面不跳转 3. 帐号不为空,密码为空,弹出Toast,页面不跳转 4. 帐号密码均不为空,正常登陆逻辑 |
4 | testLogin | |
自动填充上次登陆用户的用户名 | 1. 帐号输入框 2. 密码输入框 | 当用户曾经登陆过期,进入页面会自动在帐号输入框填充上一次登陆成功用户的用户名: 1. 填充帐号输入框 2. 填充以后,密码输入框得到焦点 |
2 | testPastePreAccount | |
直接点击跳转 | 1. 右上角注册TextView控件 2. 忘记密码TextView控件 3. 挖财平台注册协议TextView控件 4. 挖财隐私权政策TextView控件 |
1. 点击注册跳转到手机号注册登陆页面 2. 点击忘记密码跳转到找回密码页面 3. 点击挖财平台注册协议或者挖财隐私权政策,跳转到对应的WebView |
4 | testJumpDirectly | |
点击切换是否赞成挖财注册协议 | 1. 赞成挖财注册协议Checkbox勾选框 2. 登陆按钮 |
1. 勾选赞成挖财注册协议,则登陆按钮可点击;不然不可点击 2. 进入页面时默认勾选赞成挖财注册协议 |
3 | testAgreeRegisterProtocol |
接下来须要在单元测试的工程中实现上述case。最小断言数是从业务逻辑考虑的一个数值,并非代码的边界条件,真实的case须要考虑代码的各类边界状况,好比空指针等,所以,通常实际断言数会大于最小断言数。实际断言数=最小断言数(业务需求断言)+技术需求断言。框架
写完case以后须要跑一遍单测获得单测报告,根据单测报告不断完善单测,提升单测覆盖率。ide
Activity
中,那么,你最须要的可能不是单测,而是对项目的重构,各个模块进行解耦、UI和逻辑解耦等以上就是文档式单测
的内容,目前正在实践之工具