Android 单元测试之UI测试

Android 单元测试之UI测试

UI测试

Espresso

官网地址

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

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

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

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

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

普通UI组件测试

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

 
  1. @RunWith(AndroidJUnit4::class)

  2. class MainActivityTest {

  3. @get:Rule

  4. public val activity = ActivityTestRule(MainActivity::class.java)

  5. @Test

  6. fun onViewClicked() {

  7. onView(withId(R.id.tv_content)).check(matches(not(isDisplayed())))

  8. onView(withId(R.id.btn_change)).check(matches(withText("change"))).perform(click())

  9. onView(withId(R.id.tv_content)).check(matches(withText("content"))).check(matches(isDisplayed()))

  10. }

  11. }

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

Intent跳转测试

引入:

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'

在一些场景下,可能需要测试Intent的跳转,但是可能并不需要真正去执行这个跳转的操作,实际上只需要验证一下这个跳转的intent是否发送成功就可以了。Espresso提供了两个方法:intended 和 indending,这两个方法分别可以看成是Mockito中的verify()和when (),一般情况下,如果跳转不需要返回值,就使用 intended ,如果跳转需要返回值,则用 indending 模拟一个返回值。看一个简单的例子:
 

 
  1. //如果需要测试Intent,这里的Rule需要更换成IntentTestRule

  2. @get:Rule

  3. public val intentRule = IntentsTestRule(MainActivity::class.java)

  4. private val PACKAGE_NAME = "com.example.myapplication"

  5. @Test

  6. fun onIntent(){

  7. onView(withId(R.id.btn_intent)).perform(click())

  8. //点击btn跳转到SecondActivity, 验证intent中是否包含有SecondActivity组件,以及目标package是否为指定的package。

  9. intended(allOf(hasComponent(hasShortClassName(".SecondActivity")), toPackage(PACKAGE_NAME)))

  10. }

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

 
  1. val resultIntent = Intent()

  2. resultIntent.putExtra("result", "OK")

  3. val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultIntent)

  4. 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、也可以检查某些控件中是否包含有某些字段,下面是一个简单的例子:

 
  1. @Test

  2. fun onLoadUrl(){

  3. onView(withId(R.id.btn_start_webview)).perform(click())

  4. //onIdle()

  5. //检测当前加载的url中是否包含bing

  6. onWebView().check(webMatches(getCurrentUrl(), containsString("bing")))

  7. }

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

 
  1. onWebView()

  2. .withElement(findElement(Locator.ID, "teacher"))

  3. .withContextualElement(findElement(Locator.ID, "person_name"))

  4. .check(webMatches(getText(), containsString("Socrates")))

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

也可以对WebView中的元素进行操作

 
  1. onWebView()

  2. .withElement(findElement(Locator.ID, "teacher"))

  3. .perform(webClick())

自定义Matcher

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

 
  1. fun textViewTextColorMatcher(matcherColor: Int): Matcher<View> {

  2. return object: BoundedMatcher<View, TextView>(TextView::class.java){

  3. override fun describeTo(description: Description?) {

  4. description?.appendText("with test color: $matcherColor")

  5. }

  6. override fun matchesSafely(item: TextView?): Boolean {

  7. return matcherColor == item?.currentTextColor

  8. }

  9. }

  10. }

上述代码自定义了一个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之后生成的报告

 

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值