【发布时间】:2017-02-28 15:21:33
【问题描述】:
如何以系统的方式使用随机输入测试方法?我的意思是,如果被测试单元的输入数据每次运行都发生变化,那么如何有效地找出导致失败的值并在代码更改后重新测试这些相同的值?例如函数int[] foo(int[] data),它可以检查返回值是否正确,在为“硬编码输入”(例如{1,2,3})编写测试用例之后如何测试随机输入?如果每次都是随机的,任何错误都不会重现。我可以将随机输入打印到屏幕上,但这对于每个功能都会变得混乱。有什么建议?
另外,如果整个程序都在测试,它仍然是单元测试吗?例如在一个@Test中调用构造函数和类的所有方法?这个类只有一个开始的公共方法,所以这无法避免,但我想知道 JUnit 是否是它的最佳工具。
【问题讨论】:
-
当输入是随机的,你怎么知道预期的结果是什么?
-
@TimothyTruckle 在某些情况下可以检查,例如很容易检查返回的值是否已排序。
-
这是一场我工作的辩论,我们当然不同意。在某些情况下,随机测试是您能做的最好的事情,并且在某些人中他们受到高度尊重。为了测试中值算法,我编写了一个对输入进行混洗的测试,但由于我知道元素是什么,我也可以独立于它们的顺序来判断正确的中值。显然,这个测试并不是孤立的,但理论上它可能有一天会发现一个尚未被破坏的错误。
-
为了可复制性,将随机种子打印到屏幕上。
-
当我们对某个行为进行单元测试时,当测试失败时,我们可以清楚地了解原因。使用随机输入,您无法(轻松)重现错误情况。
标签: java testing junit language-agnostic