当前位置: 首页 > 面试题库 >

如何使用testng并行运行我的selenium测试方法

宁飞宇
2023-03-14
问题内容

我正在尝试使用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配置方法来管理Webdriver实例化和清理。因此,您需要确定如何与您的@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将创建的Webdriver设置为ITestResult(如选项2所示)或的ThreadLocal(如选项1所示)的侦听器。您可以找到有关此选项的更多详细信息以及我博客中的代码片段。


 类似资料:
  • 这是驱动程序类,它将为每个测试方法创建驱动程序实例。

  • 需要一些帮助来获得并行运行testng测试用例的正确方法。

  • 我一个类有5到6个方法,想在不同的节点上并行运行方法,我有网格2设置,里面有4个节点。 下面是我的测试。xml 我有一个测试工具,它初始化了login、common和utils类 在我的测试类中,我扩展了测试工具,在@Beforemethod中,我调用了inilze方法 如果我运行测试,我会看到以下问题 两个浏览器在每个节点中打开一个,但只有一个浏览器启动应用程序,另一个不启动。 如果我遗漏了什么

  • 我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。

  • 我正在尝试使用2个xml文件与Maven并行运行我的测试,但似乎不起作用。我已经尝试了Maven留档中的步骤/参数:http://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html 以下是我的pom.xml文件: 这是功能1.xml文件: 我应该做哪些参数/更改才能使其生效? 谢谢你

  • 我使用下面的TestNG配置来启用Selenium测试的并行执行。 Java代码: 硒测试预计将并行运行。我希望有2个浏览器打开并运行测试脚本。 但我只看到一个浏览器,所有3个测试都一个接一个地运行,而不是并行运行。我尝试过使用“并行”属性的测试、方法、类和实例选项。 有什么帮助吗?