我发现JUnit的正确用法(或者至少是文档)非常令人困惑。这个问题既可以作为未来的参考,也可以作为一个真正的问题。
如果我没理解错的话,有两种主要的方法来创建和运行JUnit测试:
方法A (JUnit 3风格):创建一个扩展TestCase的类,并使用单词test
开始测试方法。当将类作为Eclipse运行时(在JUnit中),所有以单词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样式):创建一个“normal”类,并在方法前面添加一个@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);
}
}
将两者混合在一起似乎不是一个好主意,参见例如this stackoverflow question:
现在,我的问题是:
@Test(expected = ArithmeticException.class)
中那样扩展@ testing来测试异常。但如何测试异常使用方法A时,您可以在测试套件中对许多测试类进行分组,如下所示:TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
但这不能与方法B一起使用(因为每个测试类都应该是TestCase的子类)。对方法B的测试进行分组的正确方法是什么?
编辑:我已经将JUnit版本添加到这两种方法中
发布于 2010-04-14 16:38:32
区别相当简单:
TestCase
是JUnit 3中编写单元测试的方式(当然在JUnit 4中仍然支持)@Test
注解是JUnit 4引入的方式
通常,您应该选择注释路径,除非需要与Java3(和/或Java5之前的JUnit版本)兼容。这种新方法有几个优点:
对于way)
@Test
annotation更加明确,并且更容易在工具中得到支持(例如,搜索所有测试都很容易。此flexibility@BeforeClass
/@BeforeClass
和@After
/@AfterClass
进行注释,从而为使用@RunWith
的其他测试运行者提供更多的@Ignored
for @Ignored
要在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注解非常相似。
发布于 2010-04-14 16:21:46
我更喜欢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 */
}
发布于 2010-04-14 21:47:43
您的问题还有一个未回答的部分,那就是“对方法B进行分组测试的正确方法是什么?”
官方的答案是使用@RunWith(Suite.class)注释一个类,然后使用@Suite.SuiteClasses注释列出这些类。JUnit开发人员就是这样做的(手动列出套件中的每个类)。在许多方面,这种方法都是一种改进,因为在套件之前和套件之后添加行为是简单而直观的(只需将@BeforeClass和@AfterClass方法添加到用@RunWith注释的类中-比旧的TestFixture好得多)。
然而,它确实有一个倒退的步骤,因为注释不允许您动态创建类的列表,并且解决这个问题变得有点丑陋。您必须创建Suite类的子类,并在子类中动态创建类的数组并将其传递给Suite构造函数,但这是一个不完整的解决方案,因为Suite的其他子类(如Categories)不能使用它,并且本质上不支持动态测试类集合。
https://stackoverflow.com/questions/2635839
复制相似问题