2017-05-08 77 views
1

我剛開始創建一個appium框架。當我嘗試創建驅動程序時,我面臨着挑戰。Appium並行執行+ TestNG框架問題

它開始如下

步驟1:基於線程數和設備,我會在TestNG的@Beforesuite運行時創建appium服務器。

cap.setCapability("noReset", "false"); 
    cap.setCapability(MobileCapabilityType.DEVICE_NAME, "Dev1"); 
    cap.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome"); 
    cap.setCapability(MobileCapabilityType.UDID, udid); 
    //Build the Appium service 
    builder = new AppiumServiceBuilder(); 
    builder.withIPAddress("127.0.0.1"); 
    builder.usingAnyFreePort(); 
    builder.withCapabilities(cap); 
    builder.withArgument(GeneralServerFlag.SESSION_OVERRIDE); 
    builder.withArgument(GeneralServerFlag.LOG_LEVEL, "error"); 

    appiumservice = AppiumDriverLocalService.buildService(builder); 
    appiumservice.start(); 

第2步:我會得到appium服務器URL的所有設備使用連接

appiumservice.getUrl().toString() 

現在我有所有的服務器的URL和能力。

現在的問題是在testng.xml文件,如果我給並行和線程數到3,如何設置以這樣的方式創建一個@BeforeMethod對象AndroidDriver每次應採取不同的appium服務器的URL和執行測試? 我的@Beforemethod和@Aftermethod應該如何?

感謝

回答

0
Pass port and device from testng : 

<suite name="Suite" verbose="1" parallel="tests" thread-count="2"> 
<parameter name="properties" value="XXX" /> 
<tests> 
<test name="Run on device 1"> 
<classes> 
<parameter name="port" value="4723"/> 
<parameter name="device" value="DeviceID1"></parameter> 
<class name="com.testScripts.ABC"> 
<methods> 
    <include name="test1"/> 
</methods> 
</class> 
</classes> 
</test> 
<test name="run on device 2"> 
<classes> 
<parameter name="port" value="4724"></parameter> 
<parameter name="device" value="DeviceID2"></parameter> 
<class name="com.testScripts.ABC"> 
<methods> 
<include name="test1"/> 
</methods> 
</class> 
</classes> 
</test> 
</tests> 
</suite> 


Put following annotation in method whrere you are defining your capability .. 
@BeforeTest(alwaysRun=true) 
@Parameters({"port","device"}) 
Public void capablities() 
{ 
cap.setCapability("noReset", "false"); 
    cap.setCapability(MobileCapabilityType.DEVICE_NAME, device); 
    cap.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome"); 
    cap.setCapability(MobileCapabilityType.UDID, udid); 
    //Build the Appium service 
    builder = new AppiumServiceBuilder(); 
    builder.withIPAddress("127.0.0.1"); 
    //use port pass in testng file 
    // builder.usingAnyFreePort(); 
    builder.withCapabilities(cap); 
    builder.withArgument(GeneralServerFlag.SESSION_OVERRIDE); 
    builder.withArgument(GeneralServerFlag.LOG_LEVEL, "error"); 

    appiumservice = AppiumDriverLocalService.buildService(builder); 
    appiumservice.start(); 
} 
+0

感謝毒刃,但我有幾個對解決問題提供。你想讓我在@beforemethod中創建驅動程序對象嗎?並行執行會自動處理所提供參數的不同驅動對象?可以說http://127.0.0,1:4723/wd/hub中的一個線程和其他http://127.0.0.1:4724/wd/hub – user2350138

+0

根據您爲設備和端口提供的參數,它將創建.. .n實例數127.0.0,1:4723/wd/hub,127.0.0,1:4724/wd/hub ...在tesng中聲明並行將在標記中以並行方式執行。 – shiv

0

我建議在@BeforeClass方法初始化驅動程序,和SHIV提到,在使用TestNG的參數:

driver = new RemoteWebDriver(new URL("http://0.0.0.0:"+ port +"/wd/hub"), capabilities);