• 【Android测试】【第十八节】Espresso——环境搭建


       版权声明:本文出自胖喵~的博客,转载必须注明出处。

      转载请注明出处:http://www.cnblogs.com/by-dream/p/5604642.html 

    前言 


      首先还是老规矩,看看官方文档吧。为了防止我读完后再写遗漏什么,因此直接把我翻译的也写出来。

      官方原文参考地址:https://developer.android.com/topic/libraries/testing-support-library/index.html#Espresso

    Espresso译文


      Espresso提供了一系类API可以让用户在App的内部通过UI测试来完成测试。这些API能够让UI自动化写起来简单并且运行起来也可靠。Espresso特别的适合做白盒测试,尤其是测试代码在能够知道应用程序的代码实现细节后来进行测试。

      Espresso框架的主要功能包括:

        1、灵活的API可以匹配到当前应用程序的view和adapter;

        2、丰富的API可以自动化的来模拟UI操作;

        3、UI线程同步,提高了测试的可靠性。

      当然需要Requires Android 2.2 (API level 8) 或之上的版本才可以支持。

      View macthing


      Espresso.onView()这个方法可以让你在目标程序上访问一个UI组件,并且和它交互。该方法接收一个Matcher参数并且搜索视图层次结构来查找满足一定要求的视图实例。你可以指定这样的标准来细化搜索:

        1、The class name of the view
        2、The content description of the view
        3、The R.id of the view
        4、Text displayed in the view

      例如有一个id为imy_button的按钮,我们就可以用这样的方式来指定matcher:

    onView(withId(R.id.my_button));

      如果搜索成功,onView()就会返回一个引用,你可以用它来模拟用户的动作或者是做断言操作。

      Adapter matching


      在AdapterView的布局中,都是运行的过程中动态的填充子view。如果你的目标view是AdapterView的子类(例如 ListView 或 GridView),onview()方法就可能失效了,因为只有布局的视图的子集才可以加载到当前的视图层次结构。

      取而代之的,你使用 Espresso.onData() 方法就可以访问到view的元素。该方法同样返回一个引用,并且可以让你模拟用户动作并且在AdapterView当中对元素做断言。

      Action APIs


      通常情况下,你测试一个应用程序就是去执行一些用户操作,你可以很容易在使用ViewActions的API来完成一些操作,例如下面的这些:

        1、View clicks
        2、Swipes
        3、Key and button presses
        4、Typing text
        5、Opening a link 打开一个链接

      例如要模拟输入一些字符串,并且模拟点击操作,你就可以编写一个这样的自动化脚本:

    // 给 EditText 输入一段文本后,关闭软键盘
    onView(withId(R.id.editTextUserInput))
        .perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
    
    // 按下按钮
    onView(withId(R.id.changeTextBt)).perform(click());

      UI线程同步


      我们在Android设备上做测试的时候,经常会因为时间问题而导致失败。这种问题经常被称作是是test flakiness。在Espresso问世之前,大多数的解决方案是添加一个足够长的sleep时间或者是添加代码来进行重试失败的操作。Espresso测试框架处理同步是在Instrumentation和UI线程之间进行的,这消除了之前的计时解决办法的必要性,并确保测试操作执行和运行的断言更可靠。

      如果想学习更多的话,请参考 API 和 一个简单的搭建过程。

    环境搭建


      读完上面是否已经对Espresso有一些了解了,下面我们看看环境搭建吧。

      首先在使用Espresso之前,请确保你的测试工程和源开发工程的依赖关系是正确的,如果我们使用的是Android Stutio的工程的话,在创建该工程的时候,就会自动生成AndroidTest的目录,我们的代码就在这个目录结构下:

      接着在Android程序模块的build.gradle(app) 文件中,必须对Espresso加入依赖引用:

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

      注意gradle文件有很多,不要加错了地方:

      接着需要在自己设备 “开发者选项” 中关闭三个动画 “窗口缩放动画(Window animation scale)” “过渡动画缩放(Transition animation scale)” “动画程序时长缩放(Animator duration scale)”

      稍微解释一下这三个动画:

      "Window animation scale",作用于非Activity窗口。比如,Dialog、toast、自定义浮窗、输入法等窗口都是该选项的作用目标;

      "Transition animation scale",作用于Activity窗口。Activity窗口是该选项作用目标;

      "Animator duration scale",作用于View。比如View属性动画、水波纹背景动画等。

      为了防止动画对于测试过程中的影响,谷歌建议关闭这三个动画效果。

      下面介绍如何使用JUnit 4来编写Espresso的测试代码,同时使用 ActivityTestRule可以减少代码共用同样的模板结构。通过使用ActivityTestRule,测试框架在用@Test注释的每个测试方法之前都会拉起Activity,并且会执行@Before的内容,在执行完@Test函数后,会执行@After的方法。

    package com.example.android.testing.espresso.BasicSample;
    
    import org.junit.Before;
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    
    import android.support.test.rule.ActivityTestRule;
    import android.support.test.runner.AndroidJUnit4;
    ...
    
    @RunWith(AndroidJUnit4.class)
    @LargeTest
    public class ChangeTextBehaviorTest {
    
        private String mStringToBetyped;
    
        @Rule
        public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
                MainActivity.class);
    
        @Before
        public void initValidString() {
            // 初始化一个字符串
            mStringToBetyped = "Espresso";
        }
    
        @After
        public void tearDown() {
            // 测试结束
            mStringToBetyped = "";
        }
    
        @Test
        public void changeText_sameActivity() {
            // 给edit控件输入文本Espresso,然后按下按钮
            onView(withId(R.id.editTextUserInput))
                    .perform(typeText(mStringToBetyped), closeSoftKeyboard());
            onView(withId(R.id.changeTextBt)).perform(click());
    
            // 检验文字是否被改变
            onView(withId(R.id.textToBeChanged))
                    .check(matches(withText(mStringToBetyped)));
        }
    }

      这里的一个注意点就是注解要写对,其次就是启动的Activity需要指定为自己应用的Activity的名称。

      当然这些需要引入JUnit的一些依赖,我的工程中加入了如下内容:

      并且加入了AndroidJUnitRunner:

    android {
        ......
    
        defaultConfig {
            applicationId "....."
            minSdkVersion 15
            targetSdkVersion 23
            ......
    
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        ......
    }

      这样当我们在写完代码之后,只需按照Instrumentation的方式来启动运行即可。

      有没有发现Espresso的执行速度非常非常的话,没错这就是Espresso的牛逼之处。这节就讲到这里,如果想了解Espresso的一些其他用法,可以参看下一节。

  • 相关阅读:
    使用libcurl POST数据和上传文件
    Google Protocol Buffer 的使用和原理
    curl如何处理cookie
    volatile语义及线程安全singleton模式探讨
    OpenCV 入门级一
    SEBank银行项目实施说明
    SEBank银行项目文件编写规范
    SEBank银行项目体系结构设计报告
    SEBank银行项目体系结构设计报告
    SEBank银行项目第一个星期的进度安排
  • 原文地址:https://www.cnblogs.com/by-dream/p/5604642.html
Copyright © 2020-2023  润新知