- 设备单元测试
- 设置你的测试环境
- 创建设备单元测试类
- 创建测试套件
- 运行设备单元测试
- 使用Firebase Test Lab运行测试
设备单元测试
设备单元测试是运行在物理设备和模拟器上的测试,他们能够利用Android Framework APIs和supporting APIs,比如Android Testing Support Library。如果你的测试需要获取instrumentation信息(比如目标app的context)或者需要Android框架组件(比如Parcelable o或者SharedPreferences 对象)的实际实现,你应当创建设备单元测试。
使用设备单元测试也能够减少编写和维护模仿代码的工作量。你仍然能够使用模仿框架,如果你选择如此,来模拟任何依赖关系。
设置你的测试环境
在你的AndroidStudio工程中,你必须存储设备测试的源文件在路径 module-name/src/androidTest/java/ 下。在你创建新的工程时这个路径已经存在,并且包含了一个设备测试的例子。
在你开始之前,你应该下载 Android Testing Support Library Setup ,它提供了允许你对app快速构建和运行设备测试代码的APIs。Testing Support Library包含了一个JUnit 4 test runner 和功能UI测试的APIs(Espresso 和 UI Automator,链接见译文一)。
你还需要给你的工程配置Android测试依赖,以使用Testing Support Library提供的 test runner 和 规则(rule)。为了简化测试环境,你应当引入 Hamcrest 库,它能让你使用Hamcrest matcher APIs创建更加灵活的assertion。
在App的最高层级 build.gradle 文件中,你需要指定这些库作为依赖。
dependencies {
androidTestCompile 'com.android.support:support-annotations:24.0.0'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
// Optional -- Hamcrest library
androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
// Optional -- UI testing with Espresso
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
// Optional -- UI testing with UI Automator
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}
注意:如果你的构建配置包含了support-annotations 库的compile 依赖和espresso-core 库的androidTestCompile 依赖,你的构建由于依赖冲突可能失败。为了解决问题,像如下方法更新espresso-core依赖。
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
创建设备单元测试类
你的设备单元测试类应当编写成如同JUnit 4测试类。学习更多创建JUnit 4测试类和使用assertion以及annotation,查看”创建本地单元测试类”(译文第二篇)。
为了创建一个设备JUnit 4测试类,在测试类定义起始处添加注释@RunWith(AndroidJUnit4.class)。你还需要指定Android Testing Support Library 提供的 AndroidJUnitRunner为默认test runner。这一步骤在Getting Started with Testing(译文第一篇)中有详尽描述。
下面示例展示了你如何编写一个设备单元测试来测试LogHistory类的Parcelable 接口实现正确。
import android.os.Parcel;
import android.support.test.runner.AndroidJUnit4;
import android.util.Pair;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class LogHistoryAndroidUnitTest {
public static final String TEST_STRING = "This is a string";
public static final long TEST_LONG = 12345678L;
private LogHistory mLogHistory;
@Before
public void createLogHistory() {
mLogHistory = new LogHistory();
}
@Test
public void logHistory_ParcelableWriteRead() {
// Set up the Parcelable object to send and receive.
mLogHistory.addEntry(TEST_STRING, TEST_LONG);
// Write the data.
Parcel parcel = Parcel.obtain();
mLogHistory.writeToParcel(parcel, mLogHistory.describeContents());
// After you're done with writing, you need to reset the parcel for reading.
parcel.setDataPosition(0);
// Read the data.
LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel);
List<Pair<String, Long>> createdFromParcelData = createdFromParcel.getData();
// Verify that the received data is correct.
assertThat(createdFromParcelData.size(), is(1));
assertThat(createdFromParcelData.get(0).first, is(TEST_STRING));
assertThat(createdFromParcelData.get(0).second, is(TEST_LONG));
}
}
创建测试套件
为了组织设备单元测试的执行,你可以在一个test suite类中分组测试类,一起运行这些测试类。
一个test suite包含在一个测试包中,类似于主应用包。按照惯例,test suite的包名经常以 .suite的后缀结尾(比如com.example.android.testing.mysample.suite)。
为单元测试创建test suite,import JUnit的 RunWith和Suite类。在你的test suite中,添加 @RunWith(Suite.class) 和 @Suite.SuitClasses() 注释。在@Suite.SuitClasses() 中,列出单独的测试类或者test suite 作为参数。
以下示例展示了你如何实现一个分组并且CalculatorInstrumentationTest 和 CalculatorAddParameterizedTest 测试类一起运行的类名为UnitTestSuite的test suite。
import com.example.android.testing.mysample.CalculatorAddParameterizedTest;
import com.example.android.testing.mysample.CalculatorInstrumentationTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
// Runs all unit tests.
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorInstrumentationTest.class,
CalculatorAddParameterizedTest.class})
public class UnitTestSuite {}
运行设备单元测试
运行设备单元测试,遵循以下步骤。
- 点击工具栏的Sync Project ,确保工程和gradle同步。
- 用以下方式之一运行测试
- 运行单一测试,打开Project 窗口,然后右键点击一个测试并且点击Run
- 测试一个类中的所有方法,右键点击测试文件的一个类或者方法,然后点击Run
- 运行一个路径下的所有测试,右键点击该路径,然后选择Run Tests
Android的gradle插件编译位于缺省路径(src/androidTest/java/)的设备测试代码,构建一个测试APK和产物APK(production APK),将两个APK安装到连接的设备或者模拟器上,然后运行测试。Android Studio 然后在Run 窗口显示设备测试执行的结果。
当运行或者debugging设备测试,Android Studio 并不注入 Instant Run需要的额外方法和关闭特性。
使用Firebase Test Lab运行测试
使用Firebase Test Lab ,你可以在许多流行设备和设备配置(地区、屏幕方向、屏幕尺寸和平台版本)上同时测试App。这些测试运行在远端google数据中心的物理和虚拟设备上。你可以通过Android Studio 或者命令行直接部署app到Test Lab。测试结果提供了测试日志,并且包括任何App失败的详情。
在你开始使用 Firebase Test Lab之前,你需要依照如下操作,除非你已经有了Google账户和一个Firebase 工程。
- 如果你没有账户,创建一个Google账户 。
- 在Firebase控制台 ,点击Create new project。
在Spark计划:每日免费配额 之内,使用Test Lab测试App免费。
PS: 这一部分没翻译完,所剩不多,考虑到国内无法使用google服务/收费/我没这个需求,不在翻译剩余部分。