最近在作Android上的自动化测试,从最初的第三方自动化测试框架appium到后来的Android Support Testing Library,再到最终完成答疑君Android客户端一些核心流程的自动化测试,期间也是经历了各类大大小小的坑。这个系列的文章也是想经过描述整个探索道路来记录一下整个Android自动化测试的入门过程,同时也采用了我本身所喜欢的step by step的模式来介绍整个流程,以便你们能够很快地操做起来。
可是,在开始的开始,我认为每一种语言或者特性可能在不一样的环境中都有不一样的实现方式,因此有必要在此贴上个人一些开发环境以做参考:
IDE: Android Studio
Android SDK: API Level 23
gradle version: 2.8
build tool version: 23.0.2
测试环境:真机(Nexus 6 with Android 6.0.1; MIUI phones若干)java
曾经和gemini聊到机器人统治地球的问题(这好像是异教徒们的愿景orz...),后来想了想自动化测试这个东西其实也是,让机器去模仿人的行为,让它本身去统治整个测试工做。既然是去模仿人的行为,那实际上也应该认为机器只能理解人所能理解的东西。比方说,当我去人为地作一些测试的时候,我所期待的只是UI上的变化能够符合个人预期,至于它背后的数据是怎样的实际上我并不care。所以,在作自动化测试时我我的有个最基本的思路:android
把本身当成用户,只关注我能看到的东西。
好了!终于能够开始了!既然是采用Gradle进行Android工程的构建,那天然是少不了Gradle的配置啦!根据Gradle官方文档的说明,咱们首先须要在咱们工程的build.gradle中添加以下配置:segmentfault
android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } }
这里实际上只作了一件事情,就是为咱们的工程指定一个TestInstrumentationRunner,TestInstrumentationRunner是用来跑咱们所写的全部的测试用例的。当咱们采用test的模式来构建工程时,这个Runner便会自动为咱们执行全部的的测试用例,而且返回相应的测试结果。
另外,咱们还须要在build.gradle中增长instrumentation testing所须要的依赖:app
dependencies { androidTestCompile 'com.android.support:support-annotations:23.1.1' androidTestCompile 'com.android.support.test:runner:0.4.1' androidTestCompile 'com.android.support.test:rules:0.4.1' }
好了!咱们如今有工具来跑测试了,接下来只要添加咱们的测试用例了!因而问题来了,咱们应该在哪里添加测试用例呢?
若是你在Android Studio中新建一个工程,会发如今src目录下,和main平行的还有一个androidTest目录。通常而言,咱们将工程代码放在src/main/java目录下,将与之相关的测试代码放在src/androidTest/java目录下。以下所示:框架
src/ androidTest/java ----这里存放instrumentation test相关的代码 main/java ----这里存放工程代码
同时,为了让工程更容易维护,建议将相应Class的测试代码放到相同名称的包下面,好比,在Package-name下面有一个Class A:ide
src/main/java/package-name/A.java
那么,建议将A的测试类放到androidTest下面对应的路径下:工具
src/androidTest/java/package-name/ATest.java
好了!我要开始变身了!下面咱们要向testing的世界say hello了!
我在package-name/module/main包下面有一个AppStartActivity,做为答疑君的启动页。在这个启动页上会显示一段文字,我但愿经过自动化测试来确认这个文字确实显示在了屏幕上。测试
因而,我应该在androidTest/package-name/module/main下面建立一个AppStartActivityTest类,键入以下代码:gradle
package im.dayi.app.student.module.main; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.ActivityInstrumentationTestCase2; import android.widget.TextView; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * Test for AppStartActivity * Created by Anchorer on 2016/1/13. */ @RunWith(AndroidJUnit4.class) public class AppStartActivityTest extends ActivityInstrumentationTestCase2<AppStartActivity> { private AppStartActivity mActivity; private TextView mContentView; public AppStartActivityTest() { // 全部的ActivityInstrumentationTestCase2子类都须要调用该父类的super(String)构造方法 super(AppStartActivity.class); } @Before public void setUp() throws Exception { super.setUp(); // @Before注解表示在执行全部的testCase以前要作的事情 injectInstrumentation(InstrumentationRegistry.getInstrumentation()); // getActivity()方法会在开始全部的testCase以前启动相应的Activity mActivity = getActivity(); // findViewById()很熟悉吧?找到我要测试的控件 mContentView = (TextView) mActivity.findViewById(R.id.welcome_content); } @Test public void testPreconditions() { // @Test注解表示一个测试用例方法 assertNotNull("AppStartActivity is null", mActivity); } @Test public void testContentDisplayed() { // 这里就是咱们测试的目标,判断目标控件的text不为空 String content = mContentView.getText().toString(); assertNotNull("AppStartActivity Content is Null", content); } }
相关代码的说明请见注释。ui
接下来,我要开始跑这个测试用例了。首先,打开Android Studio的Build variants窗口,将Test Artifact设为Android Instrumentation Tests,而后Synchronize一下工程,会看到androidTest路径下的背景颜色变成了绿色。
此时,在AppStartActivityTest.java点击菜单,选择Run 'AppStartActivityTest...',就能够从控制台看到测试已经在跑了:
从控制台的日志来看,整个测试过程初期,会向测试设备安装两个APK:APP APK和test APK。整个测试结束以后,会看到测试结果:
以上测试结果说明,全部test case所有测试经过。
好了!这就是整个自动化测试的大致流程了!接下来我已经火烧眉毛地想要把Android强大的自动化测试提供的特性分享出来了!!
Android自动化测试-从入门到入门(1) Hello Testing!
Android自动化测试-从入门到入门(2) Testing APIs
Android自动化测试-从入门到入门(3) Espresso入门
Android自动化测试-从入门到入门(4) uiautomatorviewer
Android自动化测试-从入门到入门(5) AdapterView的测试
Android自动化测试-从入门到入门(6) 会玩的Espresso
Android自动化测试-从入门到入门(7) UI Automator