具有多个套件的Testng。 @AfterSuite方法在第一套件和第二套件无法运行后关闭驱动程序

时间:2015-07-09 14:43:39

标签: java testing selenium-webdriver automation testng

我使用testng来运行测试。我有几个测试套件( Suite1.xml Suite2.xml Suite3.xml ),它们组合在一个套件中( MasterSuite.xml )。除此之外,我还有TestBase.java课程,我在其中配置@BeforeTest@BeforeMethod@BeforeSuite@AfterSuite等方法。

运行@AfterSuite方法会关闭驱动程序(driver.quit())。

我想要的是什么:运行MasterSuite,它将一个接一个地运行我的所有3个套件。

问题:在执行第一个套件(Suite1)后,驱动程序已关闭,因此无法运行Suite2

如何解决此问题?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="MasterSuite">
    <suite-files>
        <suite-file path="Suite1.xml" />
        <suite-file path="Suite2.xml"/>
        <suite-file path="Suite3.xml"/>
    </suite-files>
</suite>

3 个答案:

答案 0 :(得分:1)

  1. 从AfterSuite中删除quit方法,并将其放在最后一个套件中的所有测试用例之后
  2. 使测试用例独立,如果没有,可以使用BeforeMethod和AfterMethod调用浏览器,如果失败则关闭浏览器加上登录部分(如果需要),这样可以在以后获得独立的测试用例
  3. 每个套件完成后都会调用AfterSuite,因此在调用第一个套件后会调用您的退出驱动程序。你可以使用BeforeSuite有一个方法,如果它没有运行就会调用它,可以有一个标志,如果它没有运行,它将确保只启动一个驱动程序
  4. 如果是少数测试用例,您可以将它们全部放在一个测试套件中,并以相同的方式继续进行,没有任何问题

答案 1 :(得分:1)

我建议使用TestNG Listener ISuiteListener

首先,将Driver作为套件属性存储,例如在TestBase的@BeforeClass中:

@Listeners({ SuiteListener.class })
public class TestBase {

    public WebDriver driver;

    @BeforeClass
    public void init(ITestContext testContext) {
        driver = createWebDriver(...);
        ISuite suite = testContext.getSuite();
        suite.setAttribute("driver", driver);
    }
    ...
}

然后,在SuiteListener类中,创建onFinish()方法以获取存储的属性,并关闭驱动程序:

public class SuiteListener implements ISuiteListener {

    public WebDriver driver;

    /**
     * This method is invoked after the SuiteRunner (parent suite) has finished to run all the child suites.
     */
    public void onFinish(ISuite suite) {
        driver = (WebDriver) suite.getAttribute("driver");
        closeDriverAfterSuite(...);
    }

答案 2 :(得分:0)

如果你想一个接一个地运行一个套件而不是并行运行它们,那么在@BeforeSuite方法中启动你的驱动程序就足够了。

这样,您的所有套件都会有单独的WebDriver实例初始化。