Android UI测试之Espresso使用

原创 2017年09月12日 10:08:13

暑假实习的单位,被分到了一个测试组,因为我是搞android开发的,所以被分到了自动化测试小组,所以了解了一些UI自动化测试。主要就是看了下官方文档关于UI自动haul测试的介绍以及一些框架,比如Appium。这篇博客主要讲解官方推荐的方案——Espresso。

为什么需要UI自动化测试?

我有一个观点,对于重复的工作,那么程序都是可以代替的,我想这是作为一个程序员的一个基本素养(能偷懒的绝不干活)。UI自动化测试就是为了应付一些重复的工作,比如说测试某个功能,那么从应用点击,再经过一系列的点击页面才能到达这个页面,然后进行测试,那么我们是不是可以写段代码让app自动跑起来,自动来到那个界面进行测试呢?答案是肯定的,这就是本篇博客所要说的自动化测试。

UI自动化测试工具

这里只说android,官方文档提供了两种选择:Espresso和Uiautomator。当然除了官方推荐的,还有一些第三方的,比如:
- Robotium
- Monkeyrunner
- Robolectric
- CTS
- Appium

Espresso介绍

Espresso测试框架是在Android测试支持库中的,提供了操作一个app的api来模拟用户的操作。Espresso测试可以运行在Android2.3.3及其更高版本的机器上。使用Espresso的一个优点是对测试操作提供了自动的同步操作。Espresso会在主线程空闲时检测到,会在恰当的时候执行测试命令,这提高了测试的可靠性。

Espresso使用

配置Espresso

工欲善其事必先利其器,在使用Espresso,需要首先进行配置依赖。
在应用的gradle文件中,加入如下依赖:

dependencies{
// Other dependencies ...
androidTestCompile'com.android.support.test.espresso:espresso-core:2.2.2'
}

记得关闭测试机器上的动作——因为不关闭可能会导致错误。在开发者选项下关闭如下动画:
- 窗口动画缩放
- 过渡动画缩放
- 动画程序时长缩放

使用Espresso

UI自动化测试,分为三步曲:
1. 寻找元素
2. 元素上执行操作
3. 判断结果

下面先以一个例子说明,再分别说这三部分。例子中有个Button,点击后改变文本。然后测试案例就是找到这个Button,然后模拟点击,再判断文本是不是正确。测试案例代码如下:

/**
 * Created by Xingfeng on 2017-09-07.
 */
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ChangeTextTest {

    private String result;

    @Before
    public void initString(){
        result="Clicked";
    }


    @Rule
    public ActivityTestRule<MainActivity> mActivityRule=new ActivityTestRule<MainActivity>(MainActivity.class);

    @Test
    public void changeTextTest(){

        //Step 1:定位View
        ViewInteraction view = onView(withId(R.id.btn));
        //Step 2:执行操作
        view.perform(click());
        //Step 3:判断结果
        view.check(matches(withText(result)));

    }



}

点击测试案例的Run按钮,程序将会自动安装并自动执行,然后结果正确。
下面从三部分分别介绍Espresso自动化测试。

定位View

定位View分成两种情况,第一是普通的View,第二种是ListView这种具有adapter的view。下面分别介绍:

onView()定位View

先看一下onView()方法签名,如下:

 public static ViewInteraction onView(final Matcher<View> viewMatcher)

其中参数Matcher用于表述要寻找的View,返回的是一个ViewInteraction,代表一个可被操作的View。
那么在Android的一个页面中,如何定位到一个View呢?
我们可以想到的方法有根据id,文本…这些方法都在ViewMatchers中,下面举例几个:
- withId():根据Id定位
- withText():根据TextView的文本定位
- hasFocus():当前拥有焦点的View
- …

onData()定位View

onDate()签名如下:

public static DataInteraction onData(Matcher<? extends Object> dataMatcher)

其中DataInteraction代表着可被操作的数据集(可理解为ListView的一行)。
所以需要定位到ListView中的一行,例子如下:

/**
 * Created by Xingfeng on 2017-09-07.
 */
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ChangeListTextTest {

    @Rule
    public ActivityTestRule<SecondActivity> mActivityRule=new ActivityTestRule<SecondActivity>(SecondActivity.class);

    @Test
    public void changeTextTest(){

        //Step 1:定位View
        DataInteraction dataInteraction=onData(allOf(instanceOf(String.class),hasToString(equalTo("b"))));
        //Step 2:执行操作
        dataInteraction.perform(click());
        //Step 3:判断结果,文字应该从b->B
        dataInteraction.check(matches(withText("B")));


    }

}

上面使用的matcher是一个组合,即Adapter中的元素是String类型,并且该Item有一个”b”的,后面和onView一样。
Activity中的代码如下:

public class SecondActivity extends AppCompatActivity {

    private List<String> mDatas=new ArrayList<>();

    {

        for(char c='a';c<='z';c++){
            mDatas.add(String.valueOf(c));
        }

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        ListView listView= (ListView) findViewById(R.id.listview);
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,mDatas);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                TextView tv= (TextView) view.findViewById(android.R.id.text1);
                tv.setText(String.valueOf((char)(position+'A')));

            }
        });


    }
}

使用Rule注解的好处在于可以指定某一个Activity启动。

