Android 单元测试之UI测试

UI测试

Espresso

官网地址

Espresso是Google官方的一个针对Android UI测试的库,可以自动化的进行UI测试。

Espresso可以验证View的可见性,文字显示是否正确,图片是否正确,位置等等,相对于人工测试,Espresso覆盖更全,测试速度更快。

UI测试分为三个部分:ViewMatcher、ViewAction、ViewAssertion。

一般的测试流程就是按照上面图示的步骤来进行,首先匹配到UI组件,然后执行一些操作,比如click(),然后执行断言判断。其中每个部分包括很多个方法,官方有一个图:

可以看到每个步骤下面有很多个方法,在写测试用例的时候都可以使用。

普通UI组件测试

对于普通的UI组件测试,在之前的Junit的测试中说,所有UI测试相关的都在androidTest文件夹下,看下一个简单的例子:

@RunWith(AndroidJUnit4::class)
class MainActivityTest {@get:Rule
public val activity = ActivityTestRule(MainActivity::class.java)@Test
fun onViewClicked() {
onView(withId(R.id.tv_content)).check(matches(not(isDisplayed())))onView(withId(R.id.btn_change)).check(matches(withText("change"))).perform(click())
onView(withId(R.id.tv_content)).check(matches(withText("content"))).check(matches(isDisplayed()))
}
}
复制代码

可以看出,测试UI的流程就是按照上面的三个步骤来进行的。

Intent跳转测试

引入:

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'
复制代码

在一些场景下,可能需要测试Intent的跳转,但是可能并不需要真正去执行这个跳转的操作,实际上只需要验证一下这个跳转的intent是否发送成功就可以了。Espresso提供了两个方法:intended 和 indending,这两个方法分别可以看成是Mockito中的verify()和when (),一般情况下,如果跳转不需要返回值,就使用 intended ,如果跳转需要返回值,则用 indending 模拟一个返回值。看一个简单的例子:(1140267353)群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!

//如果需要测试Intent,这里的Rule需要更换成IntentTestRule
@get:Rule
public val intentRule = IntentsTestRule(MainActivity::class.java)private val PACKAGE_NAME = "com.example.myapplication"@Test
fun onIntent(){onView(withId(R.id.btn_intent)).perform(click())//点击btn跳转到SecondActivity, 验证intent中是否包含有SecondActivity组件,以及目标package是否为指定的package。intended(allOf(hasComponent(hasShortClassName(".SecondActivity")), toPackage(PACKAGE_NAME)))
}
复制代码

如果使用的是startActivityforResult的话,需要返回值,可以按照如下的写法:

val resultIntent = Intent()
resultIntent.putExtra("result", "OK")
val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultIntent)intending(allOf(hasComponent(hasShortClassName(".SecondActivity")), toPackage(PACKAGE_NAME))).respondWith(result)
复制代码

上面的代码就是利用intending对目标Intent构造了一个返回值,和 when().thenReturn() 有点类似。

WebView 测试

引入:

androidTestImplementation 'androidx.test.espresso:espresso-web:3.1.0'
复制代码

除了对于一些普通的控件进行UI测试之外,Espresso还可以对WebView进行测试,并且可以获取web页中的element,对其进行一些Action、或者获取当前加载的url、也可以检查某些控件中是否包含有某些字段,下面是一个简单的例子:

@Test
fun onLoadUrl(){
onView(withId(R.id.btn_start_webview)).perform(click())
//onIdle()
//检测当前加载的url中是否包含bing
onWebView().check(webMatches(getCurrentUrl(), containsString("bing")))
}
复制代码

还可以检测WebView中元素,并且进行断言判断:

onWebView().withElement(findElement(Locator.ID, "teacher")).withContextualElement(findElement(Locator.ID, "person_name")).check(webMatches(getText(), containsString("Socrates")))
复制代码

检测teacher.person_name是否包含有Socrates。

也可以对WebView中的元素进行操作:(1140267353)一起成长一起加油的伙伴群!软件测试,与你同行!

onWebView().withElement(findElement(Locator.ID, "teacher")).perform(webClick())
复制代码

自定义Matcher

在一些情况下,可能系统提供的Matcher并不能满足需求,这时候也可以通过自定义Matcher来实现:

fun textViewTextColorMatcher(matcherColor: Int): Matcher<View> {return object: BoundedMatcher<View, TextView>(TextView::class.java){override fun describeTo(description: Description?) {description?.appendText("with test color: $matcherColor")}override fun matchesSafely(item: TextView?): Boolean {return matcherColor == item?.currentTextColor}}
}
复制代码

上述代码自定义了一个TextView的textColor的匹配器,describeTo是当匹配失败的时候的提示,matchesSafely是主要的匹配逻辑。

然后就可以通过以下方式来使用自定义的匹配器了。

onView(withId(R.id.search_action_button)).check(matches(textViewTextColorMatcher(TEXT_BTN_COLOR_DISABLED)))
复制代码

其它

  • 测试报告

