Android单元测试
概述
现在国内很多开发人员都没有写单元测试的习惯,但写单元测试能减少很多不必要的麻烦。现在我们就从以下来介绍下单元测试。
一、什么是单元测试
- 单元测试是开发者编写的一小段代码,用于检验被测代码中的一个很明确的功能是否正确,其中,单元指的是测试的最小模块。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。单元测试的代码不会被编译进入APK中。
二、单元测试目标函数
- 单元测试的目标函数即测试目标,主要有三种:
1) 有明确的返回值,验证函数的返回值是否符合预期结果。
2) 这个函数只改变其对象内部的一些属性或者状态,函数本身没有返回值,就验证它所改变的属性和状态。
3) 一些函数没有返回值,也没有直接改变哪个值的状态,这就需要验证其行为,比如点击事件。
既没有返回值,也没有改变状态,又没有触发行为的函数是不可测试的,在项目中不应该存在。当存在同时具备上述多种特性时,建议采用多个case来针对每一种特性逐一验证,或者采用一个case,逐一执行目标函数并验证其影响。
三、单元测试的种类
本地测试:只能在本地计算机上运行的单元测试,这些测试在Java虚拟机(JVM)上编译运行,减少运行时间。用这种方式来运行对Android 框架没有依赖性或者有依赖但可以通过模拟对象来填充的单元测试。
仪器测试:即在Android设备或模拟器上运行的单元测试。这些测试能够获取设备的信息,使用这种方式来运行那些不能使用模拟对象容易的填充的单元测试。
四、单元测试常用类库
Junit:android单元测试框架
Robolectric:其通过一系列对底层Android元素的替换来实现对原有元素调用的模拟,从而实现脱离模拟器的测 试,在测试服务器请求时,Robolectric的数据模拟和延时发送模拟,给多线程状态下的测试提供了很好的解决方法。
Mockito:该框架可以模拟出对象来,而且本身提供了一些验证函数执行的功能。Mock构造的是一个虚拟的对象,用于解耦真实对象所需要的依赖。Mock得到的对象仅仅是具备测试对象的类型,并不是真实的对象,也就是并没有执行过真实对象的逻辑。
五、实例代码
- 下面这个列子是点击按钮后想气象局发送一个网络请求,成功后跳转显示结果;及其所对应的单元测试
- 查询天气的类QueryWeatherActivity.java
public class QueryWeatherActivity extends Activity {
private String weather;
@Override
protected void onCreate(Bundle savedInsta