JUnit混淆:使用“扩展测试用例”或“@Test”?

2022-08-31 06:49:12

我发现JUnit的正确使用(或至少是文档)非常令人困惑。这个问题既是未来的参考,也是一个真正的问题。

如果我理解正确,有两种主要方法可以创建和运行JUnit测试:

方法 A(JUnit 3 样式):创建一个扩展 TestCase 的类,并以单词 开始测试方法。当该类作为 JUnit 测试运行时(在 Eclipse 中),所有以单词开头的方法都将自动运行。testtest

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 样式):创建一个“普通”类,并在方法前面附加一个注释。请注意,您不必以单词 开始该方法。@Testtest

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);
    }
}

将两者混合在一起似乎不是一个好主意,例如,请参阅此堆栈溢出问题

现在,我的问题:

  1. 首选方法是什么,或者您何时使用一种方法而不是另一种方法?
  2. 方法 B 允许通过扩展@Test注释来测试异常,如 中所示。但是,在使用方法 A 时,如何测试异常呢?@Test(expected = ArithmeticException.class)
  3. 使用方法 A 时,可以在测试套件中对多个测试类进行分组,如下所示:

    TestSuite suite = new TestSuite("All tests");
    suite.addTestSuite(DummyTestA.class);
    suite.addTestSuite(DummyTestAbis.class);

    但这不能与方法B一起使用(因为每个测试类都应该子类TestCase)。对方法 B 的测试进行分组的正确方法是什么?

编辑:我已经将JUnit版本添加到这两种方法中


答案 1

区别相当容易:

  • 扩展是用 JUnit 3 编写单元测试的方式(当然,JUnit 4 中仍然支持它)TestCase
  • 使用注释是JUnit 4引入的方式@Test

通常,您应该选择注释路径,除非需要与 JUnit 3(和/或早于 Java 5 的 Java 版本)兼容。新方法有几个优点:

要测试 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更改,但仍然使用注释。新的注释是org.junit.jupiter.api.Test(“旧”JUnit 4是),但它的工作原理与JUnit 4几乎相同。@Testorg.junit.Test


答案 2

我更喜欢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 */
}

推荐