Appium+Maven+TestNG(ReportNG)环境搭建(详细过程)
最近群里经常有人会问到关于maven构建Appium测试项目以及使用testNG生成测试报告的问题,试着搭建了一下,下面是过程:
jdk安装过程我这里就不说了
一、下载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
二、下载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:\Program Files\apache-maven-3.3.9,在PATH中添加bin的路径:D:\Program Files\apache-maven-3.3.9\bin,
三、配置settings.xml文件,打开maven conf目录下的settings.xml文件,配置maven本地仓库地址,我配置的是F:\repository
我还配置了镜像的地址,因为从默认的中央仓库下载依赖包太慢了,在settings.xml中加入下面的代码:
1 <mirrors> 2 <!-- mirror | Specifies a repository mirror site to use instead of a given 3 repository. The repository that | this mirror serves has an ID that matches 4 the mirrorOf element of this mirror. IDs are used | for inheritance and direct 5 lookup purposes, and must be unique across the set of mirrors. | --> 6 <mirror> 7 <id>nexus-osc</id> 8 <mirrorOf>central</mirrorOf> 9 <name>Nexus osc</name> 10 <url>http://maven.oschina.net/content/groups/public/</url> 11 </mirror> 12 <mirror> 13 <id>nexus-osc-thirdparty</id> 14 <mirrorOf>thirdparty</mirrorOf> 15 <name>Nexus osc thirdparty</name> 16 <url>http://maven.oschina.net/content/repositories/thirdparty/</url> 17 </mirror> 18 </mirrors>
推荐几个国内的镜像地址:
http://maven.oschina.net/content/groups/public/
http://maven.oschina.net/content/repositories/thirdparty/
http://repo2.maven.org/maven2/
如果在下载的时候还是觉得慢的话,请自行百度其他地址。
打开Eclipse,在菜单选择:windows->Preference->Maven->User Settings,在右侧User Settings选择刚才的settings.xml文件:
配置后,下面步骤在pom.xml配置的依赖包就会从远程仓库下载到本地配置的仓库:F:\repository
四、安装Eclipse testNG插件,在菜单栏选择help->Eclipse Maketplace,搜索testng,安装,重启Eclipse
五、开始创建Maven工程,选择Archetype,输入Group Id、Artifact Id,finish创建完成,如下图:
创建完成后是这样的:
六、配置依赖包,Appium需要三个包:appium client、selenium client、selenium server,如果我们不用maven构建工程,那么我们需要去下载这三个包,然后添加到我们的工程中,而maven不需要了,只需要配置依赖关系就可以了,我们可以在maven仓库中搜索我们需要的包,把他们的依赖关系写到pom.xml文件中:
maven仓库地址:http://mvnrepository.com/,例如搜索appium,就可以搜索到appium java client的包,选择最新的包,把依赖关系粘贴打pom.xml中,selenium client和selenium server只需要配置一个selenium依赖就行了,配置后的pom.xml文件如下:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.zdx.appium</groupId> 6 <artifactId>num1</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>num1</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 </properties> 16 17 <dependencies> 18 <dependency> 19 <groupId>junit</groupId> 20 <artifactId>junit</artifactId> 21 <version>3.8.1</version> 22 <scope>test</scope> 23 </dependency> 24 <dependency> 25 <groupId>io.appium</groupId> 26 <artifactId>java-client</artifactId> 27 <version>3.4.0</version> 28 </dependency> 29 <dependency> 30 <groupId>org.testng</groupId> 31 <artifactId>testng</artifactId> 32 <version>6.9.10</version> 33 </dependency> 34 35 </dependencies> 36 </project>
配置后保存,会自动更新依赖包,如果没有更新也可以在右键选中工程,选择Maven-Update Project,进行更新。更新完成后,你就发现你的Maven Dependencies多了很多jar包
七、创建TestNG测试类,因为是Appium项目,所以我把源代码放在了src/test/java目录下,选中目录,右键选择New->Other->TestNG->TestNG Class
创建完成后的目录结构:
八、下面就开始写Appium代码吧,下面是我写的一个demo,app是我自己写的一个测试demo
APP截图:
测试代码:
1 package com.zdx.appium.num1; 2 3 import org.testng.Assert; 4 import org.testng.annotations.Test; 5 import org.testng.annotations.BeforeTest; 6 import org.testng.annotations.AfterTest; 7 8 import io.appium.java_client.AppiumDriver; 9 import io.appium.java_client.android.AndroidDriver; 10 import io.appium.java_client.android.AndroidElement; 11 12 import java.io.File; 13 import java.io.UnsupportedEncodingException; 14 import java.net.URL; 15 import java.sql.Driver; 16 import java.sql.Time; 17 import java.util.List; 18 import java.util.Random; 19 20 import mx4j.log.Log; 21 22 import org.apache.bcel.generic.RETURN; 23 import org.junit.After; 24 import org.junit.Before; 25 import org.openqa.selenium.By; 26 import org.openqa.selenium.WebElement; 27 import org.openqa.selenium.logging.LogEntry; 28 import org.openqa.selenium.logging.LoggingHandler; 29 import org.openqa.selenium.logging.LoggingPreferences; 30 import org.openqa.selenium.logging.Logs; 31 import org.openqa.selenium.remote.DesiredCapabilities; 32 import org.openqa.selenium.remote.RemoteWebDriver; 33 import org.openqa.selenium.remote.server.log.LoggingManager; 34 import org.openqa.selenium.remote.server.log.LoggingOptions; 35 import org.testng.asserts.LoggingAssert; 36 37 38 public class NumFirst { 39 private AndroidDriver<AndroidElement> driver; 40 @BeforeTest 41 public void setUp() throws Exception{ 42 /* File classpathRoot = new File(System.getProperty("user.dir")); 43 System.out.println(classpathRoot); 44 File appDir = new File(classpathRoot, "/apps"); 45 File app = new File(appDir, "");*/ 46 DesiredCapabilities capabilities = new DesiredCapabilities(); 47 48 capabilities.setCapability("deviceName","udid"); 49 capabilities.setCapability("platformVersion", "4.4"); 50 capabilities.setCapability("udid","YT91050HXZ"); 51 //capabilities.setCapability("app", app.getAbsolutePath()); 52 capabilities.setCapability("appPackage", "com.example.yadudemo"); 53 capabilities.setCapability("appActivity", ".MainActivity"); 54 //capabilities.setCapability("appActivity", ".ui.activity.UPlusMainActivity"); 55 driver = new AndroidDriver<>(new URL("http://127.0.0.1:4726/wd/hub"), capabilities); 56 } 57 @Test 58 public void test() throws UnsupportedEncodingException { 59 //验证APP启动成功,并且MainActivity打开 60 if(activityVerify(8000, driver, ".MainActivity")==true) 61 { 62 System.out.println(driver.currentActivity().toString()); 63 Assert.assertEquals(driver.currentActivity().toString(), ".MainActivity"); 64 AndroidElement bt_config = driver.findElementByName("配置"); 65 bt_config.click(); 66 //验证ConfigActivity打开 67 if(activityVerify(3000, driver, ".ConfigActivity")==true) 68 { 69 Assert.assertEquals(driver.currentActivity().toString(), ".ConfigActivity"); 70 List<AndroidElement> et_List = driver.findElementsByClassName("android.widget.EditText"); 71 //输入密码 72 et_List.get(1).clear(); 73 et_List.get(1).sendKeys("12345678"); 74 //验证输入密码正确 75 Assert.assertEquals(et_List.get(1).getText(), "12345678"); 76 //输入超时时间 77 et_List.get(2).clear(); 78 et_List.get(2).sendKeys("12"); 79 //验证超时时间输入正确 80 Assert.assertEquals(et_List.get(2).getText(), "12"); 81 //如果button被键盘遮挡,关闭键盘 82 if(driver.findElementsByName("开始配置").isEmpty()) 83 { 84 driver.pressKeyCode(4); 85 } 86 //点击开始配置 87 AndroidElement bt_start_config = driver.findElementByName("开始配置"); 88 bt_start_config.click(); 89 } 90 } 91 //关闭APP 92 closeApp(); 93 //验证APP已经关闭 94 Assert.assertNotEquals(driver.currentActivity().toString(), ".ConfigActivity"); 95 Assert.assertNotEquals(driver.currentActivity().toString(), ".MainActivity"); 96 } 97 98 @AfterTest 99 public void tearDown() { 100 driver.quit(); 101 } 102 //线程等待方法 103 public void appWait(long time) 104 { 105 try { 106 Thread.sleep(time); 107 } catch (InterruptedException e) { 108 // TODO Auto-generated catch block 109 e.printStackTrace(); 110 } 111 } 112 //关闭APP方法 113 public void closeApp() 114 { 115 for(int h=0;h<6;h++) 116 { 117 driver.pressKeyCode(4); 118 } 119 } 120 //验证activity方法 121 public Boolean activityVerify(long time,AndroidDriver<AndroidElement> tdriver,String activity) 122 { 123 for(int i=1;i<time/1000;i++){ 124 appWait(1000); 125 if(tdriver.currentActivity().equals(activity)) 126 { 127 return true; 128 } 129 } 130 System.out.println("can not find "+activity); 131 return false; 132 133 } 134 }
启动Appium Server,连接手机(我手机已经安装了测试demo APP),右键选中num1工程,选择Run As->TestNG Test,运行后,会在工程目录下创建一个test-output的文件夹,打开文件夹下的index.html可以查看测试结果,也可以在Eclipse的Console中查看结果,如下图:
这个报告很简陋,下面开始用ReportNG替换TestNG的报告
九、使用ReportNG生成报告
1、添加依赖,在pom.xml文件中添加下列依赖关系:
1 <dependency> 2 <groupId>org.uncommons</groupId> 3 <artifactId>reportng</artifactId> 4 <version>1.1.4</version> 5 <scope>test</scope> 6 <exclusions> 7 <exclusion> 8 <groupId>org.testng</groupId> 9 <artifactId>testng</artifactId> 10 </exclusion> 11 </exclusions> 12 </dependency> 13 <dependency> 14 <groupId>com.google.inject</groupId> 15 <artifactId>guice</artifactId> 16 <version>4.0</version> 17 <scope>test</scope> 18 </dependency>
2、配置maven-surefire-plugin并加入reportNG listenser
1 <build> 2 <plugins> 3 <plugin> 4 <groupId>org.apache.maven.plugins</groupId> 5 <artifactId>maven-surefire-plugin</artifactId> 6 <version>2.17</version> 7 <configuration> 8 <suiteXmlFiles> 9 <suiteXmlFile>xmlfile/testng.xml</suiteXmlFile> 10 </suiteXmlFiles> 11 </configuration> 12 </plugin> 13 <plugin> 14 <groupId>org.apache.maven.plugins</groupId> 15 <artifactId>maven-surefire-plugin</artifactId> 16 <version>2.19.1</version> 17 <configuration> 18 <properties> 19 <property> 20 <name>usedefaultlisteners</name> 21 <value>false</value> 22 </property> 23 <property> 24 <name>listener</name> 25 <value>org.uncommons.reportng.HTMLReporter, org.uncommons.reportng.JUnitXMLReporter</value> 26 </property> 27 </properties> 28 <workingDirectory>target/</workingDirectory> 29 </configuration> 30 </plugin> 31 </plugins> 32 </build>
注意这句:<suiteXmlFile>xmlfile/testng.xml</suiteXmlFile>,我在工程目录下新建了一个文件夹,把testng的xml文件都放在这个目录下,如果有多个testng.xml文件的话,这样更直观,如果只有一个的话,不建文件夹也可以。
如果看不懂的话,请百度maven-surefire-plugin参数说明
3、更新一下Maven Project,然后右键选中Maven工程,选择Run As->Maven Test,运行成功后,在target目录下创建了一个surefire-reports目录,打开它下面的html文件夹,打开indel.xml,就可以看到相对美观的报告形式了:
reportNG报告样式是可以自定义的,我的报告中还有乱码,以后会慢慢研究。