Instrumented 单元测试运行在物理设备或者模拟器上。他能使用 Android api 和一些 support api,例如 Android Testing Support Library。如果需要获取 instrumentation 信息(例如需要 app 的 context)或者需要 Android 框架里的一些组件(比如 Parcelable 或 SharedPreferences 对象),可以使用Instrumented 单测
使用Instrumented单元测试也有助于减少编写和维护mock 代码的工作量。如果你选择mock 的话,可以使用一个模仿的框架来mock 任何依赖关系。
设置编译环境
在 Android stuido 中 instrumented 测试代码在目录module-name/src/androidTest/java/中,当你创建一个新工程时,这个目录就已经有了,并包含了一个测试例子
在开始之前需要下载 e Android Testing Support Library ,它提供了快速测试的 api,包含了JUnit 4 和一些 UI 测试 (Espresso and UI Automator)
在 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 library 、 an androidTestCompile dependency和 the espresso-core ,会有依赖冲突,为了解决这个
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
使用JUnit 4测试类,确保工程指定AndroidJUnitRunner作为默认的测试工具
android {
defaultConfig {
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
构建一个 Instrumented 单测
在测试类前加上 @RunWith(AndroidJUnit4.class) 注解。
下面的示例演示如何编写一个Instrumented单元测试,用来测试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)
要组织执行instrumented单测,你可以在一个测试套件类中组一个测试类的集合,并一起运行这些测试。测试套件可以嵌套,您的测试套件可以组其他测试套件,并一起运行所有的组件测试类。
一个测试套件包含在一个测试包中,类似于主要应用程序包。按照惯例,测试套件包的名称通常以.suite 后缀(例如,com.example.android.testing.mysample.suite)。
单测的一个测试套件需要导入 JUnit 和 suite 类,在测试套件中加入@RunWith(Suite.class) and the @Suite.SuitClasses() 注解。在@Suite.SuitClasses() 注解中列出单独的测试类或测试套件作为参数
以下的例子创建了一个名叫 UnitTestSuite的测试套件。他包含了CalculatorInstrumentationTest and CalculatorAddParameterizedTest 两个测试类
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 {}
运行
略
测试系列博客目录
- Android 测试 (一)--测试总览 http://xuyushi.github.io/2016/11/05/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E4%B8%80%EF%BC%89--%E6%B5%8B%E8%AF%95%E6%80%BB%E8%A7%88/
- Android 测试 (二)--Instrumented Unit Tests http://xuyushi.github.io/2016/11/05/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E4%BA%8C%EF%BC%89--Instrumented%20Unit%20Tests/
- Android 测试 (三)--Local Unit Tests http://xuyushi.github.io/2016/11/06/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E4%B8%89%EF%BC%89--Local%20Unit%20Tests/
- Android 测试 (四)-- 实战分析 http://xuyushi.github.io/2016/11/13/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E5%9B%9B%EF%BC%89--%20%E5%AE%9E%E6%88%98%E5%88%86%E6%9E%90/