Android进阶之路Android开发Android开发经验谈

Android UI测试之Espresso

2020-08-29  本文已影响0人  木木玩Android

android测试概述

Android自动化测试是应用开发中提升开发效率的一种方式,它可以在短时间内跑完所有的测试方案以及实现各种交互,从而让开发者更加方便和直观的知道代码的实现效果。Android自动化测试可以分为单元测试、UI测试、Monkey测试三种,同时也分小中大三种测试。官方解释可以点这里

单元测试

单元测试又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。Android中的单元测试是基于JUnit,可分为本地测试和Instrumented 测试。

单元测试最常用的框架就是JUnit跟Mockito组合的测试框架,其中JUnit用来跑主要的测试代码,Mockito可以创建特定测试对象(非对象本身)并设置一些特定的属性供测试使用

UI测试

UI测试是测试应用中的各种交互是否达到了实现的效果。常用的UI测试框架有Espresso和UIAutomator

Espresso的使用

1.概述

Espresso有三个重要的类:分别是Matchers(匹配器),ViewAction(界面行为),ViewAssertions(界面判断),其中Matchers是常常是通过匹配条件来需找UI组件或过滤UI,而ViewAction是来模拟用户操作界面的行为,ViewAssertions对模拟行为操作的View进行变换和结果验证。它的执行顺序如下



2.依赖和配置

在导入好包之后就可以module的AndroidTest包下开始编写自己的UI自动化测试代码了

3.测试界面跳转

测试界面跳转时需要用的Espresso-Intents库,它是 Espresso 的扩展程序,支持对被测应用发出的intent进行验证和打桩。它与Mockit 类似,但适用于Android Intent。Espresso-Intents有两个比较重要的方法itending()和intended()。

    @Test fun validateIntentSentToPackage() {
        user.clickOnView(system.getView(R.id.callButton))
        intended(toPackage("com.android.phone"))
    }

复制代码

5.异步测试

Espresso测试有个很强大之处就是它在多个测试操作中是线程安全的,它会等待当前进程的消息队列中的UI事件,并且在任何一个测试操作中会等待其中的异步任务结束才会执行下一个测试。 Espresso异步测试是要导入以下两个包

下面讲一下异步测试的流程

public class SimpleIdlingResource implements IdlingResource {
    private final String mResourceName;

    //这个counter值就像一个标记,默认为0
    private final AtomicInteger counter = new AtomicInteger(0);

    private volatile ResourceCallback resourceCallback;

    public SimpleIdlingResource(String resourceName) {
        mResourceName = resourceName;
    }

    @Override
    public String getName() {
        return mResourceName;
    }

    @Override
    public boolean isIdleNow() {
        return counter.get() == 0;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
        this.resourceCallback = resourceCallback;
    }

    //每当我们开始异步请求,把counter值+1
    public void increment() {
        counter.getAndIncrement();
    }

    //当我们获取到网络数据后,counter值-1;
    public void decrement() {
        int counterVal = counter.decrementAndGet();
        //如果这时counter == 0,说明异步结束,执行回调。
        if (counterVal == 0) {
            //
            if (null != resourceCallback) {
                resourceCallback.onTransitionToIdle();
            }
        }

        if (counterVal < 0) {
            //如果小于0,抛出异常
            throw new IllegalArgumentException("Counter has been corrupted!");
        }
    }
}
复制代码
public class EspressoIdlingResource {
    private static final String RESOURCE = "GLOBAL";

    private static SimpleIdlingResource mCountingIdlingResource =
            new SimpleIdlingResource(RESOURCE);

    public static void increment() {
        mCountingIdlingResource.increment();
    }

    public static void decrement() {
        mCountingIdlingResource.decrement();
    }

    public static IdlingResource getIdlingResource() {
        return mCountingIdlingResource;
    }
}
复制代码
上一篇 下一篇

猜你喜欢

热点阅读