Android UI测试之Espresso使用

作者:超级管理员 更新时间:2017-09-13 14:56:37 来源:未知 点击:15642
  暑假实习的单位,被分到了一个测试组,因为我是搞android开发的,所以被分到了自动化测试小组,所以了解了一些UI自动化测试。主要就是看了下官方文档关于UI自动haul测试的介绍以及一些框架,比如
  暑假实习的单位,被分到了一个 测试组,因为我是搞 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。

【推荐】Appium直播课早鸟价限时优惠,APP自动化的首选利器>>

推荐阅读

热门内容

测试分布式系统的线性一致性

  正确实现一个分布式系统是非常有挑战的...

Android UI测试之Espress

  暑假实习的单位,被分到了一个测试组,...

优化压测脚本( loadrunner+p

  使用python脚本配合loadru...

一道有趣的BAT公司面试题:7只老鼠测试

  起源  今天,休息的时候同事虎哥给我...

安装包安全测试

  主要说明以下内容:  1、能否反编译...

功能测试大揭秘(2)—— Appium基

  上文回顾  上一篇为大家介绍了如何通...

iOS单元测试之XCTest详解

  前言:测试是一个好的App不可缺少的...

Android开源数据库 GreenDa

  GreenDao是一款对象关系映射(...

深入理解计算机系统(1.1)——Hell

  1、计算机系统  我们知道计算机系统...

基于.NET CORE微服务框架 -谈谈

  1、前言  对于最近surging更...

最新内容

测试用例设计进阶(下)

  场景分析法设计测试用例—场景分析相关概念  场景  应用软件一般都是用事件触...

测试分布式系统的线性一致性

  正确实现一个分布式系统是非常有挑战的一件事情,因为需要很好的处理并发和失败这...

Android UI测试之Espresso使用

  暑假实习的单位,被分到了一个测试组,因为我是搞android开发的,所以被分...

将爱进行到底 苹果发布会直播果粉占半

    中关村在线消息:昨夜今晨不论科技圈还是朋友圈最火爆的恐怕没什么事儿能与苹...

金立新机来袭 这一点不输苹果iPhone X

    一年一度的“科技春晚”在9月13日凌晨拉开了序幕,苹果一口气为用户带来了...

iPhoneX真有腮红金 不过要等明年一月

    今天凌晨,万众瞩目的苹果iPhone X正式发布了。但与此前的传闻不同的...

苹果iPhoneX方言直播:广东人最爱天津话

    中关村在线消息:昨夜今晨科技圈儿最大的事儿恐怕非苹果新品发布会莫属了。在...

有奖调查:看看多少人想买苹果iPhone X

    苹果公司于西部时间9月12日上午10点(北京时间9月13日凌晨1点)在苹...

iPhone X全球售价对比 在这里买最划算

    几个小时前刚刚发布了iPhone X及iPhone 8手机,我是全程看完...

iPhone X发布会 我们送出了千瓶小茗同学

    中关村在线消息:今天凌晨1点,苹果如期召开2017秋季新品发布会,发布了...

10年前投1万买苹果股票 能赚81部iPhoneX

    苹果股票向来是苹果发布会的方向标,每年每代iPhone的新品发布会结束后...

13万名网友在ZOL参加了iPhone8的调查

    中关村在线消息:今天凌晨,苹果终于发布了万众期待的iPhone8、iPh...

库克背后的十个男人 他们成就了iPhoneX

    十年前,乔布斯创造了iPhone;今天,库克带来了iPhoneX。然而无...

十年来的这些收购案 让库克做梦都会笑

    熟悉苹果公司的朋友都知道,苹果公司有一句耳熟能详的官方声明,它的原文是:...

iPhone8值得买的4个理由 看完不想买X了

    今天凌晨,iPhone8系列在一年一度的科技圈春晚9月苹果发布会强势推出...

苹果安卓斗了十年 iPhone还是输掉这些

    北京时间9月13日凌晨,苹果2017年新品发布会举办于史蒂夫·乔布斯剧院...

iPhoneX要接管下半场 这四款旗舰肯定不服

     iPhone X的庐山真面目终于揭晓,毫无疑问在它的带领下,全面屏将成...

iPhoneX发布会 库克这五件事故意没有说

      总结一下,本次苹果秋季新品发布会,只需要拖到One More Thi...

iPhoneX对比三星Note8 差异不止全面屏

      手机圈的年度大戏莫过于苹果新款iPhone和三星新Note旗舰的发布...

iPhoneX到底贵在哪 六大特点深度解析

      北京时间9月13日,苹果在乔布斯剧院正式发布了三部新款iPhone,...