首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >测试混淆:使用‘扩展TestCase’还是‘@ JUnit’?

测试混淆:使用‘扩展TestCase’还是‘@ JUnit’?
EN

Stack Overflow用户
提问于 2010-04-14 16:16:28
回答 5查看 79.2K关注 0票数 171

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

如果我没理解错的话,有两种主要的方法来创建和运行JUnit测试:

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

代码语言:javascript
复制
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开头该方法。

代码语言:javascript
复制
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

现在,我的问题是:

  1. What是首选的测试方法,或者什么时候使用other?
  2. Approach来代替B允许通过像@Test(expected = ArithmeticException.class)中那样扩展@ testing来测试异常。但如何测试异常使用方法A时,您可以在测试套件中对许多测试类进行分组,如下所示:

TestSuite suite = new TestSuite("All tests");

suite.addTestSuite(DummyTestA.class);

suite.addTestSuite(DummyTestAbis.class);

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-14 16:38:32

区别相当简单:

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

引入的方式

通常,您应该选择注释路径,除非需要与Java3(和/或Java5之前的JUnit版本)兼容。这种新方法有几个优点:

对于way)

  • Multiple,flexibility

的其他测试运行者提供更多的@Ignored for @Ignored

要在JUnit 3 TestCase中测试预期的异常,必须使文本显式显示。

代码语言:javascript
复制
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注解非常相似。

票数 130
EN

Stack Overflow用户

发布于 2010-04-14 16:21:46

我更喜欢JUnit 4(注释方法),因为我发现它更灵活。

如果您想在JUnit 4中构建测试套件,则必须创建一个将所有测试分组的类,如下所示:

代码语言:javascript
复制
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 */
}
票数 25
EN

Stack Overflow用户

发布于 2010-04-14 21:47:43

您的问题还有一个未回答的部分,那就是“对方法B进行分组测试的正确方法是什么?”

官方的答案是使用@RunWith(Suite.class)注释一个类,然后使用@Suite.SuiteClasses注释列出这些类。JUnit开发人员就是这样做的(手动列出套件中的每个类)。在许多方面,这种方法都是一种改进,因为在套件之前和套件之后添加行为是简单而直观的(只需将@BeforeClass和@AfterClass方法添加到用@RunWith注释的类中-比旧的TestFixture好得多)。

然而,它确实有一个倒退的步骤,因为注释不允许您动态创建类的列表,并且解决这个问题变得有点丑陋。您必须创建Suite类的子类,并在子类中动态创建类的数组并将其传递给Suite构造函数,但这是一个不完整的解决方案,因为Suite的其他子类(如Categories)不能使用它,并且本质上不支持动态测试类集合。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2635839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档