有没有类似NUnit的testcase属性的JUnit等效物?

26

我在谷歌上搜索了 JUnit 测试案例,但搜索结果看起来要更加复杂才能实现——需要创建一个继承测试案例的新类,然后再调用它:

public class MathTest extends TestCase {
    protected double fValue1;
    protected double fValue2;

    protected void setUp() {
       fValue1= 2.0;
       fValue2= 3.0;
    }
 }

public void testAdd() {
   double result= fValue1 + fValue2;
   assertTrue(result == 5.0);
}

但是我想要的是像 NUnit 测试用例一样非常简单的东西

[TestCase(1,2)]
[TestCase(3,4)]
public void testAdd(int fValue1, int fValue2)
{
    double result= fValue1 + fValue2;
    assertIsTrue(result == 5.0);
}

在JUnit中有没有办法做到这一点?


2
JUnit有两种风格:版本3,您在示例中使用的版本,以及使用注释的版本4。您真的想了解版本3吗? - Raedwald
啊..不...我想了解4.5的情况... - Steph
1
我认为我可能正在寻找的是参数化测试。但即使如此,它看起来有点冗长和有点随机... http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/ - Steph
2
好像每个类只能有一个参数化测试。是不是很烦? - Steph
2
NUnit源自JUnit,现在比JUnit更加先进。TestCase只是使NUnit易于使用的示例之一。 - Kenneth Xu
显示剩余3条评论
6个回答

13

2017年更新: JUnit 5将通过junit-jupiter-params扩展程序包括参数化测试。以下是文档中的一些示例:

基本类型的单个参数(@ValueSource):

@ParameterizedTest
@ValueSource(strings = { "Hello", "World" })
void testWithStringParameter(String argument) {
    assertNotNull(argument);
}

逗号分隔的值(@CsvSource)允许指定多个参数,类似于下面的 JUnitParams:

@ParameterizedTest
@CsvSource({ "foo, 1", "bar, 2", "'baz, qux', 3" })
void testWithCsvSource(String first, int second) {
    assertNotNull(first);
    assertNotEquals(0, second);
}

其他的数据源注解包括@EnumSource@MethodSource@ArgumentsSource@CsvFileSource,详见文档


翻译内容:

JUnitParams (https://github.com/Pragmatists/JUnitParams) 似乎是一个不错的选择。它允许您将测试参数指定为字符串,例如:

@RunWith(JUnitParamsRunner.class)
public class MyTestSuite {
    @Test
    @Parameters({"1,2", "3,4"})
    public testAdd(int fValue1, int fValue2) {
       ...
    }
}

您还可以通过单独的方法、类或文件指定参数,请查阅JUnitParamsRunner api文档了解详情。


11

显然,正确答案是“不,没有相等的东西。”这很令人遗憾。

JUnit参数化测试和理论(如此处所述以及JUnit-如何使用不同的值测试方法?),两者都可以完成任务,但远不及原生支持的那么简洁。它们很难编写,也难以阅读。

我希望JUnit有一天能添加一个更容易,NUnit样式的语法。似乎这不应该很困难,但可能需要使用lambdas。


Lambda表达式可能不像适当的泛型那样必要,但这只是一个猜测。注释/属性根本不依赖于匿名函数。 - Joey

6

这看起来是最接近要求的答案。 - David G

5

使用zohhak可以带参数使用junit。

使用示例:

@RunWith(ZohhakRunner.class)
public class HelloWorldTest {

    @TestWith({
        "2, 1,   3",
        "3, 5,   8"
    })
    public void should_add_numbers(int addend1, int addend2, int result) {

        assertThat(addend1 + addend2).isEqualTo(result);
    }
}

这比JUnit 5的新@ValueSource功能更好。 - urig

2

这可能有点儿蠢,但这是我最终的解决方法。使用四行代替一行。

@Test
public void testAdd1() {
    testAdd(1,2);
}
@Test
public void testAdd2() {
    testAdd(3,4);
}
private void testAdd(int fValue1, int fValue2)
{
    double result= fValue1 + fValue2;
    assertIsTrue(result == 5.0);
}

我喜欢你的解决方法。今天我们应该使用[@ParameterizedTest](https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests)注释。 - rupweb

0
我已经使用一个持有类来保存我的测试用例,就像这样:


class FlexiTest {
String var1;
String var2;
double var3;
String var4;
MyObject var5;
double expected;

public FlexiTest(String var1, String var2, double var3, String var4, MyObject var5, double expected) {
    super();
    this.var1;
    this.var2;
    this.var3;
    this.var4;
    this.var5;
    this.expected = expected;
}

然后像这样设置我的测试类对象的stream

static Stream<FlexiTest> provider(){

    FlexiTest ft1 = new FlexiTest("1", "2", 3, "4", MyObject.A, 1.1);
    FlexiTest ft2 = new FlexiTest("10", "20", 30, "40", MyObject.B, 11);
    FlexiTest ft3 = new FlexiTest("100", "200", 300, "400", MyObject.C, 110);
    
    return Stream.of(ft1, ft2, ft3);
}

然后使用@ParameterizedTest和@MethodSource注释测试方法,并使用对象流方法名称。还要进行null和empty检查:

@ParameterizedTest
@MethodSource("provider")   
@NullSource
@EmptySource
public void ClientTest(FlexiTest ft)
{
... my test code ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接