Android Studio中的Android Instrumentation测试和单元测试之间的区别?
Posted
技术标签:
【中文标题】Android Studio中的Android Instrumentation测试和单元测试之间的区别?【英文标题】:Difference between Android Instrumentation test and Unit test in Android Studio? 【发布时间】:2015-08-04 07:05:16 【问题描述】:从 android Studio 1.1rc 开始,有 Unit testing support 和 我想知道 Android Instrumentation 测试和单元测试有什么区别。
据我了解:单元测试对于测试不调用 Android 的代码很有用 API 和 Android 仪器测试 是相当集成的 测试以测试 Android API 特定元素或 GUI 组件。
但是,如果您在您的 单元测试,如果我没记错的话,你可以测试 Android 代码(不需要设备)。
这是正确的,还是有更大的不同?如果有,各有什么用?
【问题讨论】:
【参考方案1】:在我看来,仪器测试是一种集成测试,能够控制应用程序的生命周期和事件(onStart、onCreate 等)。
据我所知,单元测试是测试单元(例如类)的数据和行为。
例如,假设您有一个游戏:该游戏在一个活动(主要活动)上运行,并且您有一个基于 Robot 类的角色,该类有 2 个方法(开火和移动)。您将使用仪器测试来测试主要活动,以查看它在您离开应用程序时是否正确保存,当您恢复它时是否正确恢复等,您将使用单元测试测试机器人,以测试其属性和行为。
免责声明:我不是 java 人,但我对您的问题很感兴趣,并根据在线搜索进行了回答。您可能需要深入挖掘才能找到更详细的答案。
【讨论】:
【参考方案2】:单元测试 隔离被测组件,这就是为什么经常与 Mocks 框架一起使用的原因是 Mockito:因为将单元与其依赖项隔离开来。请注意您所说的关于 Android API 部分正确,因为还有Instrumented Unit tests,即Instrumentation 也是Junit 包的一部分,还有将TestCase 扩展为@ 类的类987654322@ 是 Junit 包的一部分,但允许使用 A)Context,您可以使用 getContext() 调用它,以及 B)属于 Android API 的资源!还请考虑 AndroidTestCase 是一个基类,还有其他几个非常有用的类可以扩展这个类。他们专门测试 Loaders、ContentProviders 甚至是 Services,而且他们还可以访问 Android API。所以这些类提供了 JUnit 测试框架以及 Android 特定的方法。现在有了 Junit4,ServiceTestRule 直接从 Object 扩展而来,让您可以更轻松地测试服务,尽管您不能直接在此类中启动 Intent。
仪器测试它们也在 Junit 包中,但对 Android API 的控制是相当全面的,因为仪器测试是在任何应用程序代码运行之前在系统中实例化的,并且您需要进行测试打开真正的应用程序(模拟器或通过 USB 连接的手机)。他们访问 android 组件(例如单击一个按钮)和应用程序生命周期,它们通常比扩展 TestCase(上面检查的那些)的 Junit 测试慢,典型的使用是具有功能测试方法的 ActivityInstrumentationTestCase2,更面向用户。
编辑:关于 Roboelectric 和 Mockito,它们与 Espresso 一起出现在目前最流行的测试框架之间(2016 年 7 月 13 日), Roboelectric 允许您在几秒钟而不是几分钟内运行多个测试,这对于必须运行持续测试并且需要持续集成的团队来说非常方便。
来自 Robolectric 的网站:
Robolectric 的另一种方法是使用模拟框架,例如 Mockito 或模拟 Android SDK。虽然这是一个有效的 方法,它通常会产生基本上是反向的测试 应用程序代码的实现。 Roboelectric 允许使用更接近黑盒测试的测试方式, 使测试更有效地重构并允许测试 专注于应用程序的行为而不是 安卓的实现。您仍然可以使用模拟框架 如果您愿意,可以使用 Robolectric。
也可以与 Junit 一起使用的 Mockito,除了在必须管理最终类、匿名类或原始类型时真正使用。
【讨论】:
【参考方案3】:单元测试
仅在本地计算机上运行的单元测试。这些测试是 编译为在 JVM 上本地运行以最小化执行时间。采用 这种运行单元测试的方法不依赖于 Android 框架或具有模拟对象可以满足的依赖项。
所以基本上,您运行纯 java 代码来测试例如内容提供程序、数据库连接、方法的输入和输出。这不能在 Android 上运行。要运行它,您不需要设备。
仪器测试
在 Android 设备或模拟器上运行的单元测试。这些测试有 访问 Instrumentation 信息,例如应用程序的上下文 正在测试中。使用这种方法运行具有 Android 的单元测试 模拟对象无法轻易满足的依赖关系。
因此它模拟了用户将如何使用实际应用程序,因此您需要一个设备(物理或模拟器)来运行它。它可以访问视图、活动、上下文等。
参考:http://developer.android.com/tools/testing/testing_android.html
【讨论】:
【参考方案4】:Android 测试
[Test types]
Android世界测试类型示意图
本地单元测试:JUnit、Mockito、PowerMock 仪表测试(一种功能测试):Espresso、Robolectric、Robotium
//Functional tests(Integration, UI)
src/androidTest/java
//Unit tests
src/test/java
[Run test via Command line]
[Test double types]
【讨论】:
【参考方案5】:单元测试:
单元测试通常被称为“本地测试”或“本地单元测试”。造成这种情况的主要原因似乎是您希望能够在没有连接设备或模拟器的情况下运行测试。
如果不模拟 Activity 等对象,单元测试就无法测试您应用的 UI。
仪器测试:
仪器测试在设备或模拟器上运行。在后台,将安装您的应用,然后还将安装一个测试应用,该应用将控制您的应用、启动它并根据需要运行 UI 测试。
仪表测试也可用于测试非 UI 逻辑。当您需要测试依赖于上下文的代码时,它们特别有用。
Ref link for example
【讨论】:
【参考方案6】:单元测试
它只在本地机器上运行。
仪器测试用例
它在安卓设备或模拟器上运行。如果你检查它在模拟器或安卓设备上运行的测试用例
【讨论】:
【参考方案7】:单元测试专注于一小部分代码(即类级别的方法),并提供基本验证代码是否按预期工作。 Espresso 测试提供 UI 是否按预期工作的基本验证。
【讨论】:
以上是关于Android Studio中的Android Instrumentation测试和单元测试之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章
从 android studio API 28 连接到解析服务器的 i/o 失败
我在所有活动和mainfest中的“this.something”中出现错误,android studio的xml
[Android Studio 权威教程]断点调试和高级调试