Cod*_*rer 11 junit unit-testing surefire maven
快速背景:我几天来一直在寻找一个Maven/Surefire测试运行问题,并且我已经将它缩小到少数测试怀疑.我看到的行为是疯狂的.我开始mvn clean test:250次测试运行,0次跳过.现在,我将可疑测试移至并重src/test/java试:146次测试运行,0次跳过!Maven的输出没有提供其他测试没有运行的线索,即使有-X标志.
这让我想到了一个问题:我称之为"怀疑"测试的原因是整个班级都是用@Ignore装饰的,所以我想在我的测试源中包含它应该根本没有效果.然后它发生在我身上 - 那些类具有管理虚拟Zookeeper服务器的 @ BeforeClass/@ AfterClass方法 .它之前产生了不稳定的行为,这就是我们进行@Ignored测试的原因.
如果JUnit运行前/后代码但忽略了测试,我不知道会发生什么(但它可能是超级糟糕的).这发生了吗?这应该发生吗?如果是这样,我怎么应该说"供参考,这里有一个测试,应该工作,但需要有固定"时,它包括@BeforeClass/@AfterClass?同样具有重大意义的是:这对Surefire/Maven到底是怎么回事,它会导致不相关的测试从地球上掉下来?
Mat*_*ell 17
如果您使用@Ignore注释进行测试,那么无论是否所有测试都是@Ignored,@ BevClass和@AfterClass都可以正常运行.
但是,如果Class具有@Ignore注释,则@BeforeClass和@AfterClass不会运行.
对于maven,如果您不想在特定类中运行任何测试,那么您必须在surefire或failsafe中忽略它们.将其添加到maven配置中(请参阅Maven Surefire插件)
<excludes>
<exclude>**/FoobarTest.class</exclude>
</excludes>
Run Code Online (Sandbox Code Playgroud)
环境:JDK 1.6,surefire插件2.9,jUnit 4.8.1,Maven 3.0,3.0.3,2.2.1.
我创建了这个测试类:
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
@Ignore
public class IgnoreTest {
@BeforeClass
public static void beforeClass() {
System.out.println("BEFORE CLASS");
}
@AfterClass
public static void afterClass() {
System.out.println("AFTER CLASS");
}
@Test
public void test1() throws Exception {
System.out.println("test1");
}
@Test
public void test2() throws Exception {
System.out.println("test2");
}
@Test
public void test3() throws Exception {
System.out.println("test3");
}
}
Run Code Online (Sandbox Code Playgroud)
然后mvn clean test打印这个:
Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.015 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1
Run Code Online (Sandbox Code Playgroud)
按预期工作.如果我删除@Ignore并mvn clean test再次运行它打印:
Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
BEFORE CLASS
test2
test1
test3
AFTER CLASS
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec
Results :
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
Run Code Online (Sandbox Code Playgroud)
所以,它适用于我有三个不同的Maven版本.没有@BeforeClass/ @AfterClass在@Ignored课程中运行.
当@BeforeClass/ @AfterClassmethods可以在@Ignored测试类中运行时,有一种(可能更多)情况.当你被忽略的类有一个未被忽略的子类时:
import org.junit.Test;
public class IgnoreSubTest extends IgnoreTest {
@Test
public void test4() throws Exception {
System.out.println("test4 subclass");
}
}
Run Code Online (Sandbox Code Playgroud)
结果mvn clean test:
Running hu.palacsint.stackoverflow.q7535177.IgnoreTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.047 sec
Running hu.palacsint.stackoverflow.q7535177.IgnoreSubTest
BEFORE CLASS
test4 subclass
test1
test2
test3
AFTER CLASS
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec
Results :
Tests run: 5, Failures: 0, Errors: 0, Skipped: 1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,运行@BeforeClass和@AfterClass方法是因为它们是IgnoreSubTest测试类的方法.
| 归档时间: |
|
| 查看次数: |
14371 次 |
| 最近记录: |