• 0
  • 1
分享

大家都知道,测试Android系统原生态APP目前最好的工具使UiAutomation,随着DevOps的普及,我们需要尽早地发现程序中的缺陷,所以单元测试变得非常重要,Android系统推出了Espresso测试框架。Espresso与UiAutomation最显著区别在于UiAutomation可以测试一个APP多个界面(Active),而Espresso只能测试一个APP一个界面(Active),另外UiAutomation可以独立测试APP建立专门的Project,Espresso必须建立在待测APP同一个目录下。下面我向大家简单介绍一下Espresso。

进行Espresso,首先在待测APP的build.gradle(module.app)中作如下的配置。

android {
  …
  }
  buildTypes {
  release {
  minifyEnabled false
  proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  }
  }
  packagingOptions{
  exclude'LICENSE.txt'
  }
  }
  dependencies {
  …
  androidTestImplementation 'com.android.support.test:runner:0.5'
  androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
  exclude group: 'com.android.support', module: 'support-annotations'
  })}

这里特别需要注意的是:com.android.support.test:runner请使用0.5版本,最新的1.0版本有bug。

同步完成,我们在待测试代码的androidTest建立测试代码,下面是这段Espresso代码。

 package com.example.espresso.demo4;
  import android.support.test.filters.LargeTest;
  import android.support.test.rule.ActivityTestRule;
  import android.support.test.runner.AndroidJUnit4;
  import static android.support.test.espresso.Espresso.onView;
  import static android.support.test.espresso.action.ViewActions.click;
  import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
  import static android.support.test.espresso.action.ViewActions.replaceText;
  import static android.support.test.espresso.assertion.ViewAssertions.matches;
  import static android.support.test.espresso.matcher.RootMatchers.withDecorView;
  import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
  import static android.support.test.espresso.matcher.ViewMatchers.withId;
  import static android.support.test.espresso.matcher.ViewMatchers.withText;
  import static org.hamcrest.core.StringStartsWith.startsWith;
  import static org.hamcrest.Matchers.not;
  import org.junit.Rule;
  import org.junit.Test;
  import org.junit.runner.RunWith;
  @RunWith(AndroidJUnit4.class)
  public class MainActivityInstrumentationTest {
  private static final String username="Guxiang";
  private static final String password="123456";
  @Rule
  public ActivityTestRule<MainActivity> mActivityRule=new ActivityTestRule<>(MainActivity.class);
  @Test
  @LargeTest
  public void testDemo4(){
  onView(withId(R.id.username)).perform(replaceText(username),closeSoftKeyboard());
  onView(withId(R.id.password)).perform(replaceText(password),closeSoftKeyboard());
  onView(withText("登录")).perform(click());
  onView(withText(startsWith("用户名或密码")))
  .inRoot(withDecorView(not(mActivityRule.getActivity().getWindow().getDecorView())))
  .check(matches(isDisplayed()));
  //onView(withId(R.id.tv1)).check(matches(withText(expectedText)));
  }
  }

这段代码实现的功能是,在登录页面输入错误的登录名或密码,点击【登录】案件后测试系统是否给出“用户名或密码”错误信息。

1、准备工作

package com.example.espresso.demo4;

首先保证测试代码的package与产品代码的package保持一致。

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

表示待测的是产品代码中的MainActivity.class模块,我们把测试模块变量赋给变量mActivityRule。

2、定位

onView(withId(R.id.username)).perform(replaceText(username),closeSoftKeyboard());

这段代码通过函数onView来执行操作,withId(R.id.username)是通过APP的R.id.username来进行定位,在这里id名为username,这里的R文件与产品代码中R.java中定义的。除了用withId定位外,还可以使用withText(String):元素的Text名,withClassName():元素的className名,withContentDescription():元素的描述信息等方法来定位。也可以采用多元素属性联合定位来实现,比如:

onView(allOf(withId(R.id.button_signin), withText("Sign-in")));

通过id为R.id.button_signin且Text为Sign-in的元素来定位。另外在定位中还可以使用no函数,表示“不”的意思,比如:

onView(allOf(withId(R.id.button_signin), not(withText("Sign-out"))));

id为R.id.button_signin但是Text不是Sign-in的元素。

除了用onView进行定位,也可以用onData进行定位。

onData(allOf(is(instanceOf(String.class)), is("Americano")));

假设一个Spinner的控件,我们要点击“Americano”,可用上面的语句来定位。同样假设是一个Listview,我们需要点击Listview中第二个item的按钮,那么我们需要这样写。

 onData(Matchers.allOf())
  .inAdapterView(withId(R.id.photo_gridview))   // listview的id
  .atPosition(1)                             // 所在位置
  .onChildView(withId(R.id.imageview_photo))   // item中子控件id

