应用测试

Android Studio 以简化测试为设计宗旨。 我们只需完成几次点击,便可建立一个在本地 JVM 上运行的 JUnit 测试,或建立一个在设备上运行的模拟测试。

Posted by donnieSky on July 20, 2017

Android Studio 以简化测试为设计宗旨。 我们只需完成几次点击,便可建立一个在本地 JVM 上运行的 JUnit 测试,或建立一个在设备上运行的模拟测试。

当然我们也可以通过集成测试框架来扩展测试方案,例如我们可以集成Mockito在本地单元测试中测试Android API调用,以及集成EspressoUI Automator在模拟测试中模拟用户交互。

可以利用Espresso-test-recorder自动生成Espresso测试。

测试类型和位置

回顾上篇博客Android测试入门

补充

  • 本地单元测试
    • 在运行时,这些测试的执行对象是去掉了所有final修饰符的修改版android.jar,这样一来,我们就可以使用Mockito等相关常见的模拟库。
  • 模拟测试
    • 由于模拟测试内置于APK中(与我们的应用分离),因此它们必须拥有自己的AndroidManifest.xml文件,不过由于Gradle会自动在构建时生成该文件,因此它在我们的项目目录中是不可见的,我们可以在必要时(例如需要为minSdkVersion指定其他值或注册测试专用的运行侦听器)添加自己的清单文件,构建应用时,Gradle会将多个清单文件合并成一个清单。

Gradle构建解析这些测试源代码的方式和解析应用源码的方式相同,我们可以利用这一点根据构建变体创建测试。

当我们新建项目或添加应用模块时,Andorid Studio会创建以下所列的测试源目录,并在每个测试目录中加入一个示例测试文件。

我们可以在Project窗口中看到如下所示: project-window-tests_2-2_2x

  • (1)模拟测试
  • (2)本地JVM测试

添加一个新的测试

要创建一个本地单元测试或模拟测试, 我们可以按照以下步骤新建针对特定类或方法的测试:

  1. 打开需要测试的代码的Java文件;
  2. 点击需要测试的类名或方法名,然后按Ctrl+Shift+T;
  3. 在出现的菜单中,点击Create New Test;
  4. Create Test对话框中,编辑任何字段并选择任何要生成的方法,然后点击OK;
  5. Choose Destination Directory对话框中,点击需要创建的测试类型对应的目录:
    • anroidTest对应模拟测试;
    • test对应本地单元测试。

然后点击OK。 也可以按如下所述在相应测试目录中创建一个通用的Java文件:

  1. 在左侧的Project窗口中,点击下拉菜单并选择Project视图;
  2. 展开对应的模块文件夹和嵌套的src文件夹;
    • 要添加本地单元测试,请展开test文件夹和嵌套的java文件夹;
    • 要添加模拟测试,请展开androidTest文件夹和嵌套的java文件夹;
  3. 右键点击Java软件包目录并选择New>Java Class;
  4. 命名文件,然后点击OK.

此外,必须在build.gradle文件中指定测试库依赖项:

dependencies {
    // Required for local unit tests (JUnit 4 framework)
    testCompile 'junit:junit:4.12'

    // Required for instrumented tests
    androidTestCompile 'com.android.support:support-annotations:24.0.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
}

构建适用于构建变体的模拟测试

如果项目包含的构建变体有唯一的Source set, 则我们需要相应的模拟测试源目录。

在源目录中创建与构建变体对应的模拟测试有助于保持测试代码的条理性,也便于运行特定的构建变体的测试。

要添加适用于构建变体的测试源目录,可只执行一下步骤:

  1. 在左侧的Project窗口中,点击下拉菜单并选择Project视图;
  2. 在相应的模块文件夹内,右键点击src文件夹,然后点击New>Directory;
  3. 输入androidTestVariantName作为目录名称
    • 例如:如果构建类型名为MyFlavor,则目录名称应为androidTestMyFlavor

然后点击OK,然后在该目录下创建一个java的目录。 现在我们就可以向这个源目录中添加测试了,当到达Choose Destination Directory对话框时,选择新的变体测试源目录。 src/androidTest/源目录中的模拟测试由所有构建变体共享,构建适用于应用的MyFlavor变体的测试APK时,Gradle会将src/androidTest/src/androidTestMyFlavor这两个源目录合并。

例如,下表显示的就是模拟测试文件所在源目录路径与应用代码源目录路径的对应关系:

应用类的路径 对应模拟测试类的路径
src/main/java/Foo.java src/androidTest/java/AndroidFooTest.java
src/myFlavor/java/Foo.java src/androidTestMyFlavor/java/AndroidFooTest.java

Gradle构建会合并和替换来自不同测试源目录的文件,这与它对应用源目录的处理方法完全相同, 如: androidTestMyFlavor源目录中的AndroidFooTest.java文件会替换成androidTest源目录中的版本。

为应用和测试源目录使用构建变体可以通过模拟依赖项创建封闭测试,实现不同环境下的模拟测试。

运行测试

  1. 点击工具栏中的Sync Project,确保项目与Gradle的同步;
  2. Project窗口中,右键点击测试,或者在代码编辑器中,右键点击测试文件中的某个类名或方法名,然后点击Run来测试该类中的所有方法(要运行所有测试,右键点击测试目录,然后点击Run tests)

默认情况表,测试运行时使用的是Android Studio默认的运行配置,如果需要更改某些运行设置(模拟器和部署选项),可以在Run/Debug Configurations对话框中编辑运行配置(点击Run>Edit Configurations)。

更改测试构建类型

默认情况下,所有测试都是针对Debug构建类型运行,可以利用应用module下build.gradle文件中的testBuildType属性将其改为其他构建类型。

如,需要针对staging构建类型运行测试:

android {
    ...
    testBuildType "staging"
}