View执行操作

找到ViewInteraction或Datainteraction后,只需要调用perform()方法即可,将要做的操作传入,可以链式调用,如下:

viewInteraction.perform(xx1).perform(xx2)...;

主要的操作在ViewActions工具类中,包括有:
- click():点击操作
- typeText():输入文字
- scrollTo():滚动View
- clearText():清除文字
- …

验证结果

在View上执行操作后,最后一步就是需要验证执行后的效果,这个效果因app而异,有可能自身变化了,有可能影响别的控件的,如果是这样的话,还需要定位到别的控件,再做比较。
比较结果使用check()方法,传入ViewAssertion对象。ViewAssertion用于描述想要的结果,如果不符合,将会抛出AssertionFailedError。
ViewAssertions类为常用的比较提供了一些工具类,如下:
- doseNotExist:当前界面中不存在该View
- matches:该View匹配某一种结果的View
- selectedDescendentsMatch:断言存在父视图的指定子视图

总结

经过上面的说明,可以大体看出Espresso的使用,包括前期的依赖配置,以及后面的三步曲,主要是:
- 定位元素,onView或onData
- 元素执行操作,执行perform()方法
- 比较结果,执行check()方法比较

从上面的代码可以看出Espresso中几个重要的概念:
1. ViewMatcher:描述View的状态,如何能定位到一个View
2. ViewAction:View可以执行的动作
3. ViewAssertion:状态比较

并且,Espresso框架分别提供了几个工具类,如下:
- ViewMatchers
- ViewActions
- ViewAssertions

分别包含常见的操作。
关于代码,可以参考我的github地址
下面一张图总结了Espresso中常见的方法,包括Matcher、Action和Assertion。

Espresso总结

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android自动化测试--Espresso框架使用

且说正文之前,还是先说说Android单元测试的意义或者说为什么我们要进行Android的单元测试?为什么要进行单元测试?单元测试可以帮助我们程序员将bug消灭在萌芽期,为后续的集成测试减少时间.大家...
  • qiang_xi
  • qiang_xi
  • 2016年10月28日 11:23
  • 7261

Espresso 自动化测试(二)- 简单入门

在 Espresso 自动化测试(一) 中我们说过Espresso编写自动化就做三件事情:找某些东西、做某些事情、检查某些东西。下来我们就针对这三点,逐步来进行说明。 介绍我们先看看下面这张图找某些东...
  • qq744746842
  • qq744746842
  • 2016年02月03日 09:02
  • 2211

Espresso 自动化测试的使用

Espresso 自动化测试使用Espresso是一个Android UI测试框架,由三部分组成 - ViewMachers:寻找View - ViewActions: 执行交互事件 - Vie...
  • Mark__Liu
  • Mark__Liu
  • 2017年01月03日 20:02
  • 153

Espresso——Android测试工具Espresso简介

本文通过网络文章来介绍Espresso的使用 Espresso是一个新工具,相对于其他工具,API更加精确。并且规模更小、更简洁并且容易学习。它最初是2013年GTAC大会上推出的,目标...
  • shandong_chu
  • shandong_chu
  • 2015年07月24日 16:33
  • 3007

单元测试

JUnit   导包 //如果只在Java环境下测试,只需以下且默认都有这个配置 testCompile 'junit:junit:4.12' //如果需要调用Android的组件则需要多...
  • sunshenzhen2015
  • sunshenzhen2015
  • 2017年09月12日 21:36
  • 130

Android平台Robotium UI测试详解

Android平台Robotium UI测试详解Robotium 框架工作原理及实践Robotium 是什么一款面向Android端的开源自动化测试框架,,Robotium是基于Instrumenta...
  • cfy137000
  • cfy137000
  • 2017年03月09日 21:02
  • 849

Android UI测试-Espresso环境搭建及测试(by 星空武哥)

转载请标注原创地址: 想看更多是文章,请关注我的微信 espresso是谷歌提倡的ui测试框架,他使用很方便,所以今天给大家写这篇文章,并简单的介绍他的使用,之后我还会介绍Appium测试...
  • lsyz0021
  • lsyz0021
  • 2016年11月03日 01:07
  • 1158

使用uiautomator做UI测试

在Android 4.1发布的时候包含了一种新的测试工具– uiautomator ,uiautomator是用来做UI测试的。也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期。比如...
  • chenbang110
  • chenbang110
  • 2014年04月10日 17:41
  • 38218

Android studio中单元测试和UI测试

1.预览(Over view): 在这篇文章里头呢,你可以学到如何在Android studio中创建一个测试项目,编写测试单元跑在你的开发机器上,并且用真机进行界面测试。 那你会学到什么...
  • dengpeng_
  • dengpeng_
  • 2017年02月07日 12:31
  • 966

Failed to resolve: com.android.support.fragment_mine.espresso:espresso-core:2.2.2

1. 蛋疼的报错   首先我说下我的情况,在使用android-studio过程中,由于这2.2的as的强大功能,让我们在运行app过程中,通过增加在gradle中的依赖,如图,如果我们修改了代码,可...
  • guozhaohui628
  • guozhaohui628
  • 2016年12月02日 19:35
  • 2042
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android UI测试之Espresso使用
举报原因:
原因补充:

(最多只允许输入30个字)