我有一个返回 0 到 10 之间的随机数的方法。
public int roll(){
int pinsKnockedDown = (int) (Math.random() * 10);
return pinsKnockedDown;
}
我将如何为此编写 JUnit 测试?到目前为止,我已将调用置于循环中,因此它运行 1000 次并且如果 - 数字小于 0 - 数字大于 10,则测试失败
我如何测试所有数字不一样,即
随机性测试可能很复杂。例如,在上面你只是想确保你得到 1 到 10 之间的数字吗?您想确保均匀分布等吗?在某个阶段,我建议您要信任Math.random()
并简单地确保您没有搞砸限制/范围,这本质上就是您正在做的事情。
我的答案已经有缺陷了,我需要返回一个 0-10 的数字,但我原来的帖子只返回了 0-9 的范围!这是我发现的方法...
循环 100k 次并确保范围正确,它应该是 0-10(尽管我已将 10 设置为变量,以便可以重用代码)。
我还存储了循环期间发现的最高和最低值,它们应该位于刻度的最末端。
如果最高值和最低值相同,则表明有人伪造了随机数返回。
我看到的唯一问题是该测试可能会出现假阴性,但这不太可能。
@Test
public void checkPinsKnockedDownIsWithinRange() {
int pins;
int lowestPin = 10000;
int highestPin = -10000;
for (int i = 0; i < 100000; i++) {
pins = tester.roll();
if (pins > tester.NUMBER_OF_PINS) {
fail("More than 10 pins were knocked down");
}
if (pins < 0) {
fail("Incorrect value of pins");
}
if (highestPin < pins) {
highestPin = pins;
}
if (lowestPin > pins) {
lowestPin = pins;
}
}
if (lowestPin == highestPin) {
fail("The highest pin count is the same as the lowest pin count. Check the method is returning a random number, and re-run the test.");
}
if (lowestPin != 0) {
fail("The lowest pin is " + lowestPin + " and it should be zero.");
}
if (highestPin != tester.NUMBER_OF_PINS) {
fail("The highest pin is " + highestPin + " and it should be " + tester.NUMBER_OF_PINS + ".");
}
}
您想测试您的代码,而不是 Java 提供的 Math.random() 的质量。假设 Java 方法是好的。所有测试都是正确性的必要条件,但不是充分条件。因此,选择一些测试来发现使用 Java 提供的方法时可能出现的编程错误。
您可能会测试以下内容:最终,在连续调用之后,该函数将每个数字至少返回一次,而不会返回任何超出所需范围的数字。