uiautomator+cucumber实现移动app自动化测试

前提

由于公司业务要求,所以自动化测试要达到以下几点:

  • 跨应用的测试
  • 测试用例可读性强
  • 测试报告可读性强
  • 对失败的用例有截图保存并在报告中体现

基于以上几点,在对自动化测试框架选型的时候就选择了uiautomator,这个是谷歌官方推荐的一个界面自动化测试工具,能跨应用测试
对于测试用例的可读性就选择了cucumber-android。可以通过中文来描述用例,并且能够生成html的测试报告。(用过calabash的童鞋会了解这块内容)

准备

软件安装

  • JDK1.8
  • anddoidStudio
  • androidSDK

涉及工具和框架

  • uiautomator
  • cucumber-andorid
  • cucumber-html

用例设计

用一个简单的计算器来作为例子,用例设计包括加减乘除运算
如下是两个简单的用例,是不是很直观。

场景: 验证基本的减功能
          当 输入数字30
          当 输入运算符-
          当 输入数字20
          当 输入运算符=
          那么 验证运算结果15
 场景: 验证基本的加功能
          当 输入数字30
          当 输入运算符+
          当 输入数字25
          当 输入运算符=
          那么 验证运算结果55

测试代码设计

测试工程创建

  1. 通过androidStudio新建一个Empty Activity工程,工程中的src目录下会包含androidTest,测试用例代码会在这个目录下来编写
  2. 目录结构如下

assets/features: 放置的是测试用例文件(中文描述的用例文件)
com.cucumber.demo.test: 目录下放置的是测试代码
elements: 界面上的元素获取方法类(后期UI属性发生变化,可修改这个包下面的类即可)
hooks: 放置测试执行的钩子(用例前处理,后处理操作)
runner: 测试用例执行类
steps: 封装的测试步骤脚本

工程配置

由于采用的是cucumber-android框架,并且报告的格式期望是html格式,所以在app/build.gradle中要引入这两个相关依赖。

        androidTestCompile 'info.cukes:cucumber-android:1.2.5'

        androidTestCompile 'info.cukes:cucumber-picocontainer:1.2.5'

        androidTestCompile 'info.cukes:cucumber-html:0.2.3'

        androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

在app/build.gradle所有的配置

    apply plugin: 'com.android.application'


    android {
   

        compileSdkVersion 23

        buildToolsVersion "25.0.2"


        dexOptions {
   

            incremental true

            javaMaxHeapSize "4g"

        }


        defaultConfig {
   

            applicationId "com.cucumber.demo"

            minSdkVersion 18

            targetSdkVersion 23

            versionCode 1

            versionName "1.0"


            jackOptions {
   

                enabled true

            }

            testApplicationId "com.cucumber.demo.test"

           testInstrumentationRunner "com.cucumber.demo.test.runner.Instrumentation"

        }


        packagingOptions {
   

            exclude 'LICENSE.txt'

            exclude 'META-INF/maven/com.google.guava/guava/pom.properties'

            exclude 'META-INF/maven/com.google.guava/guava/pom.xml'

        }


        sourceSets {
   

            androidTest {
   

                assets.srcDirs = ['src/androidTest/assets']

            }

        }



        buildTypes {
   

            release {
   

                minifyEnabled false

                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            }

        }

    }


    dependencies {
   

        compile fileTree(dir: 'libs', include: ['*.jar'])

        testCompile 'junit:junit:4.12'

        compile 'com.android.support:appcompat-v7:23.1.1'


        androidTestCompile 'com.android.support.test:runner:0.5'

        androidTestCompile 'info.cukes:cucumber-android:1.2.5'

        androidTestCompile 'info.cukes:cucumber-picocontainer:1.2.5'

        androidTestCompile 'info.cukes:cucumber-html:0.2.3'

        androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

        androidTestCompile 'com.android.support.test:rules:0.5'


    }

如果在编译的时候出现OutOfMemoryError,就在gradle.properties文件中加入下面配置
gradle.properties

    org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError

测试脚本编写

为了便于维护,将元素获取功能放在一个单独的类中,后期界面有变化的话,可以维护这一份文件即可。
elements/CalculatorActivity.java

    package com.cucumber.demo.test.elements;


    import android.support.test.InstrumentationRegistry;

    import android.support.test.uiautomator.UiDevice;

    import android.support.test.uiautomator.UiObject;

    import android.support.test.uiautomator.UiObjectNotFoundException;

    import android.support.test.uiautomator.UiSelector;


    /**

     * Created by ogq on 4/19/17.

     */

    public class CalculatorActivity {
   


        private static final UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());


        /**

         * 获取数字按键

         * @param num

         * @return

         */

        public static UiObject getNumBtn(String num){
   

            return uiDevice.findObject(new UiSelector().resourceId("com.android.calculator2:id/digit" + num));

        }


        /**

         * 获取运算符和非数字字符

         * @param op

         * @return

         * @throws UiObjectNotFoundException

         */

        public static UiObject getCharBtn(String op) throws UiObjectNotFoundException {
   

            switch (op) {
   

                case "+":

                    return uiDevice.findObject(new UiSelector().
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值