根据该系列文章的第一篇:Hello Testing,你们已经对整个自动化测试运行流程有了一个基本的了解,接下来咱们该集中精力关注具体的脚本实现了!在具体实现以前,咱们先来了解一下Android提供的对于自动化测试的一些支持。html
根据Android官网的说法,android
The AndroidJUnitRunner class is a JUnit test runner that lets you run JUnit 3 or JUnit 4-style test classes on Android devices, including those using the Espresso and UI Automator testing frameworks. The test runner handles loading your test package and the app under test to a device, running your tests, and reporting test results. This class replaces the InstrumentationTestRunner class, which only supports JUnit 3 tests.segmentfault
AndroidJUnitRunner
是一个能够用来运行JUnit 3
和JUnit 4
样式的测试类的Test Runner,而且同时支持Espresso
和UI Automator
。这是对于以前的InstrumentationTestRunner
的一个升级,若是你去查看Gradle文档中对于Testing配置的说明,会发现推荐的Test Runner为InstrumentationTestRunner
。InstrumentationTestRunner
只支持JUnit 3
样式的测试用例,而咱们在写Android测试用例时应该尽量使用JUnit 4
样式来实现。app
相对于Junit 3
, JUnit 4
有以下改进:ide
测试类不须要再继承junit.framework.TestCase
类;测试
测试方法名再也不须要以test
开头;ui
可使用相似@Test
, @Before
, @After
等注解来管理本身的测试方法;rest
增长了一些Assert
方法;code
支持对assert
方法的static
导入。component
下面来看一个例子。以下的代码段采用了JUnit 4
风格进行编写,而且调用了Espresso
的API来进行了一些测试:
@RunWith(AndroidJUnit4.class) @LargeTest public class MainActivityInstrumentationTest { @Rule public ActivityTestRule mActivityRule = new ActivityTestRule<>( MainActivity.class); @Test public void sayHello(){ onView(withText("Say hello!")).perform(click()); onView(withId(R.id.textView)).check(matches(withText("Hello, World!"))); } }
从以上代码能够看到,JUnit 4
支持使用以下注解来管理整个测试用例:
@Before
: 标识在运行测试方法以前运行的代码。能够支持同一个Class中有多个@Before
,可是这些方法的执行顺序是随机的。该注解替代了JUnit 3
中的setUp()
方法。
@After
: 标识在运行测试方法结束以后运行的代码。能够在其中作一些释放资源的操做。该注解替代了JUnit 3
中的tearDown()
方法。
@Test
: 标识一个测试方法。一个测试类中能够有多个测试方法,每一个测试方法须要用一个@Test
注解来标识。
@Rule
: 简单来讲,是为各个测试方法提供一些支持。具体来讲,好比我须要测试一个Activity,那么我能够在@Rule
注解下面采用一个ActivityTestRule
,该类提供了对相应Activity的功能测试的支持。该类能够在@Before
和@Test
标识的方法执行以前确保将Activity运行起来,而且在全部@Test
和@After
方法执行结束以后将Activity杀死。在整个测试期间,每一个测试方法均可以直接对相应Activity进行修改和访问。
@BeforeClass
: 为测试类标识一个static方法,在测试以前只执行一次。
@AfterClass
: 为测试类标识一个static方法,在全部测试方法结束以后只执行一次。
@Test(timeout=<milliseconds>)
: 为测试方法设定超时时间。
根据官方的说法,
Android instrumentation is a set of control methods or hooks in the Android system. These hooks control an Android component independently of its normal lifecycle. They also control how Android loads applications.
Android Instrumentation
提供了一些方法,能够用来独立地控制某个组件的生命周期。
通常来讲,Android中组件的生命周期是由系统来控制的。好比,咱们启动了一个Activity,那么Activity的生命周期方法会自动为咱们调用,Android APIs并无提供入口让咱们直接去调用这些生命周期方法,可是使用Instrumentation
就能够作到。
Instrumentation
能够将要测试的APP以及其对应的test Package加载到同一个进程中。因为咱们所要测试的组件和其测试用例都运行在同一进程,所以咱们就能够在咱们的测试用例中直接调用组件的方法,对组件作一系列访问和修改。
Android为自动化测试提供了以下的API供咱们使用:
AndroidJUnitRunner
: 以上已经提到;
Espresso
: 提供了UI测试的API;
UI Automator
: 提供了跨APP UI测试的API。
Espresso
和UI Automator
会在接下来的文章中详细说明。
在作测试的过程当中,咱们应该如何检查实际的结果符合咱们的预期呢?
这里就要用到了Assertion Classes
。Assertion Classes
提供了一系列assert
方法用来比对咱们检测的数据和指望的数据是否一致,若是检测失败,则会抛出一个AssertionException
异常。
比方说在上一篇文章中贴出来的AppStartActivityTest
代码中,有这么一行:
assertNotNull("AppStartActivity Content is Null", content);
这一行代码就是检查content
的内容不为空。其中第一个参数指定了一个提示文案,第二个参数指定了须要测试的字符串。
为了简化咱们的测试代码,在以后的测试中,咱们还会使用到一个叫作Hamcrest
的类库,用来简化咱们的Assertion
过程。这些都将会在接下来的文章中一一介绍。
Android自动化测试-从入门到入门(1) Hello Testing!
Android自动化测试-从入门到入门(2) Testing APIs
Android自动化测试-从入门到入门(3) Espresso入门
Android自动化测试-从入门到入门(4) uiautomatorviewer
Android自动化测试-从入门到入门(5) AdapterView的测试
Android自动化测试-从入门到入门(6) 会玩的Espresso
Android自动化测试-从入门到入门(7) UI Automator