测试Java方法输出的“正确”方法是什么?

时间:2009-03-19 16:45:20

标签: java unit-testing testing junit

在Python中,我经常会看到类似这样的测试:

tests = [
    (2, 4),
    (3, 9),
    (10, 100),
]
for (input, expected_output) in tests:
    assert f(input) == expected_output

使用JUnit在Java中编写像这样的测试(其中指定了一组测试用例,然后循环运行每个测试用例)的“正确”方法是什么?

谢谢!

抢先回应:我意识到我可以做类似的事情:

assertEquals(4, f(2))
assertEquals(9, f(3))
....

但是......我希望有更好的方法。

7 个答案:

答案 0 :(得分:11)

同样的事情。

    int[][] tests = {
            {2, 4},
            {3, 9},
            {10, 100}
    };
    for (int[] test : tests) {
        assertEquals(test[1], f(test[0]));
    }

当然不如python那么漂亮,但很少有东西。

您可能还想查看JUnit Theories,这是未来的功能......

答案 1 :(得分:5)

正确的方法是编写单独的断言语句,即使您不喜欢它。

它避免了不必要的复杂化,当它失败时,有时更容易看到哪个值失败(无需启动调试器)。

但是,如果您自动生成测试数据,则会有不同的故事。

答案 2 :(得分:3)

查看Junit中的参数化测试运行器。

http://junit.org/apidocs/org/junit/runners/Parameterized.html

看起来它会完全符合您的要求。

答案 3 :(得分:1)

嗯...

int[][] tests = new int[][]{
        {2, 4},
        {3, 9},
        {10, 100},
    };

for(int[] i : tests)
{
    assertEquals(i[1], f(i[0]);
}

同样的,真的。唯一的问题是Java缺少元组文字,所以对于更复杂的情况,你必须使用Object []数组并强制转换或编写一个Tuple类。

答案 4 :(得分:0)

难道您不是只定义一个包含两个字段的简单类,实际结果和预期结果,然后以与Python代码段相似的方式循环遍历集合吗?

答案 5 :(得分:0)

Java中没有元组,但您可以使用Map或两个并行数组来指定输入/输出对,然后像Python示例那样执行循环。

答案 6 :(得分:0)

绝对不是单元测试方面的专家,但我更喜欢为我测试的每个案例都有一个单独的方法,并使用一些测试运行工具(如N# - 用于C#)。这样我就知道哪个案例失败了,如果是的话。它还有更多的工作要做,但我认为最终还是能够带来好处。