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

一、关于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建立测试工程
    就像建立普通安卓工程一样操作即可。
从0到1:安卓自动化回归测试持续集成实践_第1张图片

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

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


    从0到1:安卓自动化回归测试持续集成实践_第2张图片

    然后选择一个JavaLibrary,点击next


    从0到1:安卓自动化回归测试持续集成实践_第3张图片

    设置好Library的名字,点击finish即可。
    从0到1:安卓自动化回归测试持续集成实践_第4张图片

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

    此时的项目工程结构:

从0到1:安卓自动化回归测试持续集成实践_第5张图片
  1. 导入appium需要的jar包
    接下来建立libs文件夹,导入需要的jar包。

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

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

从0到1:安卓自动化回归测试持续集成实践_第6张图片

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

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

从0到1:安卓自动化回归测试持续集成实践_第7张图片

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


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

从0到1:安卓自动化回归测试持续集成实践_第8张图片

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


从0到1:安卓自动化回归测试持续集成实践_第9张图片

四、第三步:Jenkins持续集成

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

cd yourBaseDir/RegressionUITest/appiumtest
gradle clean
gradle test

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

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

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


从0到1:安卓自动化回归测试持续集成实践_第10张图片

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

从0到1:安卓自动化回归测试持续集成实践_第11张图片

到现在,就是一步一步从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:安卓自动化回归测试持续集成实践)