天天看點

Appium Android ——利用 TestNG 并行執行用例

一、測試類*注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 條回複

Appium Android ——利用 TestNG 并行執行用例

lihuazhang ·  #1 · 6 月前  喜歡 

這可以成為appium并行執行的指導文章。大贊!不過你試過跑ui的用例了麼?

Appium Android ——利用 TestNG 并行執行用例

lihuazhang ·  #2 · 6 月前  喜歡 

第一個:

Port:4723

bootstrapPort:4724

第二個:

Port:4725

bootstrapPort:4726

可以解釋下 這兩個端口的意思

Appium Android ——利用 TestNG 并行執行用例

seveniruby ·  #3 · 6 月前  喜歡 

不錯, 已經開始用maven了, maven和gradle都內建了一些測試約定流程。 目前貌似沒多少人熟悉。

Appium Android ——利用 TestNG 并行執行用例

luis ·  #4 · 6 月前  喜歡 

@lihuazhang 沒記錯第一個應該是腳本作為client和appiumserver通信的端口,後者是mobile device和appium通信的端口,也是android上特有的。

Appium Android ——利用 TestNG 并行執行用例

cosyman ·  #5 · 6 月前  喜歡 

AppiumServer一共用到大概5個端口,4723預設為Bootstrap的socket端口。

示例為suite級别的并行run,如果suite不平衡不能充分利用Device資源,我們現在用case級别的并行run

Appium Android ——利用 TestNG 并行執行用例

lihuazhang ·  #6 · 6 月前  喜歡 

#5樓 @cosyman 介紹下?

Appium Android ——利用 TestNG 并行執行用例

sanlengjingvv ·  #7 · 6 月前  喜歡 

#2樓 @lihuazhang 

跑過ui用例,有什麼問題嗎?

文章有更新。

Appium Android ——利用 TestNG 并行執行用例

ka612nd ·  #8 · 6 月前  喜歡 

看了一下午了,這篇最給力了!贊!

Appium Android ——利用 TestNG 并行執行用例

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不存在

這個是為什麼

Appium Android ——利用 TestNG 并行執行用例

sanlengjingvv ·  #10 · 6 月前  喜歡 

#9樓 @nancy2896 

這是Maven的問題,去看看Maven的書或資料吧。光看錯誤隻能猜咯,maven配置、pom寫錯、依賴沒下完等等……

完全按這個文章來的前提是能正确用指令行執行Maven和TestNG。

Appium Android ——利用 TestNG 并行執行用例

tspring ·  #11 · 5 月前  喜歡 

Appium Android ——利用 TestNG 并行執行用例

為什麼我的一直不生效? 但在target\test-classes可以找到class檔案啊 ?

Appium Android ——利用 TestNG 并行執行用例

cosyman ·  #12 · 5 月前  喜歡 

#6樓 @lihuazhang 首先是Appium的Wrapper可以重新開機,有端口配置設定的功能。然後case的并發級别設定為 parallel="methods" 。 然後在每個case跑之前去擷取一個Device和一個可用的Appium,跑完再把Device放回去。這裡主要是Device的取和放,要做到阻塞,這樣就可以控制并行執行

Appium Android ——利用 TestNG 并行執行用例

lihuazhang ·  #13 · 5 月前  喜歡 

#12樓 @cosyman Appium的Wrapper 是什麼?那這樣你就寫個afterMethod了。

Appium Android ——利用 TestNG 并行執行用例

cosyman ·  #14 · 5 月前  喜歡 

#13樓 @lihuazhang 

afterMethod 或 afterClass,Suite 取決于我們對Appium穩定性的把控吧。

Appium Server

Appium Android ——利用 TestNG 并行執行用例

nancy2896 ·  #15 · 5 月前  喜歡 

#10樓 @sanlengjingvv 傳suitethreadpoolsize參數

suitethreadpoolsize參數是什麼意思啊?

Appium Android ——利用 TestNG 并行執行用例

colorhaake ·  #16 · 5 月前  喜歡 

也可以參考這篇,隻不過是英文版的

https://www.packtpub.com/sites/default/files/downloads/Distributed_Testing_with_Selenium_Grid.pdf

Appium Android ——利用 TestNG 并行執行用例

sanlengjingvv ·  #17 · 4 月前  喜歡 

#15樓 @nancy2896 

http://testng.org/doc/documentation-main.html

這個頁面搜suitethreadpoolsize

Appium Android ——利用 TestNG 并行執行用例

testly ·  #18 · 4 月前  喜歡 

我試過隻能在一個裝置跑

19樓 已删除.

Appium Android ——利用 TestNG 并行執行用例

jindejava ·  #20 · 4 月前  喜歡 

頂一個。。。

Appium Android ——利用 TestNG 并行執行用例

jelver ·  #21 · 3 月前  喜歡 

好文章不少啊

Appium Android ——利用 TestNG 并行執行用例

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樓 已删除.

Appium Android ——利用 TestNG 并行執行用例

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

繼續閱讀