1 背景
最近学了利用Appium+Maven+TestNG(ReportNG)搭建全自动化测试环境,使用https://saucelabs.com/ 网站提供的VM平台(可以手动测试与自动化测试,并且可以多线程多设备并行测试Web,Android与IOS),通过Jenkins从Git下载测试代码并触发运行,实现真正意义上的完全自动化测试。
2 环境搭建流程与运行
下面我们从零开始以搭建环境到运行一个Demo为例来说明整个流程,具体如下步骤即可。
一、jdk 安装与Java环境变量与adb配置
这个没啥说的,网上一堆,自行搜索配置吧。
二、IDE安装
下载安装eclipse用来进行测试代码编写,推荐下载Eclipse Luna java EE版本,自带maven插件,比较稳定。Eclipse Luna java EE版64位下载地址:http://ftp.yz.yamagata-u.ac.jp/pub/eclipse//technology/epp/downloads/release/luna/SR2/eclipse-jee-luna-SR2-win32-x86_64.zip,解压即可。
下载安装Win下的Appium(Appium Server)安装并配置环境变量:
在这里http://appium.io/ 下载Appium压缩包,解压后配置appium环境变量 Path D:\developer\appium\Appium\node_modules.bin;
测试:CMD中输入appium-doctor,能看到All Checks were successful ,说明安装成功!
三、Maven安装配置环境变量
下载Maven并配置环境变量;从maven官网下载maven程序包:http://apache.opencas.org/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip,下载后解压,例如我的目录结构是:
配置环境变量MAVEN_HOME,变量值为maven的根目录:D:\developer\apache-maven-3.3.9,在PATH中添加bin的路径:D:\developer\apache-maven-3.3.9\bin。
四、自定义Maven的Setting.xml
打开maven conf目录下的settings.xml文件,配置maven本地仓库地址,我配置的是E:/maven/repo,如下图修改:
五、关联Eclipse与Maven设置
打开Eclipse,在菜单择:windows->Preference->Maven->User Settings,在右侧User Settings选择刚才的settings.xml文件:
配置后,下面步骤在pom.xml配置的依赖包就会从远程仓库下载到本地配置的仓库:E:/maven/repo。
六、TestNG插件安装
安装Eclipse testNG插件,在菜单栏选择help->Eclipse Maketplace,搜索testng,安装,重启Eclipse
七、创建Maven自动化TestCase工程
Eclipse中选择Archetype,输入Group Id、Artifact Id,finish创建完成,如下图:
创建完成后工程目录如下:
八、配置自动化测试依赖的java jar库
配置依赖包:selenium-java(selenium client)、java-client(appium client)、selenium-server(selenium server)、testng(单元测试)、{sauce_testng,commons-lang(saucelabs 上显示测试结果所用)}如果我们不用maven构建工程,那么我们需要去下载这三个包,然后添加到我们的工程中,而maven不需要了,只需要配置依赖关系就可以了,我们可以在maven仓库中搜索我们需要的包,把他们的依赖关系写到pom.xml文件中。
maven仓库地址:http://mvnrepository.com/,例如搜索appium,就可以搜索到appium java client的包,选择最新的包,把依赖关系粘贴打pom.xml中,只需要配置一个selenium依赖就行了,配置后的pom.xml文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mobile.ui</groupId>
<artifactId>MobileTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MobileTest</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.53.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.saucelabs</groupId>
<artifactId>sauce_testng</artifactId>
<version>2.1.21</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>3.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>2.53.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<configuration>
<parallel>methods</parallel>
<threadCount>20</threadCount>
<properties>
<property>
<name>dataproviderthreadcount</name>
<value>2</value>
</property>
</properties>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置后保存,会自动更新依赖包,如果没有更新也可以菜单栏勾选上Project->Build automatically,更新完成后,你就发现你的Maven Dependencies多了很多jar包。
九、IDE运行单元测试
创建TestNG测试类,因为是Appium项目,所以我把源代码放在了src/test/java目录下,选中目录,右键选择New->Other->TestNG->TestNG Class:
创建完成后的目录结构:
测试代码LogInTest.java如下:
package com.mobile.ui.MobileTest;
import org.openqa.selenium.By;
import org.openqa.selenium.InvalidElementStateException;
import org.openqa.selenium.WebElement;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
import io.appium.java_client.AppiumDriver;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class LogInTest extends SampleSauceTestBase {
@Test(dataProvider = "hardCodedBrowsers")
public void logInTest(String os, String deviceName, String platformVersion, Method method)
throws MalformedURLException, InvalidElementStateException {
//create webdriver session
this.createDriver(os, deviceName, platformVersion, method.getName());
AppiumDriver<WebElement> driver = this.getWebDriver();
WebElement logInLink = driver.findElement(By.id("com.quest.spotlightexpress:id/sign_in_enter"));
logInLink.click();
List<WebElement> logInList = driver.findElements(By.className("android.widget.EditText"));
logInList.get(0).sendKeys("[email protected]");
logInList.get(1).sendKeys("123456");
WebElement saveElement = driver.findElement(By.name("Save"));
saveElement.click();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
WebElement connectLink = driver.findElement(By.id("com.quest.spotlightexpress:id/titleView"));
connectLink.click();
WebElement userNameLink = driver.findElement(By.id("com.quest.spotlightexpress:id/top_username"));
String userName = userNameLink.getText();
AssertJUnit.assertEquals(userName, "[email protected]");
}
}
启动Appium Server,连接手机或者启动模拟器,右键选中MobileTest工程,选择Run As->TestNG Test,运行后,会在工程目录下创建一个test-output的文件夹,打开文件夹下的index.html可以查看测试结果,也可以在Eclipse的Console中查看结果,如下图:
这个报告很简陋,下面开始用ReportNG替换TestNG的报告。
十、使用ReportNG生成报告
1、添加依赖,在pom.xml文件中添加下列依赖关系:
<dependency>
<groupId>org.uncommons</groupId>
<artifactId>reportng</artifactId>
<version>1.1.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
2、配置maven-surefire-plugin并加入reportNG listenser
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>xmlfile/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<properties>
<property>
<name>usedefaultlisteners</name>
<value>false</value>
</property>
<property>
<name>listener</name>
<value>org.uncommons.reportng.HTMLReporter, org.uncommons.reportng.JUnitXMLReporter</value>
</property>
</properties>
<workingDirectory>target/</workingDirectory>
</configuration>
</plugin>
</plugins>
</build>
注意这句:xmlfile/testng.xml,我在工程目录下手动新建了一个文件夹xmlfile,把testng的xml文件都放在这个目录下,如果有多个testng.xml文件的话,这样更直观,如果只有一个的话,不建文件夹也可以。
3、更新一下Maven Project,然后右键选中Maven工程,选择Run As->Maven Test,运行成功后,在target目录下创建了一个surefire-reports目录,打开它下面的html文件夹,打开indel.xml,就可以看到相对美观的报告形式了:
十一、在jenkins上配置运行
1.去官网(https://jenkins.io/index.html)下载jenkins 下一步,下一步安装成功(官网wiki等目录下一般都有不同平台的安装文档,依据文档安装即可)。
2.构建一个Maven项目:
- 设置里工程目录的pom.xml文件的位置:
4.在jenkins 的通过插件管理安装testng Results plugin 并配置工程目录下的testng-results.xml
5.点击jenkins上的立即构建,如图里可以查看测试结果,并设置自动多久执行一次,出错发邮件等。
当然你要问那代码运行在哪里啊?当然是saucelabs 提供的VM平台,它有各个类型的设备。
十二、saucelabs平台运行
在saucelabs 官网https://saucelabs.com/ 注册账号,根据官网的说明文档在你的测试代码里设置你的用户信息和被测app的信息和设置在saucelab上展示测试结果的信息,并通过curl命令把你的被测app上传到saucelabs 仓库,如下命令:
curl -u <sauce_username>:<sauce_access_key> -X POST -H "Content-Type: application/octet-stream" https://saucelabs.com/rest/v1/storage/<sauce_username>/<upload_filename>?overwrite=true --data-binary @/<path/to/your_file_name>
这样的话在jenkins运行的同时你的测试的视频会在saucelabs 上显示,你可以回放测试视频或者查看测试结果:
点击上图LoginTest你可以查看该案例的视频回放如下:
十三、提交自己编写的自动化工程
测试代码你可以放在远程仓库git然后在jenkins上配置clone 到你本地或者远程的jenkins来:
至此一个真正意义上的完全自动化测试环境的搭建与运行就介绍完了,剩下的就是自己补充Test案例编写了,我比较喜欢用Java写而已,也用过C#写过。语言的选择就看你所在公司倾向于啥语言了,因为自动化测试是至此多语言的,譬如Python等等!
3 总结
题外话:
1、上面刚开始运行Maven工程时是让大家直接在Eclipse中右键运行的,其实还可以在命令行运行,譬如:
mvn compile //编译,首次会自动下载依赖包
mvn test //运行测试
//上面两条还可以缩短为一条编写,如下:
mvn compile test
//或者
mvn clean compile test
2、我们选择Maven是因为工程依赖很多Jar包等,不想在提交代码时提交一堆Jar文件,所以选择了自动化的Maven仓库。其实还可以使用Ant脚本,也就是创建Java工程,使用Ant,同时手动下载下来工程依赖的Jar进行引用而已,与此同时Jenkins的配置也需要配置Ant的选项,而不是Maven的。
3、上面搭建Appium是Android、IOS等移动端UI测试的自动化框架,如果是Web需要配置Selenium2框架来处理,其配置原理和Appium一样,所以不多介绍了。
4. 上面介绍的安装win appium(appium server)我安装的是有界面的,当然可以选择安装无界面的通过命令行启动如下安装:
4.1 下载安装nodejs,选择默认安装
node配置环境变量 Path D:\nodejs\; (也就是node.exe文件所在的目录)测试:CMD中输入node-v,能看到版本号,那么就成功安装了nodejs。
4.2 命令行安装appium
4.2.1 打开CMD窗口,执行 npm install -g appium 命令开始安装Appium. Appium默认被安装到C:\Users\Administrator\AppData\Roaming\npm\ 下。
4.2.2 把路径C:\Users\Administrator\AppData\Roaming\npm\ (appium可执行文件所在的目录)添加到系统环境变量Path中.那么可以直接在cmd命令行直接输入appium,启动appium。
5. appium client下载路径:http://appium.io/downloads.html
6. selenium client 下载路径:http://docs.seleniumhq.org/download/
7. nodejs 下载路径:http://www.nodejs.org/download/
8. 本地调试代码的运行步骤:
8.1 首先连上真机或者启动模拟器;
8.2 接着启动appium sever;
8.3 最后运行你的测试脚本即可。
到此对于Android、IOS、Web的UI测试全自动化平台就搭建完毕了,下面几篇文章会详细介绍相关依赖的一些其他知识。