写在前面
仪器单元测试是运行在物理设备或模拟器上的测试,它可以使用高级的Android框架API以及支持库API,例如Android Testing Support Library。你可以创建仪器单元测试,如果测试需要获取仪器信息(比如目标应用的上下文),或者请求实际的Android框架组件的接口(例如Parcelable、SharedPreference对象)。
使用仪器单元测试也会帮助我们减小编写和维护mock代码的开销。仍然可以自由的使用mocking框架,如果你使用它,可以模拟任何依赖关系。
设置测试环境
在AS项目中,你必须把仪器测试的资源文件放到module-name/src/androidTests/java/目录下。这个目录在你创建新项目时就已经存在了。
开始之前,下载the Android Testing Support Library Setup(简单梳理一下步骤:1.打开Android SDK Manager.
2.在SDK Manager窗体里,滚动到Packages的底部, 找到 Extras 文件夹, 如果有必要,展开显示里面的内容。
3.选择Android Support Repository 项.
4.点击Install packages按钮.
),它提供的api可以让你快速的创建和运行仪器测试代码给你的app。这个测试支持库包括一个Junit4的测试运行器(AndroidJUnitRunner),和功能界面测试API(Espresso、UI Automator)。
你还需要给项目配置Android测试依赖,使用Testing Support Library提供的测试运行器和规则API。为了简化你的测试环境,还需引入Hamcrest库,使用Hamcrest matcher API 能让你创建更灵活的断言(Assertions)。
在你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'
}
使用Junit4类,需要确认指定AndroidJUnitRuner作为你的项目的默认测试仪器运行器,通过引入下面的设置在你的app的module层级的build.gradle文件中:
android {
defaultConfig {
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
创建仪器测试类
你的仪器单元测试类应该按照Junit4的测试类那样写。关于Junit4测试类的学习请看上篇文章:Local Unit Test。
创建仪器单元测试类,需要在类名开头添加@RunWith(AndroidJUnit4.class)注解。你还需要指定AndroidJUnitRunner类提供的Android Testing Support Library作为默认的测试运行器。
下面的示例展示的是实现Parcelable接口的LogHistory类的仪器单元测试:
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));
}
}
创建测试套件
组织执行你的仪器测试,你可以把测试类集成到一个测试套件里,一起运行它们。测试套件是可以嵌入的;你的测试套件可以集成其他的测试套件,一起运行所有的组件测试类。
一个测试套件包含在一个测试包里(package),比主应用包要小。按照惯例,测试套件包名通常以.suite后缀结束(例如:com.example.android.testing.mysample.suite)。
给你的单元测试创建一个测试套件,要导入JUnit RunWith 和Suite类。在你的测试套件里,添加@RunWith(Suite.class)和@Suite.SuiteClasses()注解。在@Suite.SuiteClasses注解里,作为参数列出个别的测试类或测试套件。
下面的示例展示的是如何实现一个叫做UnitTestSuite的测试套件,它集成并运行CalculatorInstrumentationTest 和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 {}
运行仪器单元测试
运行仪器测试,分以下几步:
- 同步项目的gradle文件。
- 通过以下几种方式运行测试:
· 运行单个测试,打开Project窗体,右击一个测试并选择Run。
· 运行一个类的所有方法,右击测试文件里的一个类或方法,选择Run。
· 运行目录下的所有测试,右击目录,选择Run Tests。
Android插件Gradle编译位于默认路径 (src/androidTest/java/)下的仪器测试代码,创建一个测试apk和产品apk,把两个都安装到链接的设备上,并运行测试。AS在Run窗体中显示仪器测试执行的结果。
运行带有Firebase Test Lab的测试
使用Firebase Test Lab,你可以同时测试app在很多流行的Android设备上并设置例如场所、方向、屏幕大小,以及平台版本。这些测试运行在远程的Google数据中心。你可以通过AS或命令行部署到Firbase Test Lab。
注:这不是一项免费的服务,所以,没有往下进行。如果有兴趣,可以看原文。