阅读更多

0顶
0踩

移动开发
在我和很多Android开发者聊天的时候,我注意到他们在开发的过程中并不注重测试这一环节,原因是他们认为Android测试太难实现,或者难以集成到现有的工程中等等。但是实际上写一个 Espresso并不是一件很难的事情,而且它能够非常方便地集成到你的工程之中。

容易实现

Espresso测试是非常容易实现的,它由三部分组成:
  • ViewMachers:寻找用来测试的View。
  • ViewActions:发送交互事件。
  • ViewAssertions:检验测试结果。

举个例子,接下来这部分代码向id为name_field的EditText输入”Steve”,并点击id为greet_button的按钮,最后检查屏幕上是否有”Hello Steve!”字样。
@Test
public void testSayHello() {
  onView(withId(R.id.name_field)).perform(typeText("Steve"));
  onView(withId(R.id.greet_button)).perform(click());
  onView(withText("Hello Steve!")).check(matches(isDisplayed()));
}

是不是很简单?我们再来看看在多线程情况下如何进行测试。

集成测试

Espresso官方文档有这样一段话:
引用

Espresso测试有个很强大的地方是它在多个测试操作中是线程安全的。Espresso会等待当前进程的消息队列中的UI事件,并且在任何一个测试操作中会等待其中的AsyncTask结束才会执行下一个测试。这能够解决程序中大部分的线程同步问题。

我一般使用 Retrofit来处理我的Http请求,而不是AsyncTask(虽然大多数人还是使用AsyncTask),在这种情况下也有别的办法来实现线程安全的测试。Espresso中有个API叫做registerIdlingResource,它可以让你使用自定义的线程安全逻辑。

通过IdlingResource,我们可以通过以下这段代码来实现线程同步的Retrofit接口:
public class MockApiService implements ApiService, IdlingResource {
 
  private final ApiService api;
  private final AtomicInteger counter;
  private final List<ResourceCallback> callbacks;
 
  public MockApiService(ApiService api) {
      this.api = api;
      this.callbacks = new ArrayList<>();
      this.counter = new AtomicInteger(0);
  }
 
  @Override
  public Response doWork() {
      counter.incrementAndGet();
      return decrementAndNotify(api.doWork());
  }
 
  @Override
  public String getName() {
      return this.getClass().getName();
  }
 
  @Override
  public boolean isIdleNow() {
      return counter.get() == 0;
  }
 
  @Override
  public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
      callbacks.add(resourceCallback);
  }
 
  private <T> T decrementAndNotify(T data) {
      counter.decrementAndGet();
      notifyIdle();
      return data;
  }
 
  private void notifyIdle() {
      if (counter.get() == 0) {
          for (ResourceCallback cb : callbacks) {
              cb.onTransitionToIdle();
          }
      }
  }
}

这个类告诉了Espresso你的应用将会在(doWork())方法调用后才能够进入下一个步骤。但是你看完这段代码应该马上意识到一件事情:这样的写法太过啰嗦了,你需要实现很多方法才能做到这线程同步一个小功能。一定有其他更好的办法来实现(接下来就是了!)。

实际上技巧就隐藏在之前的官方文档中,“Expresso会等待UI事件……并等待AsyncTask的结束才会执行下一个测试”。 实际上我们只要在AsyncTask的ThreadPoolExecutor中执行Retrofit请求就可以了!

幸运的是Retrofit的BaseAdapter.Builder类提供了这样一种方法:
new RestAdapter.Builder()
   .setExecutors(AsyncTask.THREAD_POOL_EXECUTOR, new MainThreadExecutor())
   .build();

如此简单,你还有理由不写Espresso测试吗?

