一、关于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中建立测试工程。
- Android Studio建立测试工程
就像建立普通安卓工程一样操作即可。
一路next到底,然后finish即可。
-
测试工程中建立java library
因为我们需要使用java来写appium自动化用例,所以在Android工程里新建一个java library。在工程名点击右键,选择New,Module:
然后选择一个JavaLibrary,点击next
设置好Library的名字,点击finish即可。
由于我们要使用gradle命令行一键执行,所以建立test文件夹,在test路径下组织测试用例。
此时的项目工程结构:
- 导入appium需要的jar包
接下来建立libs文件夹,导入需要的jar包。
java-client-4.1.2.jar
selenium-server-standalone-3.4.0.jar
并在build.gradle中写明编译jar包地址。
另外,需在test下建立apps目录,将待测试的app放入apps目录下。
好了,现在环境和工程都准备好了,开始写自动化回归用例。
- 编写自动化回归用例
这里我们建立一个最简单的登陆回归用例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();
}
}
- 执行自动化回归用例
用例写好后就开始执行了,执行前需打开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自动化持续集成的主要步骤,可以实现核心的用例持续集成。接下来要做的就是丰富回归测试用例了,使其覆盖更多的回归测试场景。
六、遇到的问题和解决方法
- 不想要appium每次都重置app
解决方法:在初始化appium的时候加一句不要重置的设置。
capabilities.setCapability("noReset",true);
- Genymotion 6.0.0的设备出现app经常ANR、crash的情况
原因:Genymotion Custom Phone 6.0.0有bug,在app页面进行destroy或者切换的时候产生异常。
解决方法:使用Genymotion Google Nexus 5X 6.0.0设备。 - 执行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