Rab*_*ski 149 java junit automated-tests
我发现JUnit的正确使用(或至少是文档)非常令人困惑.这个问题既可作为未来参考,也可作为真正的问题.
如果我理解正确,有两种主要的方法来创建和运行JUnit测试:
方法A(JUnit 3-style):创建一个扩展TestCase的类,并用该单词启动测试方法test.当作为JUnit Test(在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);
}
}
Run Code Online (Sandbox Code Playgroud)
方法B(JUnit 4-style):创建一个"普通"类并@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);
}
}
Run Code Online (Sandbox Code Playgroud)
混合两者似乎不是一个好主意,请参阅例如这个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版本
Joa*_*uer 115
区别很简单:
TestCase是单元测试在JUnit 3中编写的方式(当然它仍然在JUnit 4中得到支持)@Test注释是JUnit 4引入的方式通常,您应该选择注释路径,除非需要与JUnit 3(和/或Java 5之前的Java版本)兼容.新方法有几个优点:
@Testannotaton更明确,更容易的工具来支持(例如可以很容易地搜索所有测试这种方式)@Before/ @BeforeClass和@After/ @AfterClass提供更多灵活性来注释多个方法@Rule注释ExpectedException@Ignored注释@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
}
}
Run Code Online (Sandbox Code Playgroud)
小智 24
我更喜欢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 */
}
Run Code Online (Sandbox Code Playgroud)
Yis*_*hai 15
您的问题还有一个未解答的部分,那就是"对方法B进行分组测试的正确方法是什么?"
官方答案是您使用@RunWith(Suite.class)注释类,然后使用@ Suite.SuiteClasses批注列出类.这就是JUnit开发人员如何做到这一点(手动列出套件中的每个类).在许多方面,这种方法是一种改进,因为在套件和套件后行为之前添加它是微不足道和直观的(只需将@BeforeClass和@AfterClass方法添加到使用@RunWith注释的类中 - 比旧的TestFixture更好).
但是,它确实有一个倒退,因为注释不允许您动态创建类列表,并且解决该问题会变得有点难看.您必须继承Suite类并在子类中动态创建类数组并将其传递给Suite构造函数,但这是一个不完整的解决方案,因为Suite的其他子类(如Categories)不能与它一起使用不支持动态Test类集合.
你应该使用 JUnit 4。它更好。
许多框架已开始弃用 JUnit 3.8 支持。
这是来自 Spring 3.0 参考文档:
[警告] 旧版 JUnit 3.8 类层次结构已弃用
一般来说,当您开始新事物时,您应该始终尝试使用框架的最新稳定版本。