为什么maven surefire试图从其他组中实例化测试?

时间:2014-02-11 20:06:10

标签: maven maven-surefire-plugin

我有这样的配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.13</version>

            <configuration>
                <excludedGroups>integration</excludedGroups>
                <argLine>-Xmx512m -XX:MaxPermSize=128m</argLine>
                <systemPropertyVariables>
                    <project.build.directory>${project.build.directory}</project.build.directory>
                </systemPropertyVariables>
            </configuration>
        </plugin>
    </plugins>
</build>

测试:

@Test(groups = "integration")//testng
public class MyTest extends BaseTestForMyTest {


private final SomeClass sut = new SomeClass(getStuffFromSysPropDefinedForFailSafe());//should fail in surefire.


@Test(groups = "integration")
public void someTest() throws IOException {
    //some code
 }
}

surefire尝试实例化一个类并失败(失败是可以的,这个测试是为了failafe!)。 为什么,为什么surefire会尝试从排除的组中实例化测试?

对不起,我没提。我正在使用testng

1 个答案:

答案 0 :(得分:1)

这里有两个答案。

回答第一个问题“为什么new SomeClass(getStuffFromSysPropDefinedForFailSafe());被调用?”

TestNG在查找注释之前实例化所有测试类。我不知道这是故意的,还是可以避免的。 TestNG准备调用@BeforeClass方法,因此它希望对象调用该方法。在实例化对象时,实例成员(在本例中为sut)也会被实例化。

我可以看到,无条件地创建每个测试类的实例会使TestNG的生活变得更轻松,很可能没有人曾要求任何其他行为。


回答第二个问题(不确定您是否真的问过这个问题)“为什么要运行测试?”

您没有正确排除它。在TestNG中,groups参数采用字符串数组,而不是单个字符串。尝试

@Test(groups = { "Integration" })
public class YourTests {
  @Test(groups = { "ReallySlow" })
  public void someTest {
    // This test is a really slow integration test and is in both groups.
  }
}

对于您提出的任何问题都不是答案,但希望有些读过这篇文章的人感兴趣(加上我在您的一些问题编辑之前写过这篇文章):

要将JUnit测试标记为在surefire插件将排除的组中,您必须将它们注释为属于类别。与上述TestNG代码等效的JUnit是:

@Category(IntegrationTest.class)
public class YourTests {
  @Category(ReallySlowTest.class)
  @Test
  public void someTest {
    // This test is a really slow integration test and is in both categories.
  }
}

您可以在this dzone article中阅读更多内容。

此外,您应该阅读failsafe plugin,因为它更适合集成测试。