当使用gralde/app/verification/test 编译的时候,会运行所有的测试类(包括所有的module),并且在对应的build/reports/tests/下面生成一个测试报告(也可以通过运行命令 ./gradlew test。可以通过这个测试报告来查看到底有多少测试类通过,多少失败,然后针对性的检查问题。下图就是跑了test之后生成的报告:

1140267353)一起成长一起加油的伙伴群!软件测试,与你同行!
群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!

  • 使用Jacoco生成单元测试覆盖率报告

下图是集成到了demo里的jacoco输出的覆盖率报告:

可以看到有覆盖率的分析,包括代码覆盖率、分支覆盖率等等。

最后

俺叫小枫,一个成天想着一夜暴富的测试员

(1140267353)一起成长一起加油的伙伴群!软件测试,与你同行!
群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!

点赞关注不迷路!!!【三连ღ】,有问题也可私聊哟~(*╹▽╹*)

Android 单元测试之UI测试相关推荐

  1. android测试篇(三)单元测试之UI测试 Espresso学习与实践

    前言 上一章并没有说仪器化测试,仪器化测试存放在src/androidTest目录中,仪器化测试即UI测试. 本文并没有多加理解,按照Android UI 测试指南之 Espresso抄袭(会标注转载 ...

  2. Android单元测试之Local unit tests(上)

    Android单元测试之Local unit tests(上) 简介 本地单元测试 JUnit 4 添加依赖 测试例子 结论 Mockito 添加依赖 测试例子-mock基本使用 测试例子-mock与 ...

  3. Android 单元测试之Robolectric

    前言 在博客Android 单元测试之PowerMockito,主要介绍PowerMockito的使用和对Java测试用例的强大支持.但对于Android app开发来说,写起单元测试很痛苦:一方面单 ...

  4. Android专项测试之崩溃测试(CPU)

    Android专项测试之崩溃测试(CPU) 崩溃问题类型 ❖ ANR:❖ 主线程5s内没响应 ❖ Java Crash: ❖ 未捕获的android vm异常 ❖ Native Crash: ❖ 未处 ...

  5. Android 单元测试之Mockito

    在博客Android 单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简单的单元测试例子.在文章中,我们只是展示了对有返回类型的目标public方法进行了单 ...

  6. 移动app测试之UI测试内容详解

    UI即User Interface(用户界面)的简称.UI设计则是指对软件的人机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适.简单.自由.充分 ...

  7. vs单元测试之顺序测试

    2019独角兽企业重金招聘Python工程师标准>>> 一.顺序测试的概念 完成一个动作,我们必须要有顺序的运行一系列的测试方法才能测试完这个动作,如果这一系列的方法很多,我们不可能 ...

  8. android测试篇(四)android专项测试之压力测试

    前言 抄袭文章来源:Android App专项测试-压力测试篇 小伙伴们大家好,今天主要分享的主题是Android App专项测试.如何进行Android App专项测试压力测试呢?我们主要通过And ...

  9. Android单元测试之 Mockito

    1. 介绍 1.1 Mock介绍 在了解Mockito的概念之前,需要先了解Mock. mock是在测试过程中,对于一些不容易构造/获取的对象,用一个虚拟的Mock对象来创建以便测试的测试方法. 在平 ...

最新文章

  1. angularjs 让当前路由重新加载_Vuerouter(路由)
  2. 大数据学习笔记一:大数据的发展历程--MapReduce,Hive,Yarn,Hadoop,Spark,Flink
  3. 日常生活小技巧 -- “Error: Encountered an improper argument”的解决方法
  4. 【Python】Python库之文本处理
  5. 数字图像处理--引入齐次坐标
  6. 复制assert目录文件到私有目录_在电脑上复制目录的方法
  7. 美团关联公司公开“无人车及无人配送系统”相关专利
  8. IUS database
  9. Hbase0.96 MVCC Lock 知识梳理
  10. 联想m7216更换墨粉流程图_联想M7216打印机加墨粉后还显示墨粉用完是为什么?...
  11. Trying to create too many scroll contexts. Must be less than or equal to: [20000]
  12. 解决Linux内核问题实用技巧之-dev/mem的新玩法
  13. python如何筛选数据_Python如何用filter函数筛选数据
  14. Python-飞机大战(二)
  15. php域名转向,php强制用户转向www域名的方法_PHP
  16. 《深入理解java虚拟机》学习-第三章-内存分配策略
  17. Java程序,判断一个字母是元音还是辅音
  18. ORA-12154: TNS: 无法解析指定的连接“/one card”应用程序中的服务器错误
  19. vue中文本超出省略号
  20. Core Data的使用

热门文章

  1. Win10安装Matlab R2017a技术指导
  2. linux gid 含义,Linux系统UID和GID详解
  3. 短视频创作中远、全、近景和特写的意义,懂了才能拍出爆款视频
  4. uniapp实战项目 (仿知识星球App) - - 引入uView框架
  5. java怎么设置全局变量_浅谈Java开发中如何定义的全局变量
  6. oracle数据库 生成awr报告、ash报告详细步骤
  7. CPU中的“程序计数器”和JVM内存模型中的“程序计数器”
  8. 内蒙古科技大学计算机专业校企合作好不好,东软睿道与内蒙古科技大学校企合作座谈会成功举行...
  9. 汇编实验之用debug命令查看寄存器和内存中的内容
  10. 钓鱼WiFi哪里跑!