由于目前Google已经停止了对Eclipse ADT插件的更新,因此迫使Android的开发者迁移到Android Studio中。Android Studio基于JetBrains IntelliJ IDEA,后者号称世界上最聪明最好用的Java开发IDE。虽然Android Studio提供了很多选项可以为Eclipse的工程迁移以及开发提供便利,但是,对于习惯了Eclipse的开发者来说,这还是需要一个比较痛苦的适应过程。今天给大家分享的就是在Android Studio中进行单元测试的方法。
在Android Studio中可以进行两种单元测试,第一种方式是Local Unit Tests,这种单元测试主要用于对于Android平台没有依赖或者依赖较少的功能的测试,运行在pc上的JVM环境中,不需要依赖与设备或者模拟器,因此测试方便,效率很高。但是如果测试需要依赖Android环境,可以第二种是Instrumented Unit Tests,这种测试方法需要在真实设备或者模拟器中运行。本文主要简单介绍第一种测试方法。
一 环境搭建
由于Local Unit Tests需要用到Junit,如果你的测试代码需要部分依赖android api,你还需要用到mockito,如果要增加测试代码的可读性,官方还建议使用hamcrest。因此你的gradle需要添加声明以下的测试依赖,其中junit是必须的,其他两个可以根据需要添加.
dependencies {
...
// Unit testing dependencies
testCompile 'junit:junit:4.12'
// Set this dependency if you want to use Mockito
testCompile 'org.mockito:mockito-core:1.10.19'
// Set this dependency if you want to use Hamcrest matching
androidTestCompile 'org.hamcrest:hamcrest-library:1.1'
}
这个过程由于涉及到从远端下载依赖包,因此根据网络环境不同,可能需要的时间不同。对于时间较长的朋友,可以尝试从其他地方下载好junit等的jar包,然后放到工程的libs目录下,这样就不用声明这些依赖了。
在Android Studio工程建立的时候,会默认在src目录下生成一个androidTest目录,这个目录其实主要是用于存放Instrumented Unit Tests测试代码的目录。为了保持一个清晰的代码结构,在进行Local Unit Tests的时候建议在src目录下新建一个test/java目录,下面存放测试代码,而且建议测试代码的路径最好和被测试代码的路径保持一致,例如,如果你要测试com.example.calsstobetest.SimpleCalculator.java,那么它的本地测试代码最好放在/src/java/test/com/example/classtobetest/目录下,取名叫SimpleCalculatorTest.java。其实在junit4之前,这些要求都是强制的,而且还要求测试方法必须以test开头,不过自从junit4之后,就没有这些要求了,但是推荐还是继续遵守这些规范。
之后,到android studio的主界面中找到Build Variants,将其中的Test Artifact切换为Unit Test, 这个时候可以看到,src/test/java目录变成了浅绿色,表示Android Studio已经将这个目录识别为代码目录了。如下图所示:
二 编写测试代码
由于本文主要是说明进行本地单元测试的基本步骤,因此使用一个简单的被测试类来说明,代码如下:
代码路径:src/main/java/com/example/classtobetest/SimpleCalculator.java
public class SimpleCalculator {
/**
* add
* @param a
* @param b
* @return
*/
public int add(int a, int b) {
return a + b;
}
}
之后,右键在文件中单机,选择Go To -> Test,再点击create new test file,在弹出的弹窗中选择junit4,然后选择要生成的方法和要测试的方法,如图所示。
选择完成后,可以看到,已经在src/test/java目录下自动生成了和被测试代码包名对应的测试类了,基本代码如下:
代码路径:src/test/java/example/classtobetest/SimpleCalculatorTest.java
public class SimpleCalculatorTest {
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testAdd() throws Exception {
}
}
junit4现在使用annotation的方法来指明测试过程中不同阶段的代码块,常用的有如下的几种annotation:
- @Before: 标志在每次测试之前的初始化阶段需要调用的函数,可以声明多个,一般可以在这些函数中做一些变量初始化之类的操作。
- @After: 和@Before表示的意义相反,在每次测试结束后调用,也可以声明多个,一般可以在这些函数中释放资源或者内存。
- @Test: 实现真正的测试,可以声明多个。
- @BeforeClass: 每一个测试类只能声明一个,用来修饰静态方法,它保证在这个测试类的其他方法被调用之前调用,且只会调用一次,一般用来进行一些复杂且耗时的操作,如数据库连接等操作。
- @AfterClass: 和@BeforeClass的意义相反,一般用来释放在@BeforeClass中分配的资源。
- @Test(timeout=): 和@Test方法相似,不过它声明了时间限制,如果在指定的时间类没有完成这个测试,那么就当做这次测试失败。
现在,我们故意修改一下测试类的代码,使单元测试不通过,修改的代码如下:
代码路径:src/test/java/example/classtobetest/SimpleCalculatorTest.java
public class SimpleCalculatorTest {
private SimpleCalculator mCalculator;
@Before
public void setUp() throws Exception {
mCalculator = new SimpleCalculator();
}
@After
public void tearDown() throws Exception {
mCalculator = null;
}
@Test
public void testAdd() throws Exception {
Assert.assertEquals(3, mCalculator.add(1, 1));
}
}
三 测试
在SimpleCalculatorTest类中点击右键,选择Run ‘SimpleCalculatorTest’,即可执行一次这个测试类的测试代码。如果要执行目录下的所有测试,可以在Project目录树下选择Run ‘All Tests’。执行一次测试后,如果有测试未通过的,会在Run的控制台输出,如图所示。
同时也可以在工程目录的控制台使用命令行来执行一次测试:
./gradlew test --continue
这样就完成了一次简单的测试流程,可以满足一些不依赖android api的方法或者类的测试。如果测试需要依赖android api,可以考虑使用Mockito或者Instrumented Unit Tests,这个有时间再和大家分享。