在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))
....
但是......我希望有更好的方法。
答案 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)
答案 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#)。这样我就知道哪个案例失败了,如果是的话。它还有更多的工作要做,但我认为最终还是能够带来好处。