簡體   English   中英

如何使用testng並行運行我的硒測試方法

[英]how to run my selenium test methods in parallel using testng

我正在嘗試使用testng並行運行自動化測試(Selenium webdriver)。 這是我正在運行的節點:

java -Dwebdriver.gecko.driver=chromedriver.exe -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=2 -maxSession 2

這是我的測試課:

public class TestParallel {

Login login;

//@BeforeMethod(alwaysRun = true)
public SeleniumDriverCore testSetup() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
    Properties config = new Properties();
    config.load(new FileInputStream("config/testConfig"));
    this.login = new Login(driver);
    driver.browser.open("https://test.test.xyz");

    driver.browser.maximize();
    driver.waits.waitForPageToLoad();
    return driver;
}

@Test(groups={"parallel"})
public void test_one() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}

@Test(groups={"parallel"})
public void test_two() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}

@Test(groups={"parallel"})
public void test_three() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}

@Test(groups={"parallel"})
public void test_four() throws FileNotFoundException, IOException{
    SeleniumDriverCore driver=testSetup();
    login.navigateToPage(Pages.LOGIN);
    login.assertion.verifyLoginPopupAndTitleDisplayed();
    testCleanup(driver);
}


public void testCleanup(SeleniumDriverCore driver){
    driver.close();
    driver.quit();
}

}

這是我的xml:

<suite name="Ontega - All Tests Mobile" parallel="methods" thread-count="2">
    <test name="Ontega - All Tests Mobile">
        <groups>
            <run>
                <include name="parallel"/>
                <exclude name="open-defects"/>
            </run>
        </groups>
        <packages>
            <package name="tests.*"/>
        </packages>
    </test>
</suite>

當我運行XML時,我希望測試一次在兩個線程中的兩個瀏覽器上運行,但是,當我運行XML時,我使兩個瀏覽器實例第一次運行,然后它們分別遞增,並且50%測試失敗了,您可以看到我試圖在每個方法中實例化驅動程序,盡管這不是我的框架如何工作,但我試圖解決此問題的瓶頸。 任何幫助將不勝感激預先感謝

這是在TestNG中執行此操作的一些方法。 您基本上可以通過@BeforeMethod@AfterMethod配置方法來管理@BeforeMethod實例化和清理。 因此,您需要確定如何與@Test方法共享創建的webdriver實例。 為此,您有三個選擇:

  1. 你讓使用的ThreadLocal變種,因為TestNG的保證給你,它會執行@BeforeMethod@Test@AfterMethod在同一個線程所有。

這是一個示例,向您展示了這種方法

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestClassSampleUsingThreadLocal {
    private static final ThreadLocal<RemoteWebDriver> drivers = new ThreadLocal<>();

    @BeforeMethod
    public void instantiateBrowser(ITestResult testResult) {
        RemoteWebDriver driver = new ChromeDriver();
        drivers.set(driver);
    }

    @Test(dataProvider = "dp")
    public void testMethod(String url) {
        Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
        driver().get(url);
        Reporter.log("Page Title :" + driver().getTitle(), true);
    }

    @DataProvider(name = "dp", parallel = true)
    public Object[][] getData() {
        return new Object[][]{
                {"http://www.google.com"}, {"http://www.stackoverflow.com"}, {"http://facebook.com"}
        };
    }

    @AfterMethod
    public void cleanupBrowser() {
        RemoteWebDriver driver = driver();
        driver.quit();
    }

    private RemoteWebDriver driver() {
        RemoteWebDriver driver = drivers.get();
        if (driver == null) {
            throw new IllegalStateException("Driver should have not been null.");
        }
        return driver;
    }

}
  1. 您可以通過ITestResult對象共享webdriver實例。 這是一個示例,顯示了實際效果。
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestClassSample {
    private static final String WEBDRIVER = "driver";

    @BeforeMethod
    public void instantiateBrowser(ITestResult testResult) {
        RemoteWebDriver driver = new ChromeDriver();
        testResult.setAttribute(WEBDRIVER, driver);
    }

    @Test(dataProvider = "dp")
    public void testMethod(String url) {
        Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
        driver().get(url);
        Reporter.log("Page Title :" + driver().getTitle(), true);
    }

    @DataProvider(name = "dp", parallel = true)
    public Object[][] getData() {
        return new Object[][]{
                {"http://www.google.com"},
                {"http://www.stackoverflow.com"},
                {"http://facebook.com"}
        };
    }

    @AfterMethod
    public void cleanupBrowser(ITestResult testResult) {
        RemoteWebDriver driver = driver(testResult);
        driver.quit();
    }

    private RemoteWebDriver driver() {
        return driver(Reporter.getCurrentTestResult());
    }

    private RemoteWebDriver driver(ITestResult testResult) {
        if (testResult == null) {
            throw new IllegalStateException("testResult should have not been null.");
        }
        Object driverObject = testResult.getAttribute(WEBDRIVER);
        if (driverObject == null) {
            throw new IllegalStateException("Driver should have not been null.");
        }
        if (!(driverObject instanceof RemoteWebDriver)) {
            throw new IllegalStateException("Driver is not a valid webdriver object");
        }
        return (RemoteWebDriver) driverObject;
    }
}
  1. 您將Webdriver實例化和清理過程提取到TestNG偵聽器(該偵聽器實現org.testng.IInvokedMethodListener ,該偵聽器將創建的org.testng.IInvokedMethodListener設置為ITestResult (如選項2所示)或ThreadLocal (如選項1所示)。可以在我的博客文章中找到有關此選項的更多詳細信息以及代碼段。

似乎您在每個測試中創建了多個驅動程序。 我猜你需要在testSetup()方法之外保留部分代碼

SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
Properties config = new Properties();
config.load(new FileInputStream("config/testConfig"))

我正在共享我用於並行測試的部分代碼,可能會對您有幫助 在此處輸入圖片說明

我的xml 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM