安卓自动化测试及单元测试
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可能更加合适。当然,两者是可以同时使用的。
客户端的自动化测试不仅可以减少测试人员的工作量,且能更加精准快速的复现问题,强化项目迭代效率。
代码稍后奉上
以上是关于安卓自动化测试及单元测试的主要内容,如果未能解决你的问题,请参考以下文章