当方法*包含*一个组时,运行@BeforeMethod testNG注释

时间:2016-11-15 17:52:12

标签: java testng integration-testing

如果我有一个带有一个组的beforeMethod,并且我运行了一个不同的组,但是在该组中存在一个测试,其既包含我正在运行的组,也包含具有beforeMethod的组,我想要该测试运行其以前的方法。例如:

@BeforeMethod(groups = "a")
public void setupForGroupA() {
...
}

@Test(groups = {"supplemental", "a"})
public void test() {
...
}

当我使用groups = supplemental运行testNG时,我仍然希望beforeMethod在测试之前运行,但由于该组是补充而不是' a',它不会。

这对我来说似乎是一个显而易见的特征,我觉得我必须错误地使用这些组,所以我也想解释我的工作流程,以防我的问题出在哪里。

我使用群组来定义不同的测试层次,以及他们是否需要创建自己的帐户,或者他们是否需要使用代理来访问他们的数据等等。我将拥有烟雾,补充和回归以及一组独特的账户,代理等。我不需要为第一组分组进行特定设置,但这些是我传入以在maven中运行的组。我需要为后面的组设置特定的设置,但我从不想只运行需要代理的测试,或者需要一个唯一的帐户。

2 个答案:

答案 0 :(得分:2)

在运行时不评估组配置。 test方法无法激活setupForGroupA方法。

该功能用于查找要运行的方法。 根据以下示例:

@BeforeMethod(groups = "a")
public void setupForGroupA() {
...
}

@Test(groups = {"supplemental", "a"})
public void test() {
...
}

@Test(groups = {"supplemental"})
public void test2() {
...
}

如果您使用小组" a"它将运行setupForGroupAtest方法,因为它们标有组" a"。

如果您使用小组"补充"它将运行testtest2方法,因为它们标有组"补充"。

看起来你对某些方法有不同的行为,所以一个好的方法是分离不同类中的方法,并按类选择测试而不是按组选择测试。

public class A {
  @BeforeMethod
  public void setupForGroupA() {
    ...
  }

  @Test
  public void test() {
    ...
  }
}

public class Supplemental {
  @Test
  public void test2() {
    ...
  }
}

运行A类只会运行setupForGroupAtest。 运行类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() {
...
}

这是您想要的解决方案之一。