Android测试官方教程翻译(一)--Android 测试介绍

来源:互联网 发布:按键精灵安卓淘宝滑动 编辑:程序博客网 时间:2024/05/24 03:23
  • 本篇博文只是Android开发者网站google官方关于Android测试资料的翻译,本篇是第一篇,其余测试资料会选择性翻译。
  • 文章为本人自己翻译,只为自己加深理解,也希望能够帮助别人。
  • 译文中所有超链接已经添加,有的是官方链接,有的是Github链接,官方链接中有的已经翻译成汉语,不要忘记查看。
  • 翻译中难免出现谬误,如果有错误,敬请指出。
  • 官方原文Getting Started With Testing

  • Android测试初涉
    • Test Types 测试类型
    • Test APIs 测试API
      • Junit
      • Android Testing Support LibraryAndroid 测试支持库
      • Assertion classes
      • Monkey and monkeyrunner
    • Guides for Building Android Tests创建Android测试指导

Android测试初涉

Android测试基于JUint,可以在JVM(Java虚拟机)上作为本地单元测试运行,或者在Android设备上作为设备测试运行。本页面提供创建Android测试的概念以及工具介绍。

Test Types (测试类型)

当用AndroidStudio编写测试,你的测试代码必须归类到两个不同的代码路径(资源集)中。对于你的工程中的每一个module,AndroidStudio包含这两个资源集,对应于以下测试类型。

Local Unit Test (本地单元测试)
路径:module-name/src/test/java/.

这些测试(就是在这个测试代码路径中的测试代码)运行在本地JVM上,不能够获取功能型Android Framework API。

开始学习,请查看Building Local Unit Tests

Instrumented tests(设备测试)
路径: module-name/src/androidTest/java/

这些测试必须运行在Android硬件设备上或者Android 模拟器上。

设备测试被构建进一个APK,该APK与测试的APP运行在设备上。系统在同一进程中运行你的测试APK和测试的app,所以你的测试能够调用你APP中的方法和修改field(域),能够自动化你的APP的用户交互。

获取如何创建设备测试更多信息,查看以下话题。

  • Building Instrumented Unit Tests(创建设备单元测试):使用模拟对象(Mock Object)不能满足的Android Dependencies创建复杂的单元测试。

  • Automating User Interface Tests(自动化用户界面测试):创建测试以验证单APP中用户交互或者跨APP用户交互情况下用户界面行为正确性。

  • Testing App Component Integrations(测试APP组件集成): 验证用户并不直接交互的组件的行为,例如组件Service和ContentProvider。

测试类型图示

然而,local unit tests(本地单元测试)和instrumented tests(设备测试)仅仅是帮助区别运行在本地JVM和Android平台(硬件设备或者模拟器)上的测试的术语,当创建一个完善的测试套件,你需要了解的真实测试类型见下表

