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