在一个测试类中稳定测试方法

时间:2016-06-23 15:09:13

标签: java selenium selenium-webdriver automated-tests testng

我有一个使用testNG的测试类,有4种测试方法,测试一个网站用于4种不同的浏览器,如下面的代码:

public class MyTest {
    @Test
    public void acceptanceFFTest()
    {
    }
    @Test
    public void acceptanceChromeTest()
    {
    }
    @Test
    public void acceptanceIETest()
    {
    }
    @Test
    public void acceptanceSafariTest()
    {
    }
    @AfterMethod
    public void tearDown()
    {
        webDriver.quit();
    }
}

一个测试方法完成后,该浏览器的webdriver将在@AfterMethod中被杀死,下一个浏览器将分别以新的webdriver启动,依此类推。

我的问题是:如果我逐个运行这些测试方法,那么它们总是被传递。但是,如果我从测试类级别作为带有4个测试方法的测试套件运行,那么有时其中一个或两个会因NoElementException而失败,但异常并不总是在一个页面或一个元素,有时在这里,有时在那里。如果我再次单独运行失败的测试,那么它们就会通过。

我认为对于测试类级别,也许http信号有时很快,有时很慢,测试类级别不稳定作为单一测试方法,我不确定。

无论如何要稳定它们?谢谢。

1 个答案:

答案 0 :(得分:1)

我会重写测试,以便您在所有浏览器上运行一个测试。您可能在浏览器中遇到一些细微差别,但我认为这种整体方法更好,更易于管理。这是一个如何做到这一点的简单示例。对于这个例子,我只是硬编码了一个字符串browserType。我假设你会传递它或从文件或其他任何东西读取它。基本的想法是,您将driver变量定义为通用WebDriver。确定运行所需的浏览器后,实例化特定驱动程序并执行测试。

String browserType = "firefox"; // hardcoded for the example
WebDriver driver;

switch (browserType)
{
    case "firefox":
        driver = new FirefoxDriver();
        break;
    case "ie":
        driver = new InternetExplorerDriver();
        break;
    case "chrome":
        driver = new ChromeDriver();
        break;
    default:
        throw new Exception("browserType: " + browserType + " not defined.");
}

// do test case
driver.get("http://www.google.com");
// ... and so on