我正在尝试使用jUnit 4.4执行测试,为一组集成测试执行设置和拆解.拆卸需要可靠运行.我在使用TestNG时遇到了其他问题,所以我想回到jUnit.在运行任何测试之前以及所有测试完成之后,可以执行哪些挂钩?
注意:我们正在使用maven 2进行构建.我尝试过使用maven pre-
和post-integration-test
阶段,但是,如果测试失败,maven会停止并且不会运行post-integration-test
,这没有任何帮助.
是的,可以在测试套件中的任何测试之前和之后可靠地运行设置和拆除方法.让我在代码中演示:
package com.test; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({Test1.class, Test2.class}) public class TestSuite { @BeforeClass public static void setUp() { System.out.println("setting up"); } @AfterClass public static void tearDown() { System.out.println("tearing down"); } }
所以你的Test1类看起来像:
package com.test; import org.junit.Test; public class Test1 { @Test public void test1() { System.out.println("test1"); } }
......你可以想象Test2看起来很相似.如果你运行TestSuite,你会得到:
setting up test1 test2 tearing down
因此,您可以看到设置/拆除仅分别在所有测试之前和之后运行.
问题:这只适用于运行测试套件,而不是将Test1和Test2作为单独的JUnit测试运行的情况.你提到你正在使用maven,maven surefire插件喜欢单独运行测试,而不是套件的一部分.在这种情况下,我建议创建一个每个测试类扩展的超类.然后,超类包含带注释的@BeforeClass和@AfterClass方法.虽然不如上述方法那么干净,但我认为它对您有用.
对于测试失败的问题,您可以设置maven.test.error.ignore,以便在失败的测试中继续构建.这不建议作为持续练习,但它应该让您在所有测试通过之前都能正常运行.有关更多详细信息,请参阅maven surefire文档.
我的一位同事建议如下:您可以使用自定义RunListener并实现testRunFinished()方法:http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html#testRunFinished(org . junit.runner.Result)
要注册RunListener,只需按如下方式配置surefire插件:http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html "使用自定义侦听器和记者"部分
故障安全插件也应该选择此配置.这个解决方案很棒,因为你不必指定套件,查找测试类或任何这些东西 - 它让Maven发挥其魔力,等待所有测试完成.
你可以在JUnit 4.9+中使用@ClassRule注释,正如我在回答另一个问题时所描述的那样.
使用注释,您可以执行以下操作:
import org.junit.*; import static org.junit.Assert.*; import java.util.*; class SomethingUnitTest { @BeforeClass public static void runBeforeClass() { } @AfterClass public static void runAfterClass() { } @Before public void setUp() { } @After public void tearDown() { } @Test public void testSomethingOrOther() { } }