[英]JUnit confusion: use 'extends TestCase' or '@Test'?
我发现JUnit的正确使用(或至少是文档)非常令人困惑。 这个问题既可以作为将来的参考,也可以作为真实的问题。
如果我理解正确,那么可以使用两种主要方法来创建和运行JUnit测试:
方法A(JUnit 3-样式):创建一个扩展TestCase的类,并使用单词test
启动测试方法。 当将类作为JUnit测试运行(在Eclipse中)时,以单词test
开头的所有方法都将自动运行。
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
方法B(JUnit 4样式):创建一个“普通”类,并在方法前添加@Test
批注。 请注意,您不必以单词test
开头该方法。
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
混合两者似乎不是一个好主意,请参见例如这个stackoverflow问题 :
现在,我的问题是:
@Test(expected = ArithmeticException.class)
来测试异常。 但是,使用方法A时如何测试异常? 使用方法A时,可以在测试套件中将多个测试类分组,如下所示:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
但这不能与方法B一起使用(因为每个测试类都应该将TestCase子类化)。 对方法B进行分组测试的正确方法是什么?
编辑:我已经将JUnit版本添加到两种方法
区别很简单:
TestCase
是在JUnit 3中编写单元测试的方式(当然,在JUnit 4中仍支持它) @Test
注释是JUnit 4引入的方法 通常,除非需要与JUnit 3(和/或Java 5之前的Java版本)兼容,否则应选择注释路径。 新方法具有以下优点:
@Test
注释更明确,更易于在工具中支持(例如,以这种方式搜索所有测试很容易) @Before
/ @BeforeClass
和@After
/ @AfterClass
注释多个方法,以提供更大的灵活性 ExpectedException
东西上支持@Rule
注释 @Ignored
批注 @RunWith
支持替代测试@RunWith
要在JUnit 3 TestCase
测试预期的异常,您必须使文本明确。
public void testMyException() {
try {
objectUnderTest.myMethod(EVIL_ARGUMENT);
fail("myMethod did not throw an Exception!");
} catch (MyException e) {
// ok!
// check for properties of exception here, if desired
}
}
JUnit 5引入了另一个API更改,但仍使用注释。 新的@Test
批注是org.junit.jupiter.api.Test
(“旧”的JUnit 4是org.junit.Test
),但其工作原理与JUnit 4差不多。
我偏爱JUnit 4(注释方法),因为我发现它更灵活。
如果要在JUnit 4中构建测试套件,则必须创建一个将所有测试分组的类,如下所示:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({
Test1.class,
Test2.class,
Test3.class,
Test4.class
})public class TestSuite
{
/* empty class */
}
您的问题有一个未解决的部分,那就是“对方法B进行分组测试的正确方法是什么?”
官方的答案是,您用@RunWith(Suite.class)注释一个类,然后使用@ Suite.SuiteClasses注释列出这些类。 JUnit开发人员就是这样做的(手动列出套件中的每个类)。 从许多方面来看,这种方法都是一种改进,因为在套件之前和套件之后的行为添加是简单而直观的(只需将@BeforeClass和@AfterClass方法添加到以@RunWith注释的类中,比旧的TestFixture更好) )。
但是,它的确向后退了一步,因为注释不允许您动态创建类列表,并且解决该问题会变得有些难看。 您必须对Suite类进行子类化,并在子类中动态创建类的数组,然后将其传递给Suite构造函数,但这是一个不完整的解决方案,因为Suite的其他子类(例如Categories)无法使用,并且实质上不支持动态Test类集合。
您应该使用JUnit4。更好。
许多框架已开始弃用JUnit 3.8支持。
这来自Spring 3.0参考文档:
[警告]不推荐使用旧版JUnit 3.8类层次结构
通常,启动新内容时,应始终尝试使用最新稳定的框架版本。
“首选”方法是使用从Junit 4开始引入的注释。它们使很多事情变得容易(请参阅第二个问题)
您可以为此使用一个简单的try / catch块:
public void testForException() {
try {
Integer.parseInt("just a string");
fail("Exception should have been thrown");
} catch (final Exception e) {
// expected
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.