类型 子类型 描述 Unit Tests
(单元测试) Local Unit Tests
(本地单元测试) 运行在本地JVM上的单元测试。当你的测试没有Android Framework依赖或者当你能够模仿Android Framework依赖,使用这种测试以最小化测试执行时间 Instrumented unit tests
(设备单元测试) 运行在Android设备或者模拟器上的Android测试,这些测试能够获取 [Instrumentation](https://developer.android.com/reference/android/app/Instrumentation.html)信息,比如你测试app的context。当模仿对象无法满足Android Dependency时,使用这种测试。 Integration Tests
(集成测试) Components within your app only
(仅App内组件) 这种测试类型验证当用户在Activity中执行特定操作或者输入特定输入时,目标App动作行为如同预期。比如,它允许你检查App的activity的用户交互,目标App返回正确的响应用户交互的UI输出。UI测试框架,像 [Espresso](https://developer.android.com/topic/libraries/testing-support-library/index.html#Espresso) ,使你能够程序模拟用户动作和测试复杂的App内用户交互 Cross-app Components
(跨App组件) 这种类型测试验证不同App之间或者用户App与系统App之间的交互行为正确性。比如,你想要测试当用户在Android设定菜单中执行操作,你的App动作正确。支持跨App交互的UI测试框架,比如[ UI Automator](https://developer.android.com/topic/libraries/testing-support-library/index.html#UIAutomator),使你能够创建这种情境下的测试。

Test APIs (测试API)

以下是在Android上测试app的常用API

Junit

你应该将单元或者集成测试类编写成一个JUnit4 测试类,框架提供了方便的方式以完成你的测试中的通用setup、teardown和assertion 操作。

一个基本的JUnit 4 测试类是一个JAVA类,包含了一个或者多个测试方法。一个测试方法以 @Test作为注释,包含你想要测试组件的单一功能(逻辑单元)的执行与验证代码。

以下例子展示了JUnit4 集成测试,使用Espresso APIs 来执行UI的点击操作,然后检查显示的字符串是否如同预期结果。

@RunWith(AndroidJUnit4.class)@LargeTestpublic class MainActivityInstrumentationTest {    @Rule    public ActivityTestRule mActivityRule = new ActivityTestRule<>(            MainActivity.class);    @Test    public void sayHello(){        onView(withText("Say hello!")).perform(click());        onView(withId(R.id.textView)).check(matches(withText("Hello, World!")));    }}

在JUnit4 测试类中,你可以通过使用如下注释来调用你代码中的代码,以完成特殊处理。

1、@Before :使用该注释用以明确一个代码块包含测试setup操作。测试类会在每一个测试之前调用这一代码块。你可以有多个@Before方法,但是测试类调用@Before方法的顺序并不能得到保证。

2、@After :该注释明确一个代码块包含测试tear-down 操作。测试类在每一个测试方法之后调用该代码块,你可以在测试代码中定义多个@After操作,使用该注释来释放内存资源。

3、@Test :使用该注释来标记一个测试方法,一个测试类可以有多个测试方法,每一个测试方法以@Test 作为前缀。

4、@Rule :允许你以可重用方式灵活的添加或者重新定义每一个测试方法的行为。在Android测试中,该注释和Android Testing Support Library提供的测试规则类配合使用,例如ActivityTestRule 或者 ServiceTestRule.

5、@BeforeClass :使用该注释以为每一个测试类指定静态方法,只能调用一次。对于昂贵的操作,例如连接数据库,这一测试步骤非常有用。

6、@AfterClass : 使用该注释为测试类指定静态方法,仅在类中的测试全部运行之后调用。对于释放 @BeforeClass 代码块中分配的资源,这一测试步骤十分有用。

7、@Test(timeout=) :一些注释支持可设定值。例如你可以指定测试的timeout。如果测试开始,但是在规定的timeout时间内未完成,它会自动失败,你必须以毫秒为单位明确timeout,例如@Test(timeout=5000).

获取更多注释,查看 JUnit annotations 以及Android annotations的文档

使用JUnit的assert类来验证一个对象状态的正确性,assert方法比较测试期望值和实际结果,如果比较失败抛出一个异常, Assertion classes 更详尽的描述这些方法。

Android Testing Support Library(Android 测试支持库)

Android Testing Support Library 提供了一套API,让你能够对你的APP快速创建以及运行测试代码,包括JUnit4和功能型UI测试。该库包括以下基于 instrumentation的API,当你想自动化测试时非常有用。

AndroidJUnitRunner
Android版与JUnit4兼容的测试运行器

Espresso
UI测试框架,适用于单个app中功能型UI测试

UI Automator
UI测试框架,适用于系统及已安装app间的跨app功能型UI测试

Assertion classes

因为 Android Testing Support Library APIs继承自JUnit,你可以使用assertion方法来显示测试结果。一个assertion方法比较一个测试返回的实际值和一个预期值,如果比较失败会抛出异常。使用assertion比打日志更加方便,提供更优测试性能。

为了简化测试开发,你可以使用 Hamcrest library,使用 Hamcrest matcher APIs能创建更加灵活的测试。

Monkey and monkeyrunner

Android SDK包含了两款功能级app测试工具

Monkey
这是一个命令行工具,给一个设备发送伪随机的按键、触摸、手势流。 使用Android Debug Bridge (adb) 运行它,使用它对app进行压力测试,报告遇到的错误,或者通过使用相同的随机数字种子运行该工具多次来重复事件流。

Monkeyrunner
该工具是为Python编写测试程序提供API和执行环境。API的功能包含连接设备、安装卸载包、截屏、比较两张图片、运行测试包。使用这个API你能够创建大的、强悍的、复杂的测试。

Guides for Building Android Tests(创建Android测试指导)

关于如何创建以及运行不同测试类型,以下文档提供更详细信息

Building Local Unit Tests(创建本地单元测试)
创建运行在本地JVM上的单元测试,测试不需要依赖(dependency)或者仅仅需要简单的能够模仿的依赖。

Building Instrumented Unit Tests(创建设备单元测试)
使用模仿对象不能满足的Android Dependencies创建运行在硬件设备或者模拟器上的复杂单元测试。

Automating User Interface Tests(自动化用户界面测试)
创建测试以验证单App中用户交互或者跨App交互的用户界面行为正确性。

Testing App Compontent Integrations(测试App组件集成)
验证用户并不直接交互的组件的行为,比如service和contentprovider

Testing Display Performance(测试显示性能)
编写测定App UI性能的测试,以确保连贯平滑的用户体验。

0 0