如果我有一个带有一个组的beforeMethod,并且我运行了一个不同的组,但是在该组中存在一个测试,其既包含我正在运行的组,也包含具有beforeMethod的组,我想要该测试运行其以前的方法。例如:
@BeforeMethod(groups = "a")
public void setupForGroupA() {
...
}
@Test(groups = {"supplemental", "a"})
public void test() {
...
}
当我使用groups = supplemental运行testNG时,我仍然希望beforeMethod在测试之前运行,但由于该组是补充而不是' a',它不会。
这对我来说似乎是一个显而易见的特征,我觉得我必须错误地使用这些组,所以我也想解释我的工作流程,以防我的问题出在哪里。
我使用群组来定义不同的测试层次,以及他们是否需要创建自己的帐户,或者他们是否需要使用代理来访问他们的数据等等。我将拥有烟雾,补充和回归以及一组独特的账户,代理等。我不需要为第一组分组进行特定设置,但这些是我传入以在maven中运行的组。我需要为后面的组设置特定的设置,但我从不想只运行需要代理的测试,或者需要一个唯一的帐户。
答案 0 :(得分:2)
在运行时不评估组配置。 test
方法无法激活setupForGroupA
方法。
该功能用于查找要运行的方法。 根据以下示例:
@BeforeMethod(groups = "a")
public void setupForGroupA() {
...
}
@Test(groups = {"supplemental", "a"})
public void test() {
...
}
@Test(groups = {"supplemental"})
public void test2() {
...
}
如果您使用小组" a"它将运行setupForGroupA
和test
方法,因为它们标有组" a"。
如果您使用小组"补充"它将运行test
和test2
方法,因为它们标有组"补充"。
看起来你对某些方法有不同的行为,所以一个好的方法是分离不同类中的方法,并按类选择测试而不是按组选择测试。
public class A {
@BeforeMethod
public void setupForGroupA() {
...
}
@Test
public void test() {
...
}
}
和
public class Supplemental {
@Test
public void test2() {
...
}
}
运行A类只会运行setupForGroupA
和test
。
运行类Supplemental仅运行test2
。
运行这两个类将运行所有内容。
如果您想要运行这两个类并按其他方式过滤,您可以使用a method interceptor实现自己的逻辑:
@MyCustomAnnotation(tags = "a", "supplemental")
public class A {
...
}
@MyCustomAnnotation(tags = "supplemental")
public class Supplemental {
...
}
public class MyInterceptor implements IMethodInterceptor {
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
// for each method, if its class contains the expected tag, then add it to the list
// expect tag can be passed by a system property or in a parameter from the suite file (available from ITestContext)
}
}
答案 1 :(得分:1)
如果我弄错了,你想每次都运行你的before方法。在这种情况下,您可以为before方法设置alwaysRun = true,如下所示 -
@BeforeMethod(alwaysRun = true, groups = "a")
public void setupForGroupA() {
...
}
这是您想要的解决方案之一。