Android自动化测试框架---Espresso(1)
来源:互联网 发布:交换机环路端口关闭 编辑:程序博客网 时间:2024/06/05 03:16
导语
从这周开始负责编写维护项目的测试用例,主要的工作都是围绕google推出的针对Android的自动化测试框架Espresso,这篇博客主要用于记录有关Espresso的学习与使用心得。
首先,先简单介绍一下Android自动化测试的思想。实际上就是通过测试用例,去模仿人的行为,我们主要关注的是测试用例出现后,手机上的UI(或者说是代码运行的流程)是否符合我们的预期,至于背后隐藏的数据我们并不关心。
总结为一句话,就是在编写测试用例的过程中,把自己当做用户,只关注我能看到的东西
搭建测试环境
首先在要测试模块的gradle中添加设置:
android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }}
这一步实际上是为我们的测试工程指定了一个TestInstrumentationRunner,TestInstrumentationRunner是用来执行我们的测试用例的。对于AndroidJUnitRunner, google官方文档中的介绍如下:
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.
简单来说,AndroidJunitRunner是一个比InstrumentationTestRunner更加强大的测试工具,支持JUnit 3和JUnit 4两种测试用例编写风格,并且同时支持Espresso和UI Automator。之后所有的测试用例均采用JUnit 4风格。
另外,我们还需要添加依赖:
dependencies { testCompile 'junit:junit:4.12' androidTestCompile 'com.android.support:support-annotations:23.3.0' androidTestCompile 'com.android.support.test:runner:0.5' androidTestCompile 'com.android.support.test:rules:0.5' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' androidTestCompile 'org.hamcrest:hamcrest-library:1.3'}
至此,Espresso测试框架的外部环境搭建完毕。
测试用例编写
如前所述,测试用例的编写是基于将自己当做用户的思想。通俗的说,就是对手机上某一个元素(如Button)进行操作,然后观察结果是否符合预期。这里实际包含了三个步骤:
1.找到一个元素:找到手机界面中我们需要测试的功能对应的元素
2.进行操作:进行点击或者输入等操作
3.检查结果:判定操作结束后是否出现了预期的结果
For Example:
1.找到一个元素:EditText
2.进行操作:输入123456
3.检查结果:查看EditText是否出现这些字符
这里贴一下Espresso官方提供的一个example:
@RunWith(AndroidJUnit4.class) //JUnit 4风格@LargeTestpublic class HelloWorldEspressoTest { @Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class); @Test public void listGoesOverTheFold() { onView(withText("Hello world!")).check(matches(isDisplayed())); }}
第二行注明了测试的范围,测试的范围有三种,详情可见:(http://googletesting.blogspot.com/2010/12/test-sizes.html)
通俗的讲可以分为:
- Small: this test does not interact withany file system or network.
- Medium: Accesses file systems on boxwhich is running tests.
- Large: Accesses external file systems,networks, etc.
@Rule 为固定写法,针对你要测试的Activity即可。
@Test 为测试用例的注解,下面分析这个测试用例
找元素
我们现在需要找页面中对应的元素了!Espresso提供了一个onView()方法用来寻找UI上指定的元素,该方法定义如下:
public static ViewInteraction onView(final Matcher<View> viewMatcher) {}
这个方法接收一个Matcher类型的入参,返回一个ViewInteraction对象,其所做的事情就是根据Matcher所指定的条件,在当前UI页面上寻找符合条件的View,并且把相应的View返回出来。这样说还是比较抽象,我们可以用一个具体的例子加以说明。
当我们在实现布局的时候,每个控件都会有一些特殊的属性来确定其唯一性,比如最常用的R.id。Matcher支持通过控件的唯一ID来从当前页面上寻找目标控件,对应的方法为withId(),该方法定义如下:
public static Matcher<View> withId(final int id) {}
大家可以看到,该方法接收了一个int
类型的入参,返回了一个Matcher<View>
对象,于是,采用如下写法:
onView(withId(id));
我们就能在当前页面找到指定ID所对应的目标控件了。
再描述一遍这个流程以便更清晰:我现在要找一个R.id为指定id的控件,那么我就从我的这个id出发,先生成一个查找匹配条件:withId(id)。然后把这个条件传给onView()方法:onView(withId(id)),让onView()方法根据这个条件找到我们想要的那个控件!实际上这行代码也是很符合我们的正常思维,可以读作:
Find a view with Id of the specific id.
实际上,Espresso提供了很多方法来让我们自定义我们的查找条件。比如我们可以通过withText()方法来寻找显示了指定文案的控件等等。具体支持的Matcher类型可以参考Espresso cheat sheet。
需要注意的是,onView()方法在根据匹配条件进行查找时,它的目标是找到唯一的一个目标控件。如果我们制定的匹配条件有多个控件可以匹配(比如复用了layout的布局,或者显示相同文字的TextView等),该方法会抛出一个AmbiguousViewMatcherException异常,因此我们在构造匹配条件时,一定要确保能查找到的目标控件是唯一的。如果单一的匹配条件无法精确地匹配出来唯一的控件,我们可能还需要额外的匹配条件,此时可以用allOf()方法来进行复合匹配条件的构造:
onView(allOf(withId(id), withText(text)))
以上代码可以查找ID为id同时显示的文字内容为text的控件。这里需要注意的是,为了保证自动化测试的效率,我们应尽可能减少匹配条件的数量。如果用一个匹配条件能够满足我们的需求,我们也就没有必要再用allOf()来构造复合匹配条件了。
操作元素
找到了目标元素,接下来我们该针对该元素做一些操作了!
Espresso提供了如下方法来对相应的元素做操作:
public ViewInteraction perform(final ViewAction... viewActions) {}
该方法定义在ViewInteraction类里面。还记得onView()方法的返回值么?yes,正是一个ViewInteraction对象。因此,我们可以在onView()方法找到的元素上直接调用perform()方法进行一系列操作:
onView(withId(id)).perform(click())
如上代码对onView()查询到的元素做了一次点击的操作。请注意,perform()方法的入参是变长参数,也就意味着,我们可以依次对某个元素做多个操作:
onView(withId(id)).perform(click(), replaceText(text), closeSoftKeyboard())
以上代码对目标元素依次做了点击、输入文本、关闭输入法键盘的操作。这是一个典型的填写表单的行为。
检查结果
到目前为止,我们已经能找到元素,也能够对元素进行一些操作了!接下来我们需要检查一下这些操作的结果是否符合我们的预期。
Espresso提供了一个check()方法用来检测结果:
public ViewInteraction check(final ViewAssertion viewAssert) {}
该方法接收了一个ViewAssertion的入参,该入参的作用就是检查结果是否符合我们的预期。一般来说,我们可以调用如下的方法来自定义一个ViewAssertion:
public static ViewAssertion matches(final Matcher<? super View> viewMatcher) {}
这个方法接收了一个匹配规则,然后根据这个规则为我们生成了一个ViewAssertion对象!还记得Matcher这个类型么!!是的,这就是onView()方法的入参!实际上他们是同一个类型,其使用方法也是完全一致的。
比如,我想检查一下指定id的TextView是否按照我的预期显示了一段text文本,那么我就可以这样写:
onView(withId(id)).check(matches(withText(text)))
- Android自动化测试框架---Espresso(1)
- Android自动化测试中Espresso框架学习笔记(1)
- Android自动化测试框架Espresso(一)——简介
- Android自动化测试框架---Espresso(2)
- Android自动化测试--Espresso框架使用
- Espresso——Android自动化测试框架
- Android自动化测试框架Espresso(二)——测试Toast弹出内容
- Android自动化测试框架Espresso(四)——intent测试
- Android自动化测试框架Espresso(五)——测试AdapterView
- 如何在Android Studio使用Espresso框架自动化测试
- Android UI自动化测试--Espresso
- Android自动化测试|Espresso-简介
- Android自动化测试|Espresso-list
- Android自动化测试框架Espresso(三)——View Action的使用
- Espresso 自动化测试(一)
- Android Espresso 测试框架探究
- Android Espresso 测试框架介绍
- android studio使用espresso做自动化测试
- workman使用笔记
- 牛客网算法学习记录-字符串
- 愤怒的码农
- 多台主机鼠键共享工具syngery的配置使用
- [杂碎]二级路由Openwrt的花生壳DDNS设置
- Android自动化测试框架---Espresso(1)
- 【C语言】编写一个程序,当输入小写字母a,输出大写字母Z,当输入小写字母b,输出大写字母Y,以此类推,当输入小写字母z,输出大写字母A。
- Dexposed源码分析
- Android学习系列(8)--App反编译与代码混淆
- web开发中URL传递中文参数乱码解决
- listview详解
- File & File system size limitation for Redhat
- 变位词问题
- table tr隔行变色