一、測試類*注1
package com.testerhome;
import io.appium.java_client.android.AndroidDriver;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
public class Suite1 {
public String port;
public String udid;
private AndroidDriver driver;
@Test
public void switches() throws InterruptedException {
WebElement sound = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Sound\")");
sound.click();
System.out.println("checked");
Thread.sleep(2000);
System.out.println(Thread.currentThread());
}
@BeforeSuite
@Parameters({ "port", "udid" })
public void beforeSuite(String port, String udid) {
this.port = port;
this.udid = udid;
}
@BeforeClass
public void beforeClass() throws MalformedURLException{
System.out.println(port + udid);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName","device");
capabilities.setCapability("automationName","Appium");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("udid", udid);
capabilities.setCapability("appPackage", "com.android.settings");
capabilities.setCapability("appActivity", ".Settings");
driver = new AndroidDriver(new URL("http://127.0.0.1:" + port + "/wd/hub"), capabilities);
}
@AfterClass
public void afterClass() {
driver.quit();
}
}
二、連接配接兩個Android裝置或啟動兩個虛拟機
使用
adb devices
擷取udid
三、項目路徑下建立兩個testng.xml
testng1.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite1">
<parameter name = "port" value = "4723"/>
<parameter name = "udid" value = "emulator-5554"/>
<test name="Test">
<classes>
<class name="com.testerhome.Suite1"/>
</classes>
</test>
</suite>
testng2.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite2">
<parameter name = "port" value = "4725"/>
<parameter name = "udid" value = "emulator-5556"/>
<test name="Test">
<classes>
<class name="com.testerhome.Suite1"/>
</classes>
</test>
</suite>
四、開啟兩個appium server*注2、注3
第一個:
Port:4723
bootstrapPort:4724
第二個:
Port:4725
bootstrapPort:4726
五、導出依賴*注4
因為是用maven工程建立的,是以先導出依賴到項目路徑下的lib檔案夾
mvn dependency:copy-dependencies -DoutputDirectory=lib
六、執行測試
先用Maven串行執行一次以編譯出Class檔案
mvn clean test
然後
java -classpath ".\target\test-classes" -Djava.ext.dirs=lib org.testng.TestNG -suitethreadpoolsize 2 testng1.xml testng2.xml
如果沒有配置TestNG環境變量
java -classpath ".\target\test-classes;D:\Programs\testng-6.8\testng-6.8.jar" -Djava.ext.dirs=lib org.testng.TestNG -suitethreadpoolsize 2 testng1.xml testng2.xml
七、檢視報告
預設在項目路徑下的test-output檔案夾
注1:
這個測試類沒有指定app路徑,如果指定,同時unzip的時候會沖突。目前是複制了多個apk。
File app = new File(appDir, "AppName"+port+".apk");
并在appium server指定不同的臨時檔案路徑,比如:
--tmp D:\tem1
--tmp D:\tem2
注2:
兩個端口的介紹可以看這兩個連結:
appium 自動化測試教程 ppt(第二版)
Appium Android Bootstrap源碼分析之簡介
注3:
如果使用到Selendroid或Chromium,還需要指定其他端口(需要修改測試類)
Selendroid port:8080
Selendroid port:8081
Chromium port:9515
Chromium port:9516
注4:
本來準備直接用mvn test并行執行的,但沒試出來傳suitethreadpoolsize參數的辦法
本帖已被設為精華帖! 喜歡 二維碼 共收到 22 條回複
lihuazhang · #1 · 6 月前 喜歡
這可以成為appium并行執行的指導文章。大贊!不過你試過跑ui的用例了麼?
lihuazhang · #2 · 6 月前 喜歡
第一個:
Port:4723
bootstrapPort:4724
第二個:
Port:4725
bootstrapPort:4726
可以解釋下 這兩個端口的意思
seveniruby · #3 · 6 月前 喜歡
不錯, 已經開始用maven了, maven和gradle都內建了一些測試約定流程。 目前貌似沒多少人熟悉。
luis · #4 · 6 月前 喜歡
@lihuazhang 沒記錯第一個應該是腳本作為client和appiumserver通信的端口,後者是mobile device和appium通信的端口,也是android上特有的。
cosyman · #5 · 6 月前 喜歡
AppiumServer一共用到大概5個端口,4723預設為Bootstrap的socket端口。
示例為suite級别的并行run,如果suite不平衡不能充分利用Device資源,我們現在用case級别的并行run
lihuazhang · #6 · 6 月前 喜歡
#5樓 @cosyman 介紹下?
sanlengjingvv · #7 · 6 月前 喜歡
#2樓 @lihuazhang
跑過ui用例,有什麼問題嗎?
文章有更新。
ka612nd · #8 · 6 月前 喜歡
看了一下午了,這篇最給力了!贊!
nancy2896 · #9 · 6 月前 喜歡
#7樓 @sanlengjingvv 我執行mvn clean test的時候報錯
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.
1:testCompile (default-testCompile) on project mytest: Compilation failure: Comp
ilation failure:
[ERROR] /E:/Users/Administrator/workspace/mytest/src/test/java/appiumdemo/mytest
/StuAppTest.java:[13,44] 程式包org.openqa.selenium.browserlaunchers不存在
[ERROR] /E:/Users/Administrator/workspace/mytest/src/test/java/appiumdemo/mytest
/TeaAppTest.java:[13,44] 程式包org.openqa.selenium.browserlaunchers不存在
這個是為什麼
sanlengjingvv · #10 · 6 月前 喜歡
#9樓 @nancy2896
這是Maven的問題,去看看Maven的書或資料吧。光看錯誤隻能猜咯,maven配置、pom寫錯、依賴沒下完等等……
完全按這個文章來的前提是能正确用指令行執行Maven和TestNG。
tspring · #11 · 5 月前 喜歡
為什麼我的一直不生效? 但在target\test-classes可以找到class檔案啊 ?
cosyman · #12 · 5 月前 喜歡
#6樓 @lihuazhang 首先是Appium的Wrapper可以重新開機,有端口配置設定的功能。然後case的并發級别設定為 parallel="methods" 。 然後在每個case跑之前去擷取一個Device和一個可用的Appium,跑完再把Device放回去。這裡主要是Device的取和放,要做到阻塞,這樣就可以控制并行執行
lihuazhang · #13 · 5 月前 喜歡
#12樓 @cosyman Appium的Wrapper 是什麼?那這樣你就寫個afterMethod了。
cosyman · #14 · 5 月前 喜歡
#13樓 @lihuazhang
afterMethod 或 afterClass,Suite 取決于我們對Appium穩定性的把控吧。
Appium Server
nancy2896 · #15 · 5 月前 喜歡
#10樓 @sanlengjingvv 傳suitethreadpoolsize參數
suitethreadpoolsize參數是什麼意思啊?
colorhaake · #16 · 5 月前 喜歡
也可以參考這篇,隻不過是英文版的
https://www.packtpub.com/sites/default/files/downloads/Distributed_Testing_with_Selenium_Grid.pdf
sanlengjingvv · #17 · 4 月前 喜歡
#15樓 @nancy2896
http://testng.org/doc/documentation-main.html
這個頁面搜suitethreadpoolsize
testly · #18 · 4 月前 喜歡
我試過隻能在一個裝置跑
19樓 已删除.
jindejava · #20 · 4 月前 喜歡
頂一個。。。
jelver · #21 · 3 月前 喜歡
好文章不少啊
xiaobanli · #22 · 3 月前 喜歡
@sanlengjingvv 這樣跑的話,生成的測試報告隻有一份,testng2.xml會覆寫testng1.xml.
我用maven的pom.xml去配置testng.xml,但是跑下來的結果是,串行跑,一台跑完去跑另外一台,求指教,如何能并行跑。
代碼如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
...
<suiteXmlFiles>
<suiteXmlFile>testng2.xml</suiteXmlFile>
<suiteXmlFile>testng1.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
23樓 已删除.
sanlengjingvv · #24 · 3 月前 喜歡
#22樓 @xiaobanli
這個文章裡沒有用maven去調用testng,maven隻是用來管理依賴,最後是導出依賴用指令行調用testng,在指令行裡傳入suitethreadpoolsize參數利用testng提供的多線程功能并行執行。
testng提供了test、method、suit等幾種并行方式,開始我也是準備用maven調用testng的,後來發現test、method之類都可以,隻有suit不能做到并行,但我需要的是suit級的并行,是以就換成導出依賴指令行執行這種方式了。
按你的執行方法報告會不會覆寫我沒試,不過報告是可以指定目錄的,outputDirectory
http://testng.org/doc/documentation-main.html#logging-xml-reports