美文网首页
从0到1:安卓自动化回归测试持续集成实践

从0到1:安卓自动化回归测试持续集成实践

作者: 隋胖胖LoveFat | 来源:发表于2017-09-06 15:31 被阅读358次

一、关于UI自动化回归测试的思考

UI自动化测试可以模拟用户直接操作APP,是测试金字塔顶端的一种测试方式。目前安卓的UI自动化框架有许多,包括Robotium、uiautomator、Espresso、Appium、Calabash等。尽管自动化测试有其必要性,但是对于高速迭代的移动端产品来说,快速更新的UI界面导致了自动化维护成本急剧增加,如何寻找UI自动化测试较好的应用场景,使其利用较低的维护成本达到更好的提升效率的效果,是思考的一个方向。而回归测试使用到的老版本,其UI没有变化,回归测试的用例较单一和固定,用UI自动化测试来完成回归测试,维护成本较低且能显著提升测试效率。于是我们使用基于Appium框架进行了安卓回归测试的自动化,并在jenkins上持续集成。
接下来简要介绍下如何一步一步地建立工程并完成持续集成。

二、第一步:建立UI自动化回归测试工程

开发环境及工具:
OS:mac IDE:Android Studio 测试框架:Appium java:1.7 gradle版本:2.14.1 安卓模拟器:Genymotion

开始创建工程前,我们需保证环境配置正确,appium和Android Studio的环境可以谷歌后进行配置。在此就不单独列出了。
我们第一步就要在Android Studio中建立测试工程。

  1. Android Studio建立测试工程
    就像建立普通安卓工程一样操作即可。

一路next到底,然后finish即可。

  1. 测试工程中建立java library
    因为我们需要使用java来写appium自动化用例,所以在Android工程里新建一个java library。在工程名点击右键,选择New,Module:



    然后选择一个JavaLibrary,点击next



    设置好Library的名字,点击finish即可。

    由于我们要使用gradle命令行一键执行,所以建立test文件夹,在test路径下组织测试用例。

    此时的项目工程结构:

  1. 导入appium需要的jar包
    接下来建立libs文件夹,导入需要的jar包。

java-client-4.1.2.jar
selenium-server-standalone-3.4.0.jar

并在build.gradle中写明编译jar包地址。


另外,需在test下建立apps目录,将待测试的app放入apps目录下。
好了,现在环境和工程都准备好了,开始写自动化回归用例。

  1. 编写自动化回归用例
    这里我们建立一个最简单的登陆回归用例LoginTest.java。
    在test->java,右键New->Java Class新建一个Java类,命名为LoginTest。
public class LoginTest {
    private AppiumDriver<AndroidElement> driver;

    @Before
    public void setup() throws Exception {
        File classpathRoot = new File(System.getProperty("user.dir"));
        File appDir = new File(classpathRoot, "/src/test/java/apps/");//app存放的目录
        File app = new File(appDir, "test.apk"); //app的名字,对应你apps目录下的文件
        DesiredCapabilities capabilities = new DesiredCapabilities();//创建Capabilities
        capabilities.setCapability("deviceName","192.168.56.101:5555");//设置要调试的模拟器的名字,这里我使用的是Genymotion模拟器。
        capabilities.setCapability("platformVersion", "5.1.0");      //设置模拟器的系统版本
        capabilities.setCapability("app", app.getAbsolutePath()); //设置app的路径
        capabilities.setCapability("appPackage", "com.netease.pris");//设置app的包名
        capabilities.setCapability("appActivity", ".activity.PRISActivityFlasScreen");//设置app的启动activity
        driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); //启动driver
    }

    @After
    public void teardown(){
        //测试完毕,关闭driver,不关闭将会导致会话还存在,下次启动就会报错
        driver.quit();
    }

    @Test
    public void loginTest(){
        //这里面是简单的登陆的UI自动化用例,执行打开网易云阅读并进行登录。
        WebElement login = driver.findElementById("com.netease.pris:id/account_btn");
        login.click();
        WebElement login_real = driver.findElementById("com.netease.pris:id/button_login");
        login_real.click();
        List<AndroidElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");
        //第一个EditText输入帐号
        textFieldsList.get(0).sendKeys(username);
        //第二个EditText输入密码
        textFieldsList.get(1).sendKeys(password);
        WebElement button = driver.findElementById("com.netease.pris:id/ui_login_button_login");
        button.click();
    }

}
  1. 执行自动化回归用例
    用例写好后就开始执行了,执行前需打开Appium客户端(点击Launch启动Appium),启动Genymotion模拟器。
    在要执行的测试用例LoginTest.java文件上右键,点击run 'LoginTest'可执行用例。

