可以使用AndroidStudio1.1里面增加的单元测支持和Android的Gradle插件。
讨论:
ADT插件只支持集成测试,并且要求开发者创建一个单独的测试项目。转化到AndroidStudio和Gradle的其中一个好处就是支持在android项目内进行测试。
这节讨论的是真正的单元测试,就是排在开发机器本地的JVM上的。不像集成测试那样使用androidTest资源文件夹,单元测试在src/test/java目录下面。
当你使用AndroidStudio新建一个Android项目时,一个示例的单元测试已经为你提供。它在src/test/java树下,但是不在classpath下面:
生成的测试如下:
这类测试对于任何使用过Junit的java开发者都应该熟悉。Junit4的@Test注解表示addition_isCorrect方法是一个而测试方法。assertEquals方法是Assert类里面的静态方法(注意使用static的import引入所有的静态方法),第一个参数是正确的答案,第二个参数是实际的测试值。
为了运行测试,你需要做的是在BuildVariants视图下选择TestArtifact:
通过选择“UnitTests”,src/test/java目录树被AndroidStudio识别用于包含测试资源,com/oreilly/helloworld数被包含在包下面。
在执行单元测试之前的最后一步。你需要确认Junit被包含在testCompile里面。如下:
你现在可以使用Gradle的test运行的测试:
为每个变体运行一个测试,在app/build/reports/tests目录下面生成HTML:
在目录下面打开index.html文件,报告如下图:
你可以下钻到ExampleUnitTest类下面,看具体的结果:
可以使用--tests标识限制测试只测试一个变体,甚至一个测试类:
变体任然被构建,但是只有指定的那个,并且只有在ExampleUnitTest类里面的测试才被运行。
你也可以选择右击测试,在AndroidStudio里面运行它。但是它只为当前的变体,提供了一个漂亮的结果展示:
唯一的问题是,它没有运行任何有意义的东西。这就是关键。当使用JUnit支持的时候,你不能测试任何依赖于AndroidSDK的东西。JUnit测试只支持那些应用中纯JAVA部分。
在4.5节,library连接网络服务,下载JSON数据,解析,并且更新TextView的值。如果你喜欢,你可以测试过程的一部分:
好消息是单元测试非常快,至少相对于集成测试,因为它们不需要部署到真机或者模拟器上面。如果你有不依赖于Android类的java类,单元测试是一个非常好的途径来确保它们顺利工作。测试驱动的开发在移动世界还没有像在常规的java世界里面一样被接受,但是它是一个好的开始。
补充:
Robolectric项目被设计用来不使用模拟器或者连接设备来运行集成测试,它表现的像一个AndroidSDK的mock。很多人对它的看法不是很一致。