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

Joe*_*n93 69 testing android integration-testing unit-testing android-studio

从Android Studio 1.1rc开始,有单元测试支持,我想知道Android Instrumentation测试和单元测试之间有什么区别.

据我了解:
单元测试对于测试不调用Android API的代码非常有用,而Android测试测试则是集成测试,用于测试Android API特定元素或GUI组件.

但是,如果你在单元测试中使用像RobolectricMockito这样的框架,你可以测试Android代码(不需要设备)如果我没有弄错的话.


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

小智 43

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

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

例如,假设你有一个游戏:这个游戏运行在一个活动(主要活动)上,你有一个基于机器人类的角色,它有两种方法(射击和移动).您将使用检测测试来测试主要活动,以查看它在您离开应用程序时是否正确保存,是否在还原时正确恢复等等,并且您将使用单元测试测试Robot,以测试其属性和行为.

免责声明:我不是一个java人,但我对你的问题感兴趣,我在网上进行了一次小搜索.您可能需要深入研究这个以找到更详细的答案.


tro*_*tto 34

单元测试隔离了被测组件,这就是为什么经常与Mock框架一起使用的原因:Mockito:因为将单元与其依赖关系隔离开来.请注意您对Android API的说法部分正确,因为还有Instrumented Unit测试,即Instrumentation也是Junit包的一部分,以及扩展TestCase的类,因为类AndroidTestCase是Junit包的一部分但是允许使用A)Context,您可以使用getContext()调用,以及B)作为Android API一部分的资源!另外请考虑AndroidTestCase是一个基类,还有其他几个类非常有用,可以扩展这个类.他们专门测试Loaders,ContentProviders甚至服务,并且他们也可以访问Android API.所以这些类提供了JUnit测试框架以及特定于Android的方法.现在使用Junit4,ServiceTestRule直接从Object扩展,并允许您更容易测试服务,尽管您无法直接在此类中启动Intent.

仪表测试它们也属于Junit包,但是Android API的控制非常全面,因为在运行任何应用程序代码之前,在系统中实例化Instrumentation Tests,并测试是否需要打开真实的应用程序(模拟器或电话)用USB连接).他们访问Android组件(例如,单击按钮)和应用程序生命周期,它们通常比扩展TestCase(上面检查的那些)的Junit测试慢,典型的用途是ActivityInstrumentationTestCase2,它具有功能测试方法,更加面向用户.

编辑:关于Roboelectric和Mockito,目前最流行的测试框架(2016年7月13日)与Espresso相关,Roboelectric允许您在几秒而不是几分钟内运行多个测试,这对于必须的团队非常方便进行连续测试,并进行持续集成.

来自Robolectric的网站:

Robolectric的另一种方法是使用模拟框架(如Mockito)或模拟Android SDK.虽然这是一种有效的方法,但它通常会产生基本上是应用程序代码的反向实现的测试.Roboelectric允许更接近黑盒测试的测试风格,使测试更有效的重构,并允许测试专注于应用程序的行为而不是Android的实现.如果您愿意,您仍然可以使用模拟框架和Robolectric.

Mockito也可以与Junit一起使用,除了必须管理最终类,匿名类或原始类型之外,确实可以使用.


小智 29

单元测试

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

所以基本上,你运行普通的java代码来测试例如内容提供者,数据库连接,方法的输入和输出.这不适用于Android.要运行它,您不需要设备.

仪器测试

在Android设备或模拟器上运行的单元测试.这些测试可以访问Instrumentation信息,例如被测应用程序的Context.使用此方法运行具有Android依赖项的单元测试,模拟对象无法轻松满足这些依赖性.

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

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


yoA*_*ex5 6

安卓测试

[测试类型]

Android世界中的测试类型图

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

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

//Unit tests
src/test/java
Run Code Online (Sandbox Code Playgroud)

[通过命令行运行测试]

[测试双重类型]