Android Studio中的Android Instrumentation测试和单元测试有什么区别?

89
截至 Android Studio 1.1rc 版本,有单元测试支持,我想知道 Android 仪器测试和单元测试之间的区别。
据我所知:
单元测试适用于测试不调用Android API的代码,而 Android 仪器测试则是集成测试,用于测试Android API特定元素或GUI组件。

但是如果您在单元测试中使用像RobolectricMockito这样的框架,则可以测试Android代码(无需设备),如果我没有理解错的话。


这是正确的吗,还是有更大的区别?如果有,每种测试方法的用途是什么?
7个回答

56

在我看来,仪器化测试是具有控制应用程序生命周期和事件(onStart、onCreate等)能力的集成测试。

单元测试,据我所知,是为了测试一个单元(例如类)的数据和行为。

例如,假设你有一个游戏:这个游戏运行在一个活动(主活动)上,你有一个基于Robot类的角色,它有两个方法(fire和move)。你会使用仪器化测试来测试主活动,以查看当你离开应用程序时是否正确保存,当你恢复它时是否正确恢复等,并使用单元测试来测试Robot,以测试其属性和行为。

免责声明:我不是Java人,但我对你的问题感到兴趣并根据一些在线搜索回答了它。您可能需要深入研究才能找到更详细的答案。


49

单元测试将被测试的组件隔离开来,这就是为什么常常与模拟框架(如Mockito)一起使用的原因:因为它将单元从其依赖项中隔离出来。请注意,您所说的关于Android API的内容只是部分正确,因为还有仪器化单元测试,即仪器化也是JUnit包的一部分,并且扩展了TestCase类的类,例如AndroidTestCase类也是JUnit包的一部分,但允许使用A)Context,您可以通过getContext()调用他们,以及B)资源,这些资源属于Android API!另外请注意,AndroidTestCase是一个基类,并且有几个其他非常有用的类扩展了这个类。它们专门测试Loader、ContentProvider甚至Services,它们也可以访问Android API。因此,这些类不仅提供了JUnit测试框架,还提供了Android特定的方法。现在,使用Junit4,有ServiceTestRule直接继承自Object,使您更容易测试服务,尽管您无法直接在此类内部启动意图。

仪器化测试也在JUnit包中,但是对Android API的控制相当全面,因为仪器化测试在系统中在运行任何应用程序代码之前实例化,并且要进行测试,您需要打开真实的应用程序(模拟器或连接USB的手机)。它们访问Android组件(例如单击按钮)和应用程序生命周期,它们通常比扩展TestCase的Junit测试(上面所述的那些)慢,典型的用法是与具有功能测试方法的ActivityInstrumentationTestCase2一起使用,更加面向用户。

编辑:关于Roboelectric和Mockito,它们是目前最流行的测试框架之一(2016年7月13日),

Roboelectric允许您在几秒钟内运行多个测试,而不是几分钟,这在必须运行持续测试并且受到持续集成影响的团队中非常方便。

从Robolectric网站上:

另一种使用 Robolectric 之外的方法是使用模拟框架,如 Mockito 或模拟 Android SDK。虽然这是一种有效的方法,但它经常产生的测试本质上是应用程序代码的逆实现。Roboelectric 允许更接近黑盒测试的测试风格,使得测试更有效地进行重构,并允许测试集中于应用程序的行为而不是 Android 的实现。如果你愿意,你仍然可以与 Robolectric 一起使用 mocking 框架。
Mockito 可以与 Junit 一起使用,在处理 final 类、匿名类或原始类型时很有用。

46

单元测试

在本地机器上运行的单元测试。这些测试编译后可在JVM上本地运行,以最小化执行时间。使用此方法运行无依赖于Android框架或有模拟对象可以满足依赖项的单元测试。

基本上,您运行纯Java代码来测试例如内容提供程序、数据库连接、方法的输入和输出等。这不在Android上运行。要运行它,您不需要设备。

仪表盘测试

在Android设备或模拟器上运行的单元测试。这些测试具有访问Instrumentation信息的功能,例如正在测试的应用程序的Context。使用此方法来运行对Android依赖性具有模拟对象不能轻松满足的单元测试。

因此,它模拟用户将如何使用实际应用程序,因此您需要设备(物理设备或模拟器)才能运行它。它可以访问视图、活动、上下文等。

参考:http://developer.android.com/tools/testing/testing_android.html


10

Android测试

[测试类型]

Android世界中的测试类型图示

本地单元测试:JUnit,Mockito,PowerMock
仪器化测试(一种功能测试):Espresso,Robolectric,Robotium

//Functional tests(Integration, UI)
src/androidTest/java

//Unit tests
src/test/java

[通过命令行运行测试]

[测试双类型]


你好,这个图表是你自己创建的还是有其他来源可以获取呢? - BenjyTec
@BenjyTec,这是我自己的图表。如果您希望,我可以打开它。 - yoAlex5
我曾考虑在我的学士论文中使用那张图片,但是如果它不包含在科学论文或类似的文件中,我认为我不能将其用作来源。这就是为什么我要问的原因。无论如何,还是谢谢你的努力! - BenjyTec

4

单元测试:

通常情况下,单元测试被称为“本地测试”或“本地单元测试”。其主要原因是你希望能够在没有设备或模拟器连接的情况下运行测试。

单元测试无法测试应用程序的UI,除非使用类似Activity的模拟对象。


仪器化测试:

仪器化测试在设备或模拟器上运行。在后台,你的应用程序将被安装,然后还会安装一个测试应用程序来控制你的应用程序,启动它并根据需要运行UI测试。

仪器化测试也可以用于测试非UI逻辑。当你需要测试具有上下文依赖性的代码时,它们特别有用。


示例参考链接


0

单元测试关注代码的小部分(例如类级别的方法),并提供基本验证以确保代码按预期工作。 Espresso 测试提供基本验证,确保 UI 按预期工作。


0

单元测试

只在本地计算机上运行。

仪表测试用例

它运行在安卓设备或模拟器上。如果您检查测试用例,则会在模拟器或安卓设备上运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接