从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建立测试工程
    就像建立普通安卓工程一样操作即可。

一路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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容