一、单元测试 - TestCase
继承AndroidTestCase类或者TestCase类,即可进行基本的单元测试。
AndroidTestCase类是TestCase的子类,其中添加了Context的相关操作。
配置测试环境
首先,在src目录下创建test目录,test目录下创建java目录,如下图所示。
其次,在build.gradle配置文件中添加如下配置:
android {
testOptions {
unitTests.returnDefaultValues = true
}
}
注意:该文件中添加此配置就可以了,不需要添加对junit包的依赖支持,因为android sdk中
已经自带了junit的内容,这里再配置运行时反而会出错(java.lang.NoClassDefFoundError: junit/textui/ResultPrinter)。
最后,在你需要创建测试类的类名上进行如下操作:
鼠标右击 -> Go To -> Test -> Create New Test ->弹出面板点击OK(如下图所示) ,
当然,也可以手动在test/java目录下创建包路径以及测试类。
编写代码测试运行
编写测试代码如下:
public class LoginActivityTest extends TestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
}
public void testAdd() {
assertTrue(3 + 3 == 6);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
}
setUp方法在所有测试方法前执行,tearDown在所有测试方法后执行。
testAdd方法是自己写的测试方法,在testAdd方法上鼠标右击 - > Run 'testAdd()' 即可运行测试方法。
测试方法必须以test打头或者用@Test标注。
二、单元测试 - Robolectric
Robolectric是一款Android单元测试框架,它支持在单元测试(JVM)中运行测试Android API,即本该依赖于Android设备或模拟器
才能运行的程序,Robolectric使之可以直接在JVM中运行。
测试环境配置
测试环境配置基本跟上述的TestCase一样,只是需要在build.gradle文件里添加对Robolectric包的支持:
testCompile 'org.robolectric:robolectric:3.0'
另外,build.gradle文件里的testOptions配置可以省略。
为了方便测试,可以再导入一个断言包:
testCompile 'com.squareup.assertj:assertj-android:1.1.0'
PS:testCompile 是对src/test包的支持,测试用例运行于JVM,即不依赖Android设备或模拟器;
androidTestCompile是对src/androidTest包的支持,测试用例运行于Android设备或模拟器。
编写代码测试运行
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MyLcActivityTest {
private MainActivity mActivity;
@Before
public void setup() {
mActivity = Robolectric.buildActivity(MainActivity.class).create().get();
}
@Test
public void hasText() {
assertThat(mActivity.cb_possessions).hasText("资产");
}
}
同样,鼠标右击 -> Run即可运行。
问题及解决方案
在Robolectric里有个问题需要注意,如果是项目下的Module运行可能跑不起来,会报配置文件找不到的错误,原因是
RobolectricGradleTestRunner类的BUILD_OUTPUT变量设置的路径是工程根目录的build目录。
private static final String BUILD_OUTPUT = "build/intermediates";
解决办法是新建个类继承RobolectricTestRunner,代码完全复制RobolectricGradleTestRunner类,在新类里把模块名加入BUILD_OUTPUT变量即可,
例如BUILD_OUTPUT=“module_name/build/intermediates”;
然后在@RunWith()里引用新类就可以了。
注: 以上配置及测试于Android Studio 1.4版本上完成。