Android单元测试框架Espresso介绍

简介: 顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。

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


进行Espresso,首先在待测APPbuild.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)是通过APPR.id.username来进行定位,在这里id名为username,这里的R文件与产品代码中R.java中定义的。除了用withId定位外,还可以使用withText(String):元素的Text名,withClassName():元素的className名,withContentDescription():元素的描述信息等方法来定位。也可以采用多元素属性联合定位来实现,比如:


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


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


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


idR.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后面为对定位的元素执行操作,常用的方法有。


ViewActions.replaceText()

清空后输入

ViewActions.typeText()

点击事件输入指定的文字内容

ViewActions.click()

点击

ViewActions.scrollTo()

滑动

ViewActions.pressKey()

按下按键

ViewActions.clearText():

清空文本


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


4、断言


一般断言如下所示。


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


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


doesNotExist()

断言某一个view不存在

matches()

断言某个view存在,且符合一列的匹配

selectedDescendentsMatch()

断言指定的子元素存在,且他们的状态符合一些列的匹配


代码


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


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


星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net


顾翔凡言:

      软件测试正在生病,而且病得不轻,自动化测试被要不吹得太火,要不一点都不会,自动化比不过开发、测试又找不到缺陷,丢了西瓜也捡不到芝麻。

目录
相关文章
|
2天前
|
Java 中间件 测试技术
深入理解自动化测试框架Selenium的设计与实现
【5月更文挑战第10天】 本文旨在深度剖析自动化测试工具Selenium的核心架构与实现机制,通过对其设计理念、组件结构以及在实际软件测试中的应用进行详细解读,使读者能够全面理解Selenium在现代Web应用测试中的重要性和有效性。文章首先介绍Selenium的发展背景及其解决的问题,然后详细探讨其架构设计,包括各种驱动和API的作用,最后结合实际案例分析Selenium如何提高测试效率和准确性。
|
3天前
|
测试技术
测试基础 Junit单元测试框架
测试基础 Junit单元测试框架
11 2
测试基础 Junit单元测试框架
|
4天前
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
5天前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
11 0
|
7天前
|
敏捷开发 测试技术 持续交付
深入理解自动化测试:框架与实践
【5月更文挑战第5天】 在现代软件开发周期中,自动化测试已成为确保产品质量和加速交付过程的关键环节。本文将深入探讨自动化测试的核心概念、框架选择以及实际实施过程中的最佳实践。通过分析各种自动化测试工具和技术的优缺点,我们旨在为读者提供一种系统化的方法来构建和维护有效的自动化测试环境。
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
自动化测试中AI驱动的决策框架设计与实现
【5月更文挑战第5天】 在软件测试领域,自动化测试已成为提升测试效率和质量的关键手段。然而,随着软件系统的复杂性增加,传统的自动化测试方法面临挑战,尤其在测试用例的生成、执行及结果分析等方面。本文提出一种基于人工智能(AI)的自动化测试决策框架,旨在通过智能化的算法优化测试过程,并提高异常检测的准确率。该框架结合机器学习和深度学习技术,能够自学习历史测试数据,预测高风险变更区域,自动生成针对性强的测试用例,并在测试执行过程中实时调整测试策略。此外,通过自然语言处理(NLP)技术,该框架还能对测试结果进行语义分析,进一步提供更深入的洞察。本研究不仅增强了自动化测试工具的智能性,也为软件质量保证提
|
11天前
|
数据管理 测试技术
深入理解自动化测试框架:以Selenium为例
【4月更文挑战第30天】 随着软件开发的快速发展,自动化测试已经成为保证软件质量和提升开发效率的重要手段。本文将深入探讨自动化测试框架的核心概念,并以广泛应用的开源工具Selenium为例,解析其架构、原理及在实际项目中的运用。通过实例分析与性能评估,旨在为读者提供一套系统的自动化测试解决方案,并探讨其在复杂应用场景下的优化策略。
|
12天前
|
敏捷开发 前端开发 JavaScript
深入理解自动化测试框架:以Selenium为例
【4月更文挑战第30天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快市场投放的关键步骤。本文聚焦于流行的自动化测试框架——Selenium,探讨其架构、核心组件以及如何有效地利用Selenium进行Web应用测试。通过分析真实案例,我们将揭示Selenium在实际项目中的应用优势与面临的挑战,并提出优化策略。文章的目的在于帮助测试工程师深入理解Selenium,提升其在复杂项目中的运用效率。
|
12天前
|
前端开发 IDE 数据可视化
深入理解与应用自动化测试框架Selenium的最佳实践
【4月更文挑战第30天】 本文将深入剖析自动化测试框架Selenium的核心原理,并结合最佳实践案例,探讨如何有效提升测试覆盖率和效率。文中不仅涉及Selenium的架构解析,还将提供针对性的策略来优化测试脚本,确保测试流程的稳定性与可靠性。通过实例演示,读者可以掌握如何在不同测试场景中灵活运用Selenium,以及如何处理常见的技术挑战。
|
12天前
|
JavaScript 安全 编译器
【TypeScript 技术专栏】TypeScript 与 Jest 测试框架
【4月更文挑战第30天】本文探讨了TypeScript与Jest测试框架的结合在确保代码质量和稳定性上的重要性。Jest以其易用性、内置断言库、快照测试和代码覆盖率分析等特点,为TypeScript提供全面的测试支持。两者结合能实现类型安全的测试,提高开发效率,并涵盖各种测试场景,包括异步操作。通过实际案例分析,展示了如何有效利用这两个工具提升测试质量和开发效率,为项目成功奠定基础。

热门文章

最新文章