使用TestNG并行化参数化的Selenium测试

6

首先,抱歉我的英语不是很好 :)

我遇到了以下问题:我正在尝试使用Selenium Grid和TestNg在不同的浏览器中运行并行测试,并在@BeforeTest方法中传递参数。我的问题是,当每个测试被初始化时,它们似乎会使用最后一个测试的参数。因此,在这个例子中,当我运行测试时,它将打开两个Chrome浏览器,而不是一个Firefox和一个Chrome。 (browser.getDriver()方法返回一个RemoteWebDriver)

TestNG.xml:

<suite thread-count="2" verbose="10" name="testSuite" parallel="tests">
  <test name="nameOfTheTestFirefox">
    <parameter name="platform" value="windows"/>
    <parameter name="browserVersion" value="32"/>
    <parameter name="browserName" value="firefox"/>
    <classes>
      <class name="example.test.login.LoginOverlayTest"/>
    </classes>
  </test> <!-- nameOfTheTestFirefox -->
  <test name="nameOfTheTestChrome">
    <parameter name="platform" value="windows"/>
    <parameter name="browserVersion" value="38"/>
    <parameter name="browserName" value="chrome"/>
    <classes>
      <class name="example.test.login.LoginOverlayTest"/>
    </classes>
  </test> <!-- nameOfTheTestChrome -->
</suite> <!-- testSuite -->

AbstractTest类:

public class SeleniumTest {

    private static List<WebDriver> webDriverPool = Collections.synchronizedList(new ArrayList<WebDriver>());
    private static ThreadLocal<WebDriver> driverThread;
    public static BrowserSetup browser;

    @Parameters({ "browserName", "browserVersion", "platform"})
    @BeforeTest()
    public static void beforeTest(String browserName, @Optional("none") String browserVersion, String platform) throws WrongBrowserException, WrongPlatformException {

        final BrowserSetup browser = new BrowserSetup(browserName, browserVersion, platform);

        driverThread = new ThreadLocal<WebDriver>() {

            @Override
            protected WebDriver initialValue() {
                final WebDriver webDriver = browser.getDriver();
                webDriverPool.add(webDriver);
                return webDriver;
            }

        };

    }

    public static WebDriver getDriver() {
        return driverThread.get();
    }

    @AfterTest
    public static void afterTest() {
        for (WebDriver driver : webDriverPool) {
            driver.quit();
        }
    }

}

我的示例 @Tests:

@Test
public void test1() throws InterruptedException {
    WebDriver driver = getDriver();
    System.out.println("START: test1");
    driver.get("http://google.com");
    Thread.sleep(5000);
    System.out.println("END:  test1, title: " + driver.getTitle());
}

@Test
public void test2() throws InterruptedException {
    WebDriver driver = getDriver();
    System.out.println("START: test2");
    driver.get("http://amazon.com");
    Thread.sleep(5000);
    System.out.println("END:  test2, title: " + driver.getTitle());
}

@Test
public void test3() throws InterruptedException {
    WebDriver driver = getDriver();
    System.out.println("START: test3");
    driver.get("http://stackoverflow.com");
    Thread.sleep(5000);
    System.out.println("END:  test3, title: " + driver.getTitle());
}

所以我的问题是如何并行运行具有给定参数的测试,并在单独的线程中进行? 预先感谢你! Peter
2个回答

3

不要将字段设置为静态。

private static List<WebDriver> webDriverPool = Collections.synchronizedList(new ArrayList<WebDriver>());
private static ThreadLocal<WebDriver> driverThread;
public static BrowserSetup browser;

2

如果您想要并行运行,beforeTest()和afterTest()不应该是静态的,或者使其同步以确保线程安全。此外,您没有使用声明的变量:

public static BrowserSetup browser; 

从所有情况来看,你可能遗漏了一些内容,因为你还有:

final BrowserSetup browser = new BrowserSetup(browserName, browserVersion, platform);

在 beforeTest(...) 函数内部


是的,我忘记删除它了,谢谢 :) 我从代码中删除了所有静态元素,现在可以正常工作了 :) - peetya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接