【译】使用Espresso进行UI测试

【译】使用Espresso进行UI测试


在我和很多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测试吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 安卓平台上常用的 UI 测试框架有以下几种: 1. Espresso:Google 推出的官方测试框架,可以用来进行简单的 UI 测试。 2. UI Automator:也是 Google 推出的测试框架,可以用来测试应用程序的多个 Activity 之间的交互。 3. Robotium:一个开源测试框架,可以自动化测试 Android 应用程序。 4. Appium:一个跨平台的自动化测试框架,可以用来测试 Android 和 iOS 应用程序。 5. Calabash:一个跨平台的测试框架,特别适合移动应用程序的测试。 这些测试框架都可以帮助开发者更好地测试安卓应用程序的用户界面,从而确保应用程序的质量和可用性。 ### 回答2: 安卓UI测试框架是用于对安卓应用程序的用户界面进行自动化测试的工具。以下是几种常见的安卓UI测试框架: 1. Espresso:谷歌官方推出的UI测试框架,简单易用且功能强大。它可以进行UI交互测试、断言UI组件状态、模拟用户输入等操作。 2. UiAutomator:也是谷歌官方的一个UI测试框架,支持跨应用测试,并且可以进行UI界面元素的查找、点击、滑动等操作。 3. Appium:一个跨平台的UI自动化测试框架,支持多种编程语言,并且可以对安卓、iOS、Windows等多个平台进行测试。 4. Robot Framework:一个开源的自动化测试框架,支持对安卓应用程序进行UI测试,具有简单的语法和丰富的测试库。 5. Selendroid:一个基于WebDriver的自动化测试框架,专注于安卓应用的UI测试。它支持通过模拟器或真机进行自动化测试,并且可以与Selenium WebDriver集成。 这些安卓UI测试框架都具有不同的特点和适用场景,开发人员可以根据具体需要选择合适的框架进行测试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值