本文出自:Michael Evans,译文出自:开发技术前线,译者:desmond1121,校对者:Mr.Simple
0
0
评论 共 1 条 请登录后发表评论
1 楼 jjcang 2015-08-21 09:51
闲的蛋疼。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • wxPython中Button的使用方法

    #!/usr/bin/python #-*- coding:utf8 -*- #主要讲讲button的使用 import wx class ButtonFrame(wx.Frame):     def __init__(self, root):         wx.Frame.__init__(self, None, -1, u"按钮", size=(300, 100))

  • Android自动化测试工具调研

    可以使用Web服务的地址,之后脚本代码传输给Web服务,由Web服务再下发手机,有客户端APP程序执行对应的指令操作(这个APP程序实际上就是没有界面的,可以理解为一个后台进程)Appium的桌面APP也是提供了一种测试录制...

  • Android UI自动化测试框架—SoloPi简介

    软件测试简介​软件测试是伴随着软件开发一同诞生的,随着软件规模大型化,结构复杂化...虽然不能完全取代手工测试,但相比手工测试来讲,自动化测试可以减少人力成本,降低重复工作,从而更快速、高效的进行测试活动。

  • 移动端自动化测试实战

    • adb:Android 的控制工具,用于获取 Android 的各种数据和控制• Appium Desktop:内嵌了 Appium Server 和 Inspector 的综合工具• Appium Server:Appium 的核心工具,命令行工具• Appium Clients:各种语言的...

  • 【基础教程】Appium自动化测试,太详细了!

    Macaco: 阿里基于Appium进行的精简封装的一套框架, 支持Electron应用, 包含app-inspector和ui-recorder, 统一了iOS/Android操作的Api, 目前坑比较多, 环境搭建较麻烦。通用: 支持Win/Linux/Mac, 支持Java/Python/...

  • 实战自动化测试Espresso和Ui automator(二)

    这篇文章,是接着 实战自动化测试Espresso和Ui automator(一)来进行记录的,由于时间的限制,和阅读的习惯,我不喜欢,把一篇文章,写的又臭又长,所以拆成了两部分。UI automator的测试依赖已经在上篇文章加入了...

  • 实战自动化测试Espresso和Ui automator(一)

    所以才有了这篇总结的文章,实战自动化测试。感觉这东西是慢慢领悟的,我也只是记录,自己尝试的一点心得,方便以后自己的查阅。在安卓studio中,支持的测试库,主要有下面的常用3类。我看得主要是后面两类,内部...

  • 腾讯Android自动化测试实战1.1 Android自动化测试框架概述

    2007年Android开源时,Monkey、Instrumentation和MonkeyRunner这3个测试框架,是跟Android源码一起发布的,这也是最早可用的自动化测试框架,那几年大家基本都是用这些框架来开展自动化相关测试工作的。2010年,第一...

  • 自动化测试:功能性UI测试

    Android框架内支持运行的Instrumentation测试。测试库中包含Espresso,用于运行功能UI测试的框架。下面通过简单小例子来介绍一下如何全自动测试相关功能UI。

  • Python Appium自动化测试 Capability

    automationName 使用哪个自动化引擎 Appium(默认)或Selendroid或者UiAutomator2或者Espresso对于Android或XCUITestiOS或者YouiEngine使用You.i引擎构建的应用程序 platformName 使用哪个移动操作系统平台(你要测试...

  • Android单元测试框架介绍 -- 调研篇

    查阅了关于Android单元测试的一些资料后,发现网上对于现有的单元测试框架说法褒贬不一,各有优缺点,在框架的选择上也是需要很多因素来决定,因此我总结了一下最近的调研,对现有的单元测试框架做下简单介绍,列举...

  • Android单元测试

    概述 新建一个module的时候,Android Studio 自动帮我们生成了 test 和 androidTest 两个 sourceSet。这两个 sourceSet 对应了不同... ├── androidTestjava (仪器化单元测试、UI测试) ├── main/java (业务代码)

  • Android 单元测试实战(1)—— 调研与选型

    Android 单元测试实战(1)—— 调研与选型 单元测试搞了一段时间,发现网上很多关于单元测试的文章都是讲了概念,讲了框架的使用,但对于一个实际的项目的操作,因为项目的复杂性,框架的稳定性等,确往往无法进行...

  • 必知必会 | Android 测试相关的方方面面都在这儿

    很多时候,由于迭代周期有限,开发任务多、时间紧,导致很多产品基本没有单元测试,从而也导致很多同学这块都是盲区。其实我对测试接触也非常少,所以深度方面是很难做到了,大家作为扫盲文对待即可,当然我相信只要...

  • Android 单元测试之Robolectric

    在博客Android 单元测试之PowerMockito,主要介绍PowerMockito的使用和对Java测试用例的强大支持。但对于Android app开发来说,写起单元测试很痛苦:一方面单元测试需要运行在模拟器上或者真机上,不仅麻烦而且缓慢...

  • android测试入门选择哪个工具何时,Android单元测试——辅助工具介绍

    阅读本文大约需要8分钟 目录最近在学习单元测试的相关知识,在这里我将分享一下我在学习过程中,使用到的一些辅助工具或框架。我也是一个初学小白,不足之处,还望大家予以指正。文中使用的IDE是Android Studio,...

  • Android实战:CoolWeather酷欧天气(加强版数据接口)代码详解(上)

    拜读了郭霖大神的《第一行代码(第二版)》后,决定对其文末的酷欧天气实战项目进行数据扩充以及代码详解,完整文件请从我的GitHub中Fork。具体步骤还是按照郭霖大神的分析思路来,外加一点点个人的认知。 目录(上...

  • Python APP自动化测试框架Appium详解

    测试工程师也需要掌握一定的App端测试技能,从而让自己从烦琐、重复的“点点点”的人工测试中解脱出来,用自动化的“武器”武装自己,以适应新的测试需求。App测试,顾名思义就是针对手机中的App进行的测试工作。...

  • 最新Android高仿云音乐企业级项目实战

    这是一门使用Java语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),课程包含了基础内容,高级内容,项目封装,项目重构等知识;不会深入到源码讲解某个知识点,以及原理,但会粗略的讲解下基础原理;...

Global site tag (gtag.js) - Google Analytics