2017-05-26 189 views
0

無法並行運行TC。我在testng.xml文件中設置了並行TC。它打開4個瀏覽器實例,但測試用例失敗。看起來它只創建了一個瀏覽器會話實例(或類似的東西),所以它試圖在一個實例中完成所有4個測試。運行Java Selenium Pararel測試用例

如何修改我的設置以並行運行TCs?

我已經設置了驅動程序以下列方式:

package MainSettings; 

import Pages.StartPage; 
//import TrackReporting.CaptureScreenShotOnFailureListener; 
import TrackReporting.LoggingEventListener; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.events.EventFiringWebDriver; 
import org.openqa.selenium.support.events.WebDriverEventListener; 
import org.testng.annotations.*; 

/** 
* Created by serhii.kaihorodov on 1/4/2016. 
*/ 
//@Listeners(CaptureScreenShotOnFailureListener.class) 
public class Settings { 
    protected static WebDriver driver; 
    protected String baseURL = "https://www.ukr.net"; 
    private static final WebDriverEventListener eventListener = new LoggingEventListener(); 
    protected StartPage mainPage; 

    @BeforeMethod 
    public void setUp() 
    { 
     System.setProperty("webdriver.chrome.driver", "D:\\Programming\\Java Automation\\ukr.net_test_cases-master\\chromedriver.exe"); 
//  driver = new EventFiringWebDriver(new FirefoxDriver()).register(eventListener); 
     driver = new EventFiringWebDriver(new ChromeDriver()).register(eventListener); 
     getDriver().get(baseURL); 
     mainPage = new StartPage(); 
     driver.manage().window().maximize(); 
    } 

    @AfterMethod 
    public void tearDown() 
    { 
     driver.quit(); 
    } 

    public static WebDriver getDriver() 
    { 
     return driver; 
    } 
} 

我的testng.xml文件如下:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 

<suite name="My_auto_test" verbose="2" parallel="methods" thread-count="4"> 

    <test name="ukr.net"> 
     <classes> 
      <class name="TestCases.TestCases_block_1"/> 
     </classes> 
    </test> 

</suite> 

POM文件:

<?xml version="1.0" encoding="UTF-8"?> 
<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>MySel20Proj</groupId> 
    <artifactId>MySel20Proj</artifactId> 
    <version>1.0</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.seleniumhq.selenium</groupId> 
      <artifactId>selenium-java</artifactId> 
      <version>3.3.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.testng</groupId> 
      <artifactId>testng</artifactId> 
      <version>6.9.6</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.testng</groupId> 
      <artifactId>testng</artifactId> 
      <version>6.9.8</version> 
      <scope>test</scope> 
     </dependency> 

    </dependencies> 

    <build> 
     <pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <version>2.20</version> 
        <configuration> 
         <parallel>tests</parallel> 
         <threadCount>4</threadCount> 
         <suiteXmlFiles> 
          <suiteXmlFile>KayTC/src/testng.xml</suiteXmlFile> 
         </suiteXmlFiles> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 
</project> 

我的幾個測試案例有:

package TestCases; 

import MainSettings.Settings; 
import org.testng.annotations.Test; 

import java.io.IOException; 

/** 
* Created by serhii.kaihorodov on 1/4/2016. 
*/ 
public class TestCases_block_1 
{ 
    public class TestCases extends Settings 
    { 
     @Test (priority=0) 
     public void login() 
     { 
      mainPage.login("[email protected]", "06011988"); 
     } 

     @Test (priority=0) 
     public void sinoptik_link_is_present1() 
     { 
      mainPage.login("[email protected]", "06011988").sinoptik_link_is_present(); 
     } 

     @Test (priority=0) 
     public void autosale_link_is_present1() 
     { 
      mainPage.login("[email protected]", "06011988").autosale_link_is_present(); 
     } 
    } 
+0

driver = new EventFiringWebDriver(new ChromeDriver())。register(eventListener);可能會造成你的問題 – kushal

回答

0

考慮使用線程安全變量,也許所有線程都使用相同的WebDriver實例進行所有測試,這就是爲什麼崩潰。 嘗試聲明的變量是這樣的:

在你的父類,你應該有這樣的事情,所以你可以存儲的webdriver

private Map<String, ThreadLocal> drivers = new HashMap<String, ThreadLocal>(); 

幾個實例然後在TestCase類,你應該有一個安全的方式來存儲該物體的webdriver(java.lang.ThreadLocal中爲我們提供了一個的webdriver線程安全包裝。)

ThreadLocal<WebDriver> threadedDriver = new ThreadLocal<WebDriver>(); 
threadedDriver.set(/* method returning instance of WebDriver*/); 

drivers.put(testName, threadedDriver); //so it can be saved in memory 
WebDriver driver = drivers.get(testName).get(); //this is how you get the object for regular use 

希望它能幫助!

+0

ManoPajaro,謝謝你的回答!但是,如何在@BeforeMethod中快速獲取testName? –

+0

您可以將測試名稱作爲方法名稱並使用: 'String testName = new Object(){} .getClass()。getEnclosingMethod()。getName();' – ManoPajaro

相關問題