Android测试详解_3-Building Instrumented Unit Tests-创建仪器单元测试

英文官方链接

写在前面

仪器单元测试是运行在物理设备或模拟器上的测试,它可以使用高级的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 {}

运行仪器单元测试

运行仪器测试,分以下几步:

  1. 同步项目的gradle文件。
  2. 通过以下几种方式运行测试:
    · 运行单个测试,打开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。
注:这不是一项免费的服务,所以,没有往下进行。如果有兴趣,可以看原文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值