Android Studio中的Android Instrumentationtesting和unit testing之间的区别?

从Android Studio 1.1rc开始,有unit testing支持 ,我想知道Android Instrumentationtesting和unit testing有什么区别。

据我所知:
unit testing对于testing不会调用Android API的代码非常有用,而Androidtestingtesting则是用于testingAndroid API特定元素或GUI组件的集成testing。

但是,如果你在unit testing中使用RobolectricMockito这样的框架,如果我没有弄错,你可以testingAndroid代码(不需要设备)。


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

unit testing隔离被测组件,这就是为什么经常和Mock框架一起使用的原因:因为将单元从它们的依赖关系中分离出来。 请注意,您所说的Android API部分是真实的,因为还有Instrumentation Unittesting ,即Instrumentation也是Junit软件包的一部分,还有扩展TestCase的类,因为AndroidTestCase类是Junit软件包的一部分,但是允许使用A)Context,你可以用getContext()调用,B)作为Android API的一部分的资源! 另外请考虑AndroidTestCase是一个基类,还有其他几个类可以扩展这个类。 他们专门testingLoaders,ContentProviders甚至Services,并且他们也可以访问Android API。 所以这些类提供了JUnittesting框架以及Android特定的方法。 现在有了Junit4,ServiceTestRule可以直接从Object中扩展,并且让你更容易testing一个Service,尽pipe你不能直接在这个类中启动一个Intent。

Instrumentationtesting他们也进入Junit包,但是对Android API的控制是相当全面的,因为在任何应用程序代码运行之前,Instrumentationtesting在系统中被实例化,并且testing你需要打开真实的应用程序(模拟器或电话与USB连接)。 他们访问android组件(例如单击一个button)和应用程序生命周期,通常比扩展TestCase的Junittesting(上面所讨论的testing)要慢,典型的用途是具有functiontesting方法的ActivityInstrumentationTestCase2,更加面向用户。

编辑:关于Roboelectric和Mockito,这是与目前最stream行的testing框架(2016年7月13日)之间的浓咖啡,Roboelectric允许你在几秒钟内运行多个testing,而不是几分钟,这真的很方便的团队,必须运行连续testing,并持续整合。

Robolectric网站:

Robolectric的一个替代方法是使用Mockito等模拟框架或模拟Android SDK。 虽然这是一种有效的方法,但它通常会产生基本上是应用程序代码的反向实现的testing。 Roboelectric允许testing风格更接近黑盒testing,使testing更有效地进行重构,并允许testing专注于应用程序的行为,而不是实施Android。 如果你愿意,你还可以和Robolectric一起使用模拟框架。

也可以使用Junit的Mockito,除了必须pipe理最终类,匿名类或基本types之外,其实是用得其所。

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

据我所知,unit testing正在testing一个单元(例如类)的数据和行为。

例如,假设你有一个游戏:这个游戏运行在一个活动(主要活动)上,并且你有一个基于Robot类的angular色,有2个方法(火和移动)。 您将使用工具testing来testing主要活动,以确定它在离开应用程序时是否能够正确保存,如果在还原时能够正确恢复,您将使用unit testing来testingRobot,以testing其属性和行为。

免责声明:我不是一个Java的人,但我对你的问题感兴趣,我回答它的基础上一个小的search在线。 您可能需要深入研究以find更详细的答案。

unit testing

只在本地机器上运行的unit testing。 这些testing被编译为在JVM本地运行,以最小化执行时间。 使用这种方法来运行没有依赖于Android框架的unit testing,或者有模拟对象可以满足的依赖关系。

所以基本上,你运行普通的java代码来testing例如内容提供者,数据库连接,方法的input和输出。 这不能在Android上运行。 运行它,你不需要一个设备。

仪器testing

在Android设备或模拟器上运行的unit testing。 这些testing可以访问Instrumentation信息,例如被测应用程序的上下文。 使用这种方法来运行具有模拟对象无法轻松满足的Android依赖关系的unit testing。

所以它嘲笑用户将如何使用实际的应用程序,因此你需要一个设备(物理或模拟器)来运行它。 它可以访问意见,活动,背景等

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

https://developer.android.com/training/testing/fundamentals.html#testing-pyramid

小testing是unit testing,可以独立于生产系统运行。 他们通常嘲笑每一个主要组件,并应该在你的机器上快速运行。

中等testing是集成testing,位于小testing和大testing之间。 他们集成了几个组件,并且运行在仿真器或真实设备上。

大型testing是通过完成UI工作stream程来运行的集成和UItesting。 他们确保关键的最终用户任务按照预期在仿真器或实际设备上工作。