文章英文版来源:https://www.bignerdranch.com/blog/triumph-android-studio-1-2-sneaks-in-full-testing-support/
我正在要求其支持,我们有时要监控安卓测试中的状态,一直在等待测试能充分合并安卓开发阶段中,很棒地是,这一天终于到来了。
我曾在一月写过一篇 setting up unit testing in Android Studio,如果你已经足够坚定去读了这篇文章,你应该记得它的设置是多么的乏味不耐烦的,我们知道在开发中最好的测试工具-就是我在前一篇文章描述的措施,而这种错失仅仅是暂时的。
今天,所有这些设置步骤已经完全不需要了,这多亏了安卓工具开发团队,稳定版的AS1.2不需要了任何第三部分设置以及自定义的Robolectric,在二月发布的AS1.1中介绍过这些基本设置,它需要相关试验配置才能单元测试,上个星期,在稳定版AS1.2的发布后,这配置不需要在试验了,它已经集成在AS中了,尽管Nerds在Ranch对AS1.2发布公告上一句话没有说此功能感到很惊讶,但这种单元测试在AS1.2是支持的。
今天我会演示一遍非常简单地设置过程来在AS建立单元测试,我待会回来解释怎么从我一月份描述那种复杂性的设置过渡到简化了。
这篇unit testing how-to针对AS1.1发布版的文章对AS1.2来说是毫无用处的,我们仅仅需要做的设置就是选择正确的Build Variant Test Artifact:
:
就是这样做,我们现在可以添加测试依赖库且去写测试了,我们buiild.gradle文件就如下面所示:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
...
testCompile 'junit:junit:4.12'
testCompile('org.robolectric:robolectric:3.0-rc2') {
exclude group: 'commons-logging', module: 'commons-logging'
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
}
细心的读者可能注意到:我们依赖的Robolectric是3.0版本,我们之前也用过Robolectric2.4版本测试AS的新功能是没问题的,然而,你却需要使用自定义的 RobolectricTestRunner(看 my prior post),Robolectric对于如何从2.4版本升级到3.0版本提供很好的指导。
添加了Robolectric3.0一个方便就是特别为扩展命令行和AS而设计的RobolectricTestRunnerGradle,,也叫 RobolectricGradleTestRunner,我们现在可以注解我们的测试类了:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, emulateSdk = 21)
public class MyActivityTest {
@Before
public void setUp() throws Exception {
// setup
}
@Test
public void testSomething() throws Exception {
// test
}
}
最终,我们可以在AS用Gradle Test运行测试:
所有步骤就是这些了,现在你就会立刻在AS得到测试通过和失败的反馈。
如果你有阅读过 my previous post,最大的变化就是需要移除下面的代码:
从项目级的build.gradle中移除JC&K插件
classpath 'com.github.jcandksolutions.gradle:android-unit-test:2.1.1'
在AS插件列表中和模块级的build,gradle中移除Evan Tatarka’s单元测试插件:
apply plugin: 'android-unit-test'
从模块级的build.gradle移除对AS0.8.9的补修:
afterEvaluate {
tasks.findByName("assembleDebug").dependsOn("testDebugClasses")
}
如果你升级到Robolectric3.0,移除你自定义的RobolectricTestRunner 后,使用RobolectricGradleTestRunner:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, emulateSdk = 21)
public class MyActivityTest { ... }
所有的这些是不是很简单了?是的!下载Josh Skeen’s demo运行来观看,是时候写一些较棒的测试去评估你的安卓Apps的质量,这篇向我们展示如何Robolectric和新的测试支持去写更棒的测试。
更正5.15:几个评论者说到:当重复运行他们的测试,他们遇到一些问题,在这里也谈如何避免”测试事件不被接受”的错误
当我们每次运行我们的测试时,我们需要让Gradle重复运行我们所有的测试,这是因为Gradle通过识别不要重复运行的个别子任务来优化我们运行测试。
初始运行:
... :app:compileDebugUnitTestJava
:app:compileDebugUnitTestSources
:app:mockableAndroidJar UP-TO-DATE
:app:assembleDebugUnitTest
...
重复运行:
....
:app:compileDebugUnitTestJava UP-TO-DATE
:app:compileDebugUnitTestSources UP-TO-DATE
:app:mockableAndroidJar UP-TO-DATE
:app:assembleDebugUnitTest UP-TO-DATE
...
不幸地是,AS需要所有任务都被运行,否则,它就不会对我们的测试做出反应,因此我们会得到测试你事件不被接受
的警告,我们可以通过更改我们运行配置强迫Gradle去重复运行所有的任务:
想要学习最新和最好地安卓APP开发吗?点击我们的Android bootcamp和 Advanced Android bootcamp,可在Ranch位置上或在你自己的办公上学习。