Android Instrumentation测试和Android Studio中的单元测试之间的区别?


74

自Android Studio 1.1rc起,提供了单元测试支持,我想知道Android Instrumentation Tests和Unit测试之间有什么区别。

据我了解:
单元测试对于测试未调用Android API的代码很有用,而Android工具测试则是用于测试特定于Android API的元素或GUI组件的集成测试。

但是,如果在单元测试中使用RobolectricMockito之类的框架,那么如果我没有记错的话,可以测试Android代码(无需设备)。


这是正确的还是更大的区别?如果是这样,每个有什么用?

Answers:


41

单元测试隔离了被测试的组件,这就是为什么经常将Mocks框架与Mockito一起使用的原因:因为将单元与其依赖项隔离开来。请注意,关于Android API的说法部分正确,因为还存在Instrumented Unit测试,即Instrumentation也是Junit包的一部分,还有将TestCase扩展为AndroidTestCase类的类。是Junit软件包的一部分,但允许使用A)Context,您可以使用getContext()进行调用,以及B)属于Android API的资源!另外,请考虑AndroidTestCase是基类,还有其他几个非常有用的类可以扩展该类。他们专门测试加载程序,ContentProviders甚至服务,并且他们可以访问Android API。因此,这些类提供了JUnit测试框架以及特定于Android的方法。现在,借助Junit4,有一个ServiceTestRule直接从Object扩展,并且使您可以更轻松地测试Service,尽管您不能直接在此类内启动Intent。

工具测试也包含在Junit软件包中,但是Android API的控制是完全完全的,因为工具测试在运行任何应用程序代码之前已在系统中实例化,并且要测试您需要打开真实的应用程序(模拟器或电话)通过USB连接)。他们可以访问android组件(例如单击按钮)和应用程序生命周期,通常比Junit测试(用于扩展TestCase的测试)(上述检查的测试)要慢,典型的用法是使用ActivityInstrumentationTestCase2,它具有功能测试方法,更面向用户。

编辑:关于Roboelectric和Mockito,它们是当下(2016年7月13日)在最受欢迎的测试框架之间与Espresso结合使用的工具,Roboelectric允许您在几秒钟而不是几分钟内运行多个测试,这对于必须运行连续测试,并进行持续集成。

从Robolectric网站:

Robolectric的另一种方法是使用模拟框架(例如Mockito)或模拟出Android SDK。尽管这是一种有效的方法,但它通常会产生实质上是应用程序代码的反向实现的测试。Roboelectric允许一种更接近黑盒测试的测试样式,从而使测试对重构更为有效,并使测试着重于应用程序的行为而非Android的实现。如果愿意,您仍然可以将模拟框架与Robolectric一起使用。

Mockito也可以与Junit一起使用,实际上是在必须管理最终类,匿名类或原始类型时使用。


47

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

据我了解,单元测试正在测试单元(例如类)的数据和行为。

例如,假设您有一个游戏:该游戏在一个活动(主要活动)上运行,并且您有一个基于Robot类的角色,该角色具有2种方法(射击和移动)。您可以使用工具测试来测试主要活动,以查看退出应用程序时是否正确保存了该主活动,如果在还原应用程序时可以正确地对其进行了还原等,并且可以使用单元测试来测试Robot,以测试其属性和行为。

免责声明:我不是Java语言的人,但是我对您的问题很感兴趣,并根据在线上的次要搜索回答了该问题。您可能必须对此进行更深入的研究才能找到更详细的答案。


35

单元测试

仅在本地计算机上运行的单元测试。这些测试被编译为在JVM上本地运行,以最大程度地减少执行时间。使用这种方法来运行不依赖于Android框架或具有模拟对象可以满足的依赖关系的单元测试。

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

仪器测试

在Android设备或模拟器上运行的单元测试。这些测试可以访问规范信息,例如被测应用的上下文。使用这种方法来运行具有Android依赖项的单元测试,而模拟对象无法轻松满足这些依赖项。

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

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



1

单元测试:

通常,单元测试称为“本地测试”或“本地单元测试”。造成这种情况的主要原因似乎是您希望能够在不连接设备或仿真器的情况下运行测试。

单元测试不能在不模拟活动(例如Activity)等对象的情况下为您的应用测试UI。


仪器测试:

仪器测试在设备或仿真器上运行。在后台,将安装您的应用程序,然后还将安装测试应用程序,该应用程序将控制您的应用程序,启动它并根据需要运行UI测试。

工具测试也可以用于测试任何UI逻辑。当您需要测试依赖于上下文的代码时,它们特别有用。


参考链接示例


0

单元测试

它仅在本地计算机上运行。

仪器测试用例

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


0

单元测试专注于代码的一小部分(即类级别的方法),并提供基本的验证,以确保代码按预期运行。 Espresso测试提供了UI是否按预期工作的基本验证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.