Android Studio单元测试的编码过程
前言
本次单元测试过程中遇到了很多很多很多很多问题,技术更新迭代速度实在是太快了,网上搜到的很多东西都过时了,这里找到了一个五年前印度小哥的教学录屏[1]......本来英语不好的我听着蹩脚的印度英语,实在是折磨QAQ....
不过总体上按照他的步骤是可行的,期间遇到的各种问题也用过搜索解决了,最终磕磕绊绊完成了简单的单元测试编写。于是有了这篇技术总结。
设置测试环境
在测试开始前,首先添加 AndroidX Test API[2],以及为项目配置 Android 测试依赖项。
最终的在应用的顶级 build.gradle 文件中,依赖项如下:
dependencies {
androidTestImplementation "org.mockito:mockito-core:2.18.0"
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
}
同时确保
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
使用Android Studio生成测试类
- 鼠标标记要生成的类,按Alt+Enter,选择第一个。
- 在创建测试类窗口中,测试库我们选择JUnit4。类名可以自定义,建议不要改。父类不选,目标包就是项目包名,勾选setUp和tearDown。最后在要测试的方法前打勾。点击OK。
- 随即弹出窗口提示我们选择测试类类型,我们选Android的测试类。
由此我们得到了一个测试类,按Shift+Ctrl+T可在测试类与Activity间切换,这里创建rule并实例化。
@Rule public ActivityTestRule<FirstActivity> mainActivityActivityTestRule = new ActivityTestRule<FirstActivity>(FirstActivity.class); private FirstActivity firstActivity = null; @Before public void setUp() throws Exception { firstActivity = mainActivityActivityTestRule.getActivity(); }
这样我们就可以通过实例化的rule来获取页面元素。
a Simple Example: 测试文本是否为空。- UT代码:
TextView t = firstActivity.findViewById(R.id.textView10); assertNull(t.getText());
- 鼠标标记要生成的类,按Alt+Enter,选择第一个。
2. 点击测试方法左边的绿三角即可开始测试。
![image-20210813060836192.png][4]
以我的程序为例,来测试LED小灯的点亮功能。
@Test public void light() { firstActivity.power = true; TextView[] leds = {firstActivity.findViewById(R.id.textView4), firstActivity.findViewById(R.id.textView6), firstActivity.findViewById(R.id.textView5), firstActivity.findViewById(R.id.textView7)}; int[] ledStatus = {1, 1, 0, 0}; final Drawable.ConstantState drawable = leds[0].getBackground().getConstantState(); final Drawable.ConstantState drawable2 = leds[1].getBackground().getConstantState(); firstActivity.light(ledStatus,leds); final Drawable.ConstantState drawable1 = leds[0].getBackground().getConstantState(); final Drawable.ConstantState drawable3 = leds[1].getBackground().getConstantState(); assertEquals(drawable,drawable1); assertNotEquals(drawable2,drawable3); }
我的Activity部分。
public void light(int[] b, TextView[] t) {
for (int i = 0; i < 4; i++) {
switch (i) {
case 0:
if (b[i]==1) {
if (power) {
t[i].setBackgroundResource(R.drawable.lightred);
}
} else if (b[i]==-1){
break;
}else {
t[i].setBackgroundResource(R.drawable.light);
}
;
break;
case 1:
if (b[i]==1) {
if (power) {
t[i].setBackgroundResource(R.drawable.lightgreen);
}
} else if (b[i]==-1){
break;
} else {
t[i].setBackgroundResource(R.drawable.light);
}
;
break;
case 2:
if (b[i]==1) {
if (power) {
t[i].setBackgroundResource(R.drawable.lightblue);
}
} else if (b[i]==-1){
break;
} else {
t[i].setBackgroundResource(R.drawable.light);
}
;
break;
case 3:
if (b[i]==1) {
if (power) {
t[i].setBackgroundResource(R.drawable.lightup);
}
} else if (b[i]==-1){
break;
} else {
t[i].setBackgroundResource(R.drawable.light);
}
;
break;
default:
break;
}
}
}
- 点击测试类左边的双绿三角可开始测试类中全部测试方法的测试。
我的测试结果:
参考文献
- Android app development for beginners - 26 - Android - Unit test for Activity - Activity Test Rule: https://www.youtube.com/watch?v=_TR6QcRozAg
- Set up project for AndroidX Test: https://developer.android.com/training/testing/set-up-project
- Build instrumented unit tests: https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests#java
- Android单元测试(二):Mockito框架的使用: https://blog.csdn.net/qq_17766199/article/details/78450007
- Q&A on stackoverflow: https://stackoverflow.com/questions/13621407/getting-the-current-background-id-of-a-view
- Android单元测试-对Activity的测试: https://blog.csdn.net/Double2hao/article/details/77160950
赞