安卓自动化测试及单元测试

Posted zcchange1025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓自动化测试及单元测试相关的知识,希望对你有一定的参考价值。

参考谷歌的安卓自动化测试引导课程:http://developer.android.com/intl/zh-cn/training/testing/start/index.html

本地测试框架(功能测试)

Junit4

UI测试相关框架

Espresso
UI Automator

通用匹配符Matcher(用于断言,Hamcrest框架提供了一些相对通俗并高效的方法来进行一些junit比较困难的测试比如比较数值大小、字符串处理等)

Hamcrest

**本地测试**
dependencies

// Required -- JUnit 4 framework
testCompile 'junit:junit:4.12'
// Optional -- Mockito framework
testCompile 'org.mockito:mockito-core:1.10.19'

// Optional -- Hamcrest library,断言时匹配作用

androidTestCompile 'org.hamcrest:hamcrest-library:1.3'

import org.junit.Test;
import static org.junit.Assert.*;
public class ExampleUnitTest

@Test
public void addition_isCorrect() throws Exception 
    assertEquals(4, 2 + 2);
    //Hamcrest断言
    assertThat("abc.txt", containsString("c.t"));

**测试同时跑多个Case(同时也适用于跑联机程序)
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
/

  • Created by CMCC-ZHENGCHENG on 2016/2/19. */

@RunWith(Suite.class)
@Suite.SuiteClasses(com.example.cmcc_zhengcheng.myapplication.ExampleUnitTest.class,com.example.cmcc_zhengcheng.myapplication.MyTest.class)
public class TestSuit

联机测试优势 : 自动化测试UI交互。
Espresso :Single-App。主要用于测试Activity内对相关组件的执行是否满足期望。(可更精确的定位)
UI Automator : Cross-App。系统、应用间的来回交互。(偏向模糊定位)

dependencies

androidTestCompile 'com.android.support:support-annotations:23.0.1'
//测试运行器
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'
// 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.1'
// Optional -- UI testing with UI Automator
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'

联机测试运行时,需指定默认运行器
android

defaultConfig 
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

**UI Test相关注解**
类前添加注解
@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
标明只能在真机上测试
@RequiresDevice
测试所需时间由短至长
@SmallTest@MediumTest, and @LargeTest
其他注解
@Before 用于测试前的准备工作,初始化工作
@Test 具体的测试用例
@After 测试后的销毁工作

**Espresso前置条件 **
进入开发者选项、关闭窗口动画缩放、过渡动画缩放、动画程序时长缩放

TestRunner为AndroidJUnitRunner。

dependencies

 ...
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'

**Espresso使用步骤 **
1、找到相关组件
2、执行动作
3、验证结果是否符合预期

**Espresso涉及的主要类**
Matcher<View> viewMatcher及Matcher<? extends Object> dataMatcher
安卓匹配器,通过该匹配器,可以找到相关组件。
withId(R.id.editTextUserInput)
withData("sum")

ViewInteraction及DataInteraction
通过matcher获得的组件句柄。
onView(Matcher<View> viewMatcher)
onData(Matcher<? extends Object> dataMatcher)

ViewAction
句柄的行为,如点击,长按等。ViewInteraction.perform(ViewAction)
构造方法包括:
ViewActions.click() 注:点击事件
ViewActions.typeText() 注:输入文字事件

ViewAssertions
最终check结果是否符合预期。ViewInteraction.check(ViewAsssertions)
主要的构造方法:
matches(Matcher<? super View> viewMatcher
注:一般与ViewInteraction中的matcher相匹配
doesNotExist()

**UI Automator运行条件**
安卓4.3以上
TestRunner为AndroidJUnitRunner。
dependencies

...
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'

监视安卓UI布局工具:uiautomatorviewer 
打开cmd,进入/tools目录,输入uiautomatorviewer,连上手机,打开某个APP的界面。(目的在于参考别的客户端界面布局)

**UI Automator运行条件用到的组件**
UiCollection:界面组件的容器,一般是父组件(如FrameLayout)
UiScrollable: 可滑动组件的(如ListView),比如说想要某个可滑动列表,下面的组件在可见屏幕外,需要滑动上来并点击。
UiObject:具体的组件
UiSelector: 找到具体组件的查询条件
UiScrollable继承UiCollection继承UiObject

**UI Automator类的具体使用步骤**
1、UiDevice ,获取你需要测试的手机。
2、取得UiObject(包括UiCollection及UiScrollable)句柄。
3、获取的UiObject进行操各种作。
4、验证某些操作是否符合预期(可选,用Assert断言)

UiDevice

一般在@Before获取实例,相当于测试用例进行测试前的初始化

@Before

public void setUp()
    mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

在可见屏幕内找到想要操作的界面组件
UiObject
1、new UiObject(UiSelector)
2、UiDevice.findUiObject(UiSelector)
注:该中方法只能找到屏幕内可见组件
UiSelector
选择器,通过后续的方法条件来不断精确UiSelector实例,建造者模式。
new UiObject(Uiselctor.text("Cancel").className("android.widget.Button"));)

容器组件
UiCollection
new UiCollection(UiSelector)
一般通过UiSelector来找到外层的容器组件类(layout)
通过容器组件类可精确定位其内部组件
UiCollection videos = new UiCollection(new UiSelector()

.className("android.widget.FrameLayout"));

UiObject video = videos.getChildByText(new UiSelector()

.className("android.widget.LinearLayout"), "Cute Baby Laughing");

滑动组件(自身可滑动的组件,算是一种容器)
UiScrollable
new UiScrollable(UiSelector)
通过选择器找到可滑动组件,再通过可滑动组件找到内部子项。
优势:可找到当前屏幕不可见的组件,自动滑动搜索。
UiScrollable videos = new UiScrollable(new UiSelector()

.className("android.widget.ListView"));

UiObject video = videos .getChildByText(new UiSelector()

.className("android.widget.TextView"), "Cute Baby Laughing");

对组件进行操作
.click() 点击
.longClick()长按
.setText()输入文字
.dragTo()拖动
等等动作

**Test Android Service**
Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),服务向组件提供远程方法调用。

ServiceTestRule :类似于一个代理,提供一些简明的方法去启动服务,并且在测试完成会将自动关闭Service。

@Rule

public final ServiceTestRule mServiceRule = new ServiceTestRule();

**总结**
测试驱动开发,客户端的测试与后台测试不尽相同(后台主要为mock接口测试,客户端主打UI自动化测试及相关工具类的功能测试),但对于开发者的正面引导作用是同样积极的。

本篇的所谓“本地测试”Juint4框架,一般用于测试Tools类的效果是否达标。Espresso和UI Automator是两种不同的界面测试框架,效果同中存异且相互互补,视具体情况抉择,如果是自己开发的项目自己测试,使用Espresso能更加简单的找到你想要控制的组件,对于自己的应用与其他应用之间的交互或者需要去验证其他应用,UI Automator可能更加合适。当然,两者是可以同时使用的。

客户端的自动化测试不仅可以减少测试人员的工作量,且能更加精准快速的复现问题,强化项目迭代效率。


代码稍后奉上

以上是关于安卓自动化测试及单元测试的主要内容,如果未能解决你的问题,请参考以下文章

软件测试之道4 - 自动化测试之单元及集成测试

译安卓中的自动化测试

测试计划及测试矩阵

Java 单元测试及JUnit的使用

Selenium基于Python web自动化基础二 -- 免登录等待及unittest单元测试框架

Android怎样进行单元测试