Android单元测试: 首先,从是什么开始
作者:邹小创 发布时间:[ 2016/6/3 10:58:05 ] 推荐标签:单元测试 Android
这是一系列安卓单元测试的文章,目测主要会cover以下的主题:
1、什么是单元测试
2、为什么要做单元测试
3、JUnit
4、Mockito
5、Robolectric
6、Dagger2
7、一个具体的app例子实践
8、神秘的bonus
什么是单元测试
首先需要介绍一下什么是单元测试。很多人像我一样,本科并不是计算机专业出身的,如果在职的公司不要求做单元测试的话,可能对这个词并没有一个确切的概念。而即使是计算机专业出身,如果毕业以后写的不多的话,可能对这个词的含义也不是很清楚。从名字上看,单元测试是为了测试某一个代码单元而写的测试代码。但是什么叫“一个代码单元”呢?是一个模块、还是一个类、还是一个方法(函数)呢?不同的人、不同的语言,都有不同的理解。一般的定义,尤其是是在OOP领域,是一个类的一个方法。在此,我们也这样理解:单元测试,是为了测试某一个类的某一个方法能否正常工作,而写的测试代码。我们举一个例子说明一下,假如你有一个类,定义如下:
public class Calculator {
public int add(int one, int another) {
//为了简单起见,暂不考虑溢出等情况。
return one + another;
}
}
那么为了测试这个 Calculator 类的 add() 方法,我们可以写如下的单元测试代码:
public class CalculatorTest {
public void testAdd() throws Exception {
Calculator calculator = new Calculator();
int sum = calculator.add(1, 2);
Assert.assertEquals(3, sum);
}
}
这里的 CalculatorTest 是 Calculator 对应的测试类。而这里的 testAdd() 是 add() 这个方法对应的测试方法。所以,写单元测试,是给你的每个类的每个public方法写对于的测试方法。非public方法我们一般是不测试的,虽然可以通过反射等手段去做,但是一般看来,非public方法是这个类的实现细节,我们并不关心,我们只关心某一个public方法的输入、输出。
一般来说,一个方法对应的测试方法主要分为3部分,以上面的测试方法为例:
Calculator calculator = new Calculator();
int sum = calculator.add(1, 2);
Assert.assertEquals(3, sum);
一般来说,我们写单元测试,会用到一些单元测试框架。常见的Java单元测试框架有 JUnit 、 TestNG 等等。在这个系列的文章中,我采用JUnit 4,这也是用的多的一个测试框架。上面的第三部, Assert.assertEquals(3, sum); 用的是JUnit里面的验证结果的方法,常见的是调用 Assert 类的一些assert方法。除了上面用到的 assertEquals ,还有 assertTrue , assertNotNull 等等。关于JUnit,我会在后面的系列文章中专门介绍。
如何在一个android project里面运行单元测试
我们知道,在一个android gradle project中,源代码默认是放在src/main/java下面的。而对应的单元测试代码则是放在src/test/java下面的,如下图所示:
其中的package name可以随意定,很多人喜欢跟src package name保持一致,我个人习惯在后加上.test后缀,因为AndroidStudio太智能了,经常我需要重命名单元测试的package的时候,AndroidStudio会把src的package也给重命名了。
打开 CalculatorTest ,用鼠标右键点击 testAdd() 方法,选择Run testAdd(), 如下图所示:
从图中你可以看出,你可以按快捷键 Ctrl+Shift+R 快速运行,当然,这要求你的光标当前焦点是在这个方法内部的。如果你的焦点是在类内部,而不在某一个测试方法内部,那么 Ctrl+Shift+R 将运行这个测试类的所有测试方法。当然,你也可以通过右键点击测试类名来运行这个测试类里面的所有测试方法。
运行结束以后,你会在底部的“Run”这个tab看到运行的结果,如下图所示:
除了在AndroidStudio里面运行,你还可以在命令行通过 gradle testDebugUnitTest ,或者是 gradle testReleaseUnitTest ,分别运行debug和release版本的unit testing,这种方式可以一次性运行所有测试类的所有测试方法。 这种方式的运行结果如下图所示:
每个test case的报告可以在project_root/app/build/reports/tests/debug/index.html 这个xml里面看到。大致如下图:
这篇文章的代码在 github 上,感兴趣的可以clone下来自己试试。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11