这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,但愿你们多多支持!html
这会是一个系列,因此若是你看完这篇文章,请看下列文章:java
Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )android
Gradle for Android 第二篇( Build.gradle入门 )segmentfault
Gradle for Android 第三篇( 依赖管理 )微信
Gradle for Android 第四篇( 构建变体 )app
Gradle for Android 第五篇( 多模块构建 )框架
Gradle for Android 第七篇( Groovy入门 )jvm
因为现阶段Android开发趋于敏捷开发,再加上国内大大小小的互联网公司都在作app,致使不少开发人员对单元测试没有基本的概念,可是本篇博文不会为你们讲解什么是单元测试,功能测试,而是讲解如何在Android studio上利用gradle使用现阶段流行的测试框架等。工具
为了确保app或者library库的质量,有一个完整的测试很是重要。很长一段时间,Android开发工具都缺少针对完整性测试的支持,可是最近,google为之作了大量的工做,其让开发者作测试变得更加容易了,一些旧的框架更新了版本,新的框架也被加入进来。咱们如今不只能够在Android studio中运行这些测试,甚至能够用gradle经过命令行直接执行。单元测试
因此基于此,咱们这一章,将会为你们介绍几种测试Android app的方式,咱们也会深究之为什么gradle能够帮助测试自动化。
这一章节我将遵循如下内容:
单元测试
功能测试
测试覆盖率
相信你们都有了单元测试的概念,那么好的单元测试不只仅可以确保app的质量,同时还可让新代码开发更加容易。Android studio和gradle android插件默认支持单元测试,可是在你使用它以前,你仍需配置一下。
JUnit测试界很是流行,其使得测试代码容易编写和维护,可是记住,JUnit只能测试逻辑代码,针对和Android SDK相关的代码其会报相应的错误。
在你开始编写junit测试以前,你须要为其新建一个目录。一般呢,这个会被叫作test,其会和你的main文件夹平级。
app └─── src ├─── main ├─── java │ └─── com.example.app └─── res └─── test └─── java └─── com.example.app
你能够在test目录下建立测试类。
我建议你使用JUnit 4,你能够将其做为依赖添加到你的依赖库。
dependencies { testCompile 'junit:junit:4.12' }
注意到你使用了testCompile,这意味着该jar包只会在你测试的时候导入apk。
若是你有其余的构建版本呢,而你又只是想为特定版本添加该jar,你只须要这么作:
dependencies { testPaidCompile 'junit:junit:4.12' }
当全部的事情都OK了,就是时候开始写测试代码了。下面是简单的测试代码:
import org.junit.Test; import static org.junit.Assert.assertEquals; public class LogicTest { @Test public void addingNegativeNumberShouldSubtract() { Logic logic = new Logic(); assertEquals("6 + -2 must be 4", 4, logic.add(6, -2)); assertEquals("2 + -5 must be -3", -3, logic.add(2, -5)); } }
那么如何跑起来呢,也很简单,运行gradlew test。若是你只是想再特定版本中跑呢,那就加一个呗gradlew testDebug。若是测试失败,gradle将会打印相关错误,若是全部测试成功经过,那么会显示BUILD SUCCESSFUL 。
可能你会说,单个测试用例致使整个测试失败,这样很差,若是你想把整个测试案例都跑一遍,那也很简单啊:
$ gradlew test --continue
执行测试任务不只仅是跑完全部的测试,并且其还会为你建立一份测试报告,你能够找到它app/build/reports/tests/debug/index.html。这份报告让你可以更快的发现问题,我以为最重要的是当你将你的测试自动化后,这会很是有用,gradle会为每一个构建版本都建立一份测试报告。若是你执行测试成功,你的测试报告会是这个样子:
说了这么多原始的作法,那么看看Android studio怎么运行测试的吧。右键项目或者选择开始按钮。。这个太基础很少说了,运行成功是这个样子:
好了,junit测试讲完了,是否是很简单。
若是你想测试你的关联Android sdk代码怎么办,单元测试不是一个好主意,幸运的是,有多个依赖包供你选择,其中最出名的是Robolectric,其可让你更方便的测试Android功能,而且还不用在设备或者模拟器上运行。
经过使用Robolectrie,你能够编写测试类,这些类可使用Android SDK和资源文件,固然其仍是跑在jvm上,这会让你测试app更加迅速。
在开始使用Robolectrie以前,你须要添加依赖。注意除了Robolectric依赖,你须要添加JUnit包。
apply plugin: 'org.robolectric' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' testCompile 'junit:junit:4.12' testCompile'org.robolectric:robolectric:3.0' testCompile'org.robolectric:shadows-support:3.0' }
Robolectrie测试类也须要写在test文件夹下,举个例子:
@RunWith(RobolectricTestRunner.class) @Config(manifest = "app/src/main/AndroidManifest.xml", sdk = 18) public class MainActivityTest { @Test public void clickingButtonShouldChangeText() { AppCompatActivity activity = Robolectric.buildActivity (MainActivity.class).create().get(); Button button = (Button) activity.findViewById(R.id.button); TextView textView = (TextView) activity.findViewById(R.id.label); button.performClick(); assertThat(textView.getText().toString(), equalTo (activity.getString(R.string.hello_robolectric))); } }
神马是功能测试,其是用来测试一个app的多个模块是否可以正常工做。举个栗子,你能够建立一个功能测试来确保你点击某一按钮后是否会有一个新的activity。依然,咱们会有不少框架。可是在这里,我推荐Espresso。
google建立Espresso的目的就是在于简化开发人员编写功能测试用例。这个包是由Android support repository提供,因此你能够经过SDK Manager使用它。
在运行测试用例以前,你须要定义一个runner。google提供了AndroidJUnitRunner测试runner,这将帮助你在手机上运行Unit测试。测试runner能够帮你安装apk以及一个测试apk,执行全部测试,生成测试报告。
假设你下载了support library包,那么你须要这么定义:
defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
固然你须要添加一些依赖包:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' androidTestCompile 'com.android.support.test:runner:0.3' androidTestCompile 'com.android.support.test:rules:0.3' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2' androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2' }
注意到这些依赖包使用了androidTestCompile,其不一样于testCompile。当你直接运行时,会报错:
Error: duplicate files during packaging of APK app-androidTest.apk Path in archive: LICENSE.txt Origin 1: ...\hamcrest-library-1.1.jar Origin 2: ...\junit-dep-4.10.jar
其意思也很清楚,由于多个文件致使,你能够简单处理下:
android { packagingOptions { exclude 'LICENSE.txt' } }
注意:功能测试须要放在AndroidTest目录下,下面是测试用例:
@RunWith(AndroidJUnit4.class) @SmallTest public class TestingEspressoMainActivityTest { @Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class); @Test public void testHelloWorldIsShown() { onView(withText("Hello world!")).check (matches(isDisplayed())); } }
功能测试也有测试报告,当正确执行后,应该是这样的:
最后可能有朋友问,在Android studio中执行测试,那就附图吧:
一旦你在你的项目中使用到了测试,那么你确定想知道你的测试覆盖量。很真实,依然有不少测试覆盖率工具,我推荐的是Jacoco。
有一份覆盖率报告,很简单。你只须要配置一下:
buildTypes { debug { testCoverageEnabled = true } }
当你执行完构建,你能够在app/build/ outputs/reports/coverage/debug/index.html中找到,每一个版本都会有一个报告。测试覆盖率会是这样的:
你甚至能够经过点击查看更多信息,能够看到哪一行代码被测试。
在这一章,咱们学习了如何测试,咱们学习了简单的单元测试,以及Robolectric测试。咱们学习了功能测试,以及学习了如何使用Espresso。最好,咱们学会了如何查看测试覆盖率报告。
在下一章,我将会带来最重要的一章,即自定义化构建过程,建立自定义tasks和插件。固然了咱们会首先介绍Groovy语法,理解其语法让你可以更轻松的理解gradle是如何工做的。