三、第二步:gradle命令行一键执行

为了便于持续集成,我们需考虑使用gradle命令行一键执行全部或者部分测试用例,同时生成测试报告。我们使用junit框架,在build.gradle中引入junit框架。


然后打开终端,进入RegressionUITest/appiumtest目录下,执行gradle test。


我们看到gradle test命令直接执行了test目录下的所有测试用例,同时生成了测试报告,我们可以去RegressionUITest/appiumtest/build/reports/tests/中找到index.html,该文件就是测试报告。


如果不想执行全部的测试用例,可以使用gradle的java插件的设置,在build.gradle文件中进行要执行的测试用例的设置。
这里我们设置仅执行LoginTest一个测试用例:


四、第三步:Jenkins持续集成

使用gradle test命令行自动执行后,我们可以配置jenkins节点机使得测试工程持续集成了。
在jenkins工程配置,构建的时候选择Execute Shell,Commands中输入:

cd yourBaseDir/RegressionUITest/appiumtest
gradle clean
gradle test

这样就可以使用Jenkins持续集成了。

五、第四步:测试报告结果输出

在jenkins工程配置“构建后操作”,选择“Publish HTML reports”,然后指定html文件的存放路径,以及html文件的名字。如下图所示:



这样的话构建一次结束后,就可以在工程目录下看到生成的测试报告了。


到现在,就是一步一步从0搭建的UI自动化持续集成的主要步骤,可以实现核心的用例持续集成。接下来要做的就是丰富回归测试用例了,使其覆盖更多的回归测试场景。

六、遇到的问题和解决方法

  1. 不想要appium每次都重置app
    解决方法:在初始化appium的时候加一句不要重置的设置。

capabilities.setCapability("noReset",true);

  1. Genymotion 6.0.0的设备出现app经常ANR、crash的情况
    原因:Genymotion Custom Phone 6.0.0有bug,在app页面进行destroy或者切换的时候产生异常。
    解决方法:使用Genymotion Google Nexus 5X 6.0.0设备。
  2. 执行gradle test时出现Unsupported major.minor version 52.0报错。
    原因:高版本JDK编译的class不能在低版本的jvm虚拟机下运行
    解决方法:gradle命令的执行环境是在gradle.properties配置的,增加一句:

org.gradle.java.home=/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home

具体解决方法可参考:http://www.jianshu.com/p/5eebd3c609d6
4.执行gradle test时出现Minimum supported Gradle version is 2.14.1. Current version is 2.2.1报错信息
原因:gradle版本太低
解决方法:下载gradle高版本,如2.14.1,重新设置环境变量即可。
具体解决方法可参考gradle版本和cradle插件版本对应关系:http://blog.csdn.net/u013347784/article/details/64440308
5.gradle test执行几次后,不再执行test
解决方法:gradle test之前,先执行一次gradle clean

相关文章

  • 从0到1:安卓自动化回归测试持续集成实践

    一、关于UI自动化回归测试的思考 UI自动化测试可以模拟用户直接操作APP,是测试金字塔顶端的一种测试方式。目前安...

  • Jenkins持续集成体系建设

    目录 任务目标 安卓App构建、打包、部署与自动化测试 安卓App持续集成体系建设实战 一、任务目标 实战任务的故...

  • 持续集成之利用mock与回放技术助力自动化回归

    持续集成之利用mock与回放技术助力自动化回归 持续交付中存在的测试难点: 1、测试数据的准备和清理1.每次全新的...

  • 自动化测试面试题

    1、为什么做自动化? 解放手工劳动-UI回归测试 持续集成中自动验证 手工测试无法实现-压力 并发测试 2、分层自...

  • 自动化测试面试题

    1、为什么做自动化? 解放手工劳动-UI回归测试 持续集成中自动验证 手工测试无法实现-压力 并发测试 2、分层自...

  • 基于Gitlab实现自动化单元测试

    持续集成是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误...

  • 【译】如何开始CI

    开始学习持续集成所要了解的知识:分支策略,测试自动化,工具和最佳实践。 目标:快速且安全地交付工作代码 持续集成的...

  • 持续集成

    持续集成 频繁地(一天多次)将代码集成到主干。代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不...

  • 关于自动化测试的疑问点都在这了

    前面学到的持续集成,有一个基础技术是自动化测试。只有测试通过,才能完成集成;而自动化地进行测试,则保证了持续的可操...

  • RobotFramework学习笔记二

    robotframework +appium安卓自动化测试入门 安卓开发环境搭建请参考: https://www....

网友评论

      本文标题:从0到1:安卓自动化回归测试持续集成实践

      本文链接:https://www.haomeiwen.com/subject/sexsdxtx.html