Android的Gradle技巧 5.1单元测试

32 篇文章 0 订阅
5.1单元测试
问题
您想要测试应用程式的非Android部分。

使用Android Studio 1.1版本和Android版Gradle插件中添加的实验单元测试支持。
讨论
Eclipse Android开发工具(ADT)插件只支持集成测试,并且要求开发人员创建一个单独的项目,仅用于测试。切换到Android Studio和Gradle的一个优点是支持Android项目本身中的测试。
在1.1版本的Android Studio和相关的Gradle插件之前,这些测试仍然局限于集成测试,这意味着你需要一个模拟器或连接的设备来运行测试。集成测试可以非常强大和有用,并且是食谱配方5.3和配方5.4的主题。该配方讨论了真正的单元测试,它在开发机器上的本地JVM上运行。与使用androidTest源集合的集成测试不同,单元测试驻留在应用程序的src / test / java目录中。
当您在Android Studio中生成新的Android应用程序时,将为您提供示例单元测试。它驻留在src / test / java树中,但当前不在类路径中,如图5-1所示。


图5-1。由Android Studio在app / src下生成的示例单元测试
所产生的测试示于实施例5-1中。
实例5-1。生成样本单元测试
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
这种类型的测试应该对过去使用过JUnit的任何人都很熟悉,这应该是每个Java开发人员。 JUnit 4的@Test注释表示addition_isCorrect方法是一个测试方法。 assertEquals方法是Assert类中的一个静态方法(注意静态方法在该类中的静态导入),它的第一个参数是正确的答案,第二个参数是实际测试。
为了运行测试,您需要执行注释说的内容,即在构建变体视图中选择测试构件,如图5-2所示。


图5-2。在构建变体中选择“单元测试”工件
注意,通过选择“Unit Tests”,Android Studio现在理解src / test / java下的目录树包含测试源(因为文件夹显示为绿色),com / oreilly / helloworld树现在被解释为包。
在执行单元测试之前需要执行最后一个步骤。您需要确保JUnit作为testCompile依赖项包括在项目中。如配方1.5中所示,默认项目已经是这种情况。模块构建文件的依赖关系部分在示例5-2中重复。
实例5-2。 JUnit在模块build.gradle文件中的依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12' //1
compile 'com.android.support:appcompat-v7:23.0.1'
}
1在testCompile期间添加JUnit依赖项
现在可以使用测试目标从Gradle运行测试,但需要做很多工作(见例5-3)。
实例5-3。执行单元测试
> ./gradlew test
Starting a new Gradle Daemon for this build (subsequent builds will be faster).
:app:preBuild UP-TO-DATE
:app:preArrogantStarkDebugBuild UP-TO-DATE
:app:checkArrogantStarkDebugManifest
:app:preArrogantStarkReleaseBuild UP-TO-DATE
:app:preArrogantWayneDebugBuild UP-TO-DATE
:app:preArrogantWayneReleaseBuild UP-TO-DATE
:app:preFriendlyStarkDebugBuild UP-TO-DATE
:app:preFriendlyStarkReleaseBuild UP-TO-DATE
:app:preFriendlyWayneDebugBuild UP-TO-DATE
:app:preFriendlyWayneReleaseBuild UP-TO-DATE
// ... all the stages for all the variants ...
:app:compileObsequiousWayneReleaseUnitTestJavaWithJavac
:app:compileObsequiousWayneReleaseUnitTestSources
:app:assembleObsequiousWayneReleaseUnitTest
:app:testObsequiousWayneReleaseUnitTest
:app:test
BUILD SUCCESSFUL
对每个变体运行单个测试,在app / build / reports / tests文件夹中生成HTML输出,如例5-4所示。

实例5-4。输出测试的文件夹

> ls -F app/build/reports/tests/
arrogantStarkDebug/ arrogantWayneRelease/
friendlyWayneDebug/ obsequiousStarkRelease/
arrogantStarkRelease/ friendlyStarkDebug/
friendlyWayneRelease/ obsequiousWayneDebug/
arrogantWayneDebug/ friendlyStarkRelease/
obsequiousStarkDebug/ obsequiousWayneRelease/
在任何文件夹中打开index.html文件,将显示图5-3中的测试报告。


图5-3。以HTML格式测试报告
您可以向下钻取到ExampleUnitTest类,并查看特定结果(图5-4)。
要将测试限制为单个变体甚至单个测试类,请使用--tests标志,如例5-5所示。
实施例5-5。只在一个测试类中运行测试
> ./gradlew testFriendlyWayneDebug --tests ='*。ExampleUnitTest'
该变体仍然被构造,但只有那一个,并且只有在考试pleUnitTest类中的测试运行。
或者,如果您右键单击测试本身并在Android Studio中运行它,它仅运行当前变体,并提供一个很好的视图显示结果(图5-5)。


图5-4。 ExampleUnitTest测试的结果


图5-5。在Android Studio中测试结果
唯一的问题是,这并没有真正测试任何重要的。这是要点,实际上。当使用JUnit支持时,您不能测试任何依赖于Android SDK的东西。单元测试仅适用于应用程序的纯Java部分。
单元测试支持仅适用于应用程序的非Android部分。

在4.5中,库访问了一个Web服务,下载了JSON数据,解析它,并更新了一个包含值的TextView。如果你喜欢,你可以只测试该过程的解析部分,如例5-6所示。

实例5-6。测试Gson解析器

import com.google.gson.Gson;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class IcndbJokeTest {
private String jsonTxt = "{\"type\": \"success\", \"value\": {\"id\": 451,
\"joke\": \"Xav Ducrohet writes code that optimizes itself.\",
\"categories\": [\"nerdy\"]}}"; //1
@Test
public void testGetJoke() throws Exception {
Gson gson = new Gson();
IcndbJoke icndbJoke = gson.fromJson(jsonTxt, IcndbJoke.class);
String correct = "Xav Ducrohet writes code that optimizes itself.";
assertNotNull(icndbJoke);//2
assertEquals(correct, icndbJoke.getJoke());//3
}
}
1String应该都在一行
2检查解析是否产生非空结果
3检查检索到的笑话是否正确
好消息是单元测试是快速的,至少相对于集成测试,因为它们不需要部署到实际的设备或模拟器。如果你有不依赖于Android类的Java类,单元测试是确保它们正常工作的好方法。测试驱动开发(TDD)在移动世界中尚未被采用,就像在常规Java世界中一样,但这是一个很好的开始。


什么是Robolectric?
Robolectric项目旨在让您运行集成测试,就像它们是单元测试一样,即不使用仿真器或连接的设备。因此,它作为整个Android SDK巨大的模拟。
来自该领域的报告混合了。有些人真的很喜欢它;其他人不相信任何与对话框,动画,视图或UI中的任何东西相关的东西。这是更复杂的事实,你脚本的UI测试,而不实际使用UI。
不过,这不是一个坏的选择,适合整个Gradle方法。有关详细信息,请访问网站。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值