我有一个带有测试的班级,每个测试都包含在不同的组中。对于所有组都应该做一些准备才能成功运行测试。我正在为不同的测试组使用多个@BeforeSuite。
这是我的例子:
public class TestClass {
@BeforeSuite(groups = {"groupOne"})
public void setUpGroupOne(@Optional("parameter") String parameter) {
// some logic only for groupOne
}
@BeforeSuite(groups = {"groupTwo"})
public void setUpGroupTwo() {
// some logic only for groupTwo
}
@BeforeTest(alwaysRun = true)
public void onStart() {}
@BeforeMethod(alwaysRun = true)
public void prepareForTest() {}
@Test(groups = {"groupOne"})
public void testGroupOne() {
// some test steps with setUp for groupOne
}
@Test(groups = {"groupTwo"})
public void testGroupTwo() {
// some test steps with setUp for groupTwo
}
@AfterTest(alwaysRun = true)
public void onFinish() {}
@AfterMethod(alwaysRun = true)
public void cleanUpAfterTest() {}
}
如果从 xml 文件运行组 - 根本没有问题,所有方法仅针对相关组运行。
但是,如果我只想运行一种测试方法 - 例如,仅从我的类中运行
testGroupOne()
- 两个 @BeforeSuite 方法都会被执行 - 对于“groupOne”和“groupTwo”。
问题是我的测试testGroupOne
没有获得我在setUpGroupOne
中应用的必要参数。
当我从类(而不是 xml)运行它时,如何避免运行与我执行的 @Test 组不相关的方法?
也许我的任务还有其他解决方案?
在 TestNG 中,@BeforeSuite 和 @AfterSuite 注释设计为在一组测试之前和之后运行,如 XML 文件中所定义。这些方法本质上并不知道将运行的特定测试方法;它们被设计为每个套件执行一次,无论该套件中包含哪些测试或组。
这就是为什么当您直接从类(XML 套件之外)运行单独的测试方法时,两个 @BeforeSuite 方法都会被执行:TestNG 正在准备整个套件,而不知道您打算运行的特定测试方法。
为了实现您正在寻找的行为(根据正在运行的测试组执行设置方法),您可以使用 @BeforeGroups 和 @AfterGroups 注释的组合。这些注释允许您定义分别在属于一组测试的测试方法的第一次和最后一次调用之前和之后执行的设置和拆卸方法。
以下是修改课程的方法:
public class TestClass {
@BeforeGroups("groupOne")
public void setUpGroupOne(@Optional("parameter") String parameter) {
// some logic only for groupOne
}
@BeforeGroups("groupTwo")
public void setUpGroupTwo() {
// some logic only for groupTwo
}
@BeforeTest(alwaysRun = true)
public void onStart() {}
@BeforeMethod(alwaysRun = true)
public void prepareForTest() {}
@Test(groups = {"groupOne"})
public void testGroupOne() {
// some test steps with setUp for groupOne
}
@Test(groups = {"groupTwo"})
public void testGroupTwo() {
// some test steps with setUp for groupTwo
}
@AfterTest(alwaysRun = true)
public void onFinish() {}
@AfterMethod(alwaysRun = true)
public void cleanUpAfterTest() {}
@AfterGroups("groupOne")
public void tearDownGroupOne() {
// Cleanup for groupOne
}
@AfterGroups("groupTwo")
public void tearDownGroupTwo() {
// Cleanup for groupTwo
}
}
使用此设置,如果单独运行 testGroupOne(),则只会执行 setUpGroupOne()。同样,如果运行 testGroupTwo(),则只会执行 setUpGroupTwo()。这样,您的设置和拆卸就与组相关联,并且仅针对实际正在测试的组运行。