从Android Studio 1.1rc开始,有Unit testing support和
我想知道Android Instrumentation Tests和Unit测试之间有什么区别。
据我所知:
单元测试对于测试不调用Android的代码非常有用
API和 Android检测测试相当集成
测试以测试Android API特定元素或GUI组件。
但是,如果您在自己的框架中使用 Robolectric 或 Mockito 等框架 单元测试,如果我没弄错的话,你可以测试Android代码(不需要设备)。
这是正确的,还是有更大的区别?如果是这样,每个人的用途是什么?
答案 0 :(得分:40)
在我看来,仪器测试是集成测试,能够控制应用程序的生命周期和事件(onStart,onCreate等)。
单元测试,据我所知,正在测试一个单元(例如Class)的数据和行为。
例如,假设你有一个游戏:这个游戏运行在一个活动(主要活动)上,你有一个基于机器人类的角色,它有两种方法(射击和移动)。您将使用检测测试来测试主要活动,以确定当您离开应用程序时它是否正确保存,是否在恢复时正确恢复等等,并且您将使用单元测试测试Robot,以测试其属性和行为。 / p>
免责声明:我不是一个java人,但我对你的问题感兴趣,我在网上进行了一次小搜索。您可能需要深入研究这个以找到更详细的答案。
答案 1 :(得分:29)
单元测试隔离被测组件,这就是为什么经常与Mock框架一起使用的原因:Mockito:因为将单元与其依赖关系隔离开来。请注意您对Android API的说法部分正确,因为还有Instrumented Unit tests,即 Instrumentation也是Junit包的一部分,以及扩展TestCase的类class AndroidTestCase是Junit包的一部分,但允许使用A)Context,您可以使用getContext()调用,以及B)作为Android API一部分的资源!另外请考虑AndroidTestCase是一个基类,还有其他几个类非常有用,可以扩展这个类。他们专门测试Loaders,ContentProviders甚至服务,并且他们也可以访问Android API。所以这些类提供了JUnit测试框架以及特定于Android的方法。现在有了Junit4,ServiceTestRule直接从Object扩展,让您更容易测试服务,尽管您无法直接在此类中启动Intent。
检测测试它们也属于Junit包,但Android API的控制非常全面,因为在运行任何应用程序代码之前,系统会在系统中实例化测试,并测试您是否需要打开真实应用程序(模拟器或连接USB的手机)。他们访问Android组件(例如,单击按钮)和应用程序生命周期,它们通常比扩展TestCase(上面检查过的)的Junit测试慢,典型的用途是ActivityInstrumentationTestCase2,它具有功能测试方法,更加面向用户。
编辑:关于Roboelectric和Mockito,目前最流行的测试框架(2016年7月13日)与Espresso相关, Roboelectric允许您在几秒钟而不是几分钟内运行多个测试,这对于必须运行连续测试并且需要持续集成的团队来说非常方便。来自Robolectric的网站:
Robolectric的另一种方法是使用模拟框架,例如 Mockito或模拟Android SDK。虽然这是有效的 方法,它经常产生基本上相反的测试 应用程序代码的实现。 Roboelectric允许更接近黑盒测试的测试风格, 使测试更有效的重构和允许测试 专注于应用程序的行为而不是 Android的实现。您仍然可以使用模拟框架 如果你愿意,可以使用Robolectric。
Mockito也可以与Junit一起使用,除了必须管理最终类,匿名类或原始类型之外,确实可以使用。
答案 2 :(得分:24)
单位测试
仅在本地计算机上运行的单元测试。这些测试是 编译为在JVM上本地运行以最小化执行时间。使用 这种方法可以运行不依赖于的单元测试 Android框架或具有模拟对象可以满足的依赖项。
所以基本上,你运行普通的java代码来测试例如内容提供者,数据库连接,方法的输入和输出。这不会在Android上运行。要运行它,你不需要设备。
仪器测试
在Android设备或模拟器上运行的单元测试。这些测试有 访问Instrumentation信息,例如应用程序的Context 在测试中。使用此方法运行具有Android的单元测试 模拟对象无法轻易满足的依赖关系。
因此它模仿用户将如何使用实际应用程序,因此您需要一个设备(物理或模拟器)来运行它。它可以访问视图,活动,上下文等。
参考:http://developer.android.com/tools/testing/testing_android.html
答案 3 :(得分:3)
单元测试
这些小型且高度专注的测试可以直接在本地开发计算机上运行,并且由于它们直接在本地环境上运行,因此运行速度非常快,执行时间也非常短。
集成测试
这些测试实际上将在真实设备上而非本地计算机上运行,并且旨在测试不同模块之间的集成。
端到端测试
但是这些测试的保真度要高得多,因为这些测试也在实际设备上运行,并且这些测试的范围要大得多,因为它们正在测试一个完整的功能或完全端对端的流程。
单元测试:
UI测试:
答案 4 :(得分:0)
https://developer.android.com/training/testing/fundamentals.html#testing-pyramid
小型测试是可以与生产系统隔离运行的单元测试。它们通常会模拟每个主要组件,并且应该在您的计算机上快速运行。
中等测试是在小测试和大型测试之间进行的集成测试。它们集成了多个组件,并且可以在仿真器或真实设备上运行。
大型测试是通过完成UI工作流程运行的集成和UI测试。它们确保关键的最终用户任务在仿真器或真实设备上按预期工作。
答案 5 :(得分:0)
单元测试:
单元测试通常称为“本地测试”或“本地单元测试”。这样做的主要原因似乎是您希望能够在没有连接设备或模拟器的情况下运行测试。
单元测试无法在不模拟活动等对象的情况下测试应用程序的UI。
<小时/> 仪器测试:
仪器测试在设备或模拟器上运行。在后台,您的应用程序将被安装,然后还将安装一个测试应用程序,它将控制您的应用程序,启动它并根据需要运行UI测试。
Instrumentation测试也可用于测试无UI逻辑。当您需要测试依赖于上下文的代码时,它们特别有用。
<小时/> Ref link for example
答案 6 :(得分:0)
单元测试
它仅在本地计算机上运行。
仪器测试用例
它在Android设备或模拟器上运行。如果您检查它在模拟器或Android设备上运行的测试用例
答案 7 :(得分:0)
答案 8 :(得分:0)
单元测试专注于代码的一小部分(即类级方法),并提供代码按预期工作的基本验证。 Espresso 测试提供 UI 是否按预期工作的基本验证。