TestNG中有多个setUp / tearDown级别?

时间:2010-10-19 18:32:23

标签: java unit-testing testng

在我的Selenium框架中使用TestNG时,setUp方法相对复杂。它有多个点可以破解,我想将它分成不同的步骤。

理想情况下,它看起来像这样:

// Does some DB stuff, logs some messages
@BeforeMethod(alwaysRun = true)
preTestCase


// Instantiates and opens up Selenium
@BeforeMethod(dependsOnMethods = {"preTestCase"})
seleniumSetup


// Closes Selenium only if it was properly setup
@AfterMethod(dependsOnMethods = {"seleniumSetup"})
seleniumTearDown


// All other test case teardown, error logging
@AfterMethod(alwaysRun=true)
postTestCase

我想避免的是因为数据库问题导致preTestCase失败,然后由于seleniumTearDown尝试关闭不存在的实例而导致二次失败。在这种情况下,只应运行postTestCase。我收到此错误:seleniumTearDown()不允许依赖public void seleniumSetUp(org.testng.ITestContext)。这是不允许/不好的设计?如何在两个tearDown方法之间强制执行run-order,以便postTestCase()始终最后运行,无论是否运行seleniumTearDown?

2 个答案:

答案 0 :(得分:2)

你的模型看起来有点不干净,安装和拆解不应该失败。虽然他们可能没有。如在; “尝试建立数据库连接,但没有可用,所以没有做任何事情”然后在拆除时你应该在尝试关闭它之前检查它们是否是连接。

否则,如果你想维护你当前的模型,你可以使用某种手动检查而不是注释(布尔值或单例类可以工作)。

In Setup:
if(dbGetConnected()) {
....
} else {
  dbisntconnected = true;
}

In tearDown:
if(!dbisntconnected) {
    dbClose();
}

答案 1 :(得分:2)

您看到的错误是因为您试图让@AfterMethod依赖于@BeforeMethod,这是没有意义的。您可以让配置方法相互依赖,但它们必须是所有相同的类型(例如所有@AfterMethod或所有@BeforeMethod)。

至于你的另一个问题,Valchris给出的解决方案是我推荐的。如果您知道您的测试或配置很脆弱但它们不应该中断测试运行,请自行捕获异常,以便TestNG永远不会看到它。