3、操作

perform后面为对定位的元素执行操作,常用的方法有。

15243603_201904091157581QfXM.png

另外,在最上面的例子中的“closeSoftKeyboard()”表示输入字符以后收起键盘。

4、断言

一般断言如下所示。

onView(withId(R.id.tv1)).check(matches(withText(expectedText)));

方法check()表示检查, matches()表示匹配,matches()方法中的参数同定位。同matches()方法一样经常使用的,还有。

15243603_201904091157582N3BY.png

代码

onView(withText(startsWith("用户名或密码")))
  .inRoot(withDecorView(not(mActivityRule.getActivity().getWindow().getDecorView())))
  .check(matches(isDisplayed()));

是一个检查Toast很有用的方法,这个如果你使用UiAutomation是很难实现的。


版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 注册功能测试:首先要分析需求,web端/APP端?账号的规则?1、账号为手机号:利用等价类边界值划分有效等价类和无效等价类;如图所示:功能测试用例:(1)输入已注册过的手机号获取验证码再次注册;(2)输入不符合手机号规则的号码获取验证码进行注册;(3)输入欠费的手机号获取验证码进行注册;(4)输入10位数字获取验证码进行注册;(5)输入12位数字获取验证码进行注册;(6)输入11位字母获取验证码进行注册;(7)输入半角字符获取验证码进行注册;(8)输入全角字符获取验证码进行注册;(9)不输入任何内容获取验证码点击注册;(10)输入空格获取验证码点击注册;(11)输入表情符号获取验证码点击注册;...
            13 13 2295
            分享
          • 1、接口自动化测试的意义、前后端分离思想接口自动化测试的优缺点:优点:1、测试复用性。2、维护成本相对UI自动化低一些。为什么UI自动化维护成本更高? 因为前端页面变化太快,而且UI自动化比较耗时(比如等待页面元素的加载、添加等待时间、定位元素、操作元素、模拟页面动作这些都需要时间) 为什么接口自动化维护成本较低? 因为接口较稳定,接口的响应时间基本上都是秒级、毫秒级别的,速度快,并且接口自动化本身也可以做一些有关联的操作、全流程的操作(比如:注册 --> 登录 --> 修改个人信息)。3、回归方便。4、可以运行更多更繁琐的测试。自动化的一个...
            13 13 5268
            分享
          • 前言开发人员与测试人员齐心协力,相爱相杀, 荣辱与共,方能打造出优秀的产品。若是bug描述不知所云,bug修复仓促随意,bug管理如同儿戏,则金玉其外已是造化,败絮其中当属必然。bug描述好的描述能降低沟通成本,让人审题时如沐春风,解题时酣畅淋漓。bug描述的主体,应该包含如下部分:标题:指明所测模块,简明扼要地描述问题现象[前提条件] 说明完成测试的预设条件是什么[重现步骤] 句子简练,步骤清晰,表达无歧义[实际结果] 按照步骤执行下来,实际结果是什么;不要有主观色彩[期望结果] 正确的结果应该是什么;应该有说服力,不要唯经验论Tips:其他如所测版本,附件信息,bug优先级等,不一而足,也...
            0 0 1054
            分享
          •        “羊毛党”蕴含着强大势能,危可断独角兽的角,用可创建增长神话。如同“道德经”——道可道,非常道。羊有毛,非常毛。羊毛群体除了巨大的破坏力外,还具有强大的传播势能。了解利弊加以利用,从此以后再也不愁裂变活动没有大量免费种子用户传播啦~       但如果没有系统性了解羊毛党的破坏力,轻易尝试引火烧身,重着被按在地上强撸灰飞烟灭。       羊毛党的攻防本质是成本的较量!       运营有风控的组合拳,羊毛有机刷的工具刀,...
            0 0 902
            分享
          • 1.表格记录编制人,审核人,审批人2.版本修订记录3.目录4.编写目的对软件测试结果进行整理和汇总,形成正式的测试文档。为软件单元评审验收提供依。软件产品配置管理库。5.软件描述描述测试单元与相关单元的产品项目名称,所需子系统,但愿要完成的功能,需求和设计要求等。6.软件单元的描述了解本单元的组织结构图,包括本单元包括的数学、方法、输入、输出等。7.根据本单元的控制结构或操作时序,画出大概过程。8.测试过程根据所做的软件功能,逐一进行测试。在表格中列出代码审查中查出的问题(标明BUG—ID,审查人员、审查日期、问题描述)测试用例结果统计表:(测试项、测试用例号、测试特性、用例描述、测试结果,对...
            0 0 1203
            分享
      • 51testing软件测试圈微信