我有这样的配置:
<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
答案 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,因为它更适合集成测试。