我有一个方法,它返回0到10之间的随机数。
public int roll(){
int pinsKnockedDown = (int) (Math.random() * 10);
return pinsKnockedDown;
}
我如何为此编写JUnit测试?到目前为止,我已将调用置于循环中,因此它运行1000次并且如果失败则进行测试 - 数字小于0 - 数量超过10
我如何测试所有数字都不一样,即
答案 0 :(得分:2)
Randomness tests可能很复杂。例如在上面你只是想确保你得到1到10之间的数字?您想确保均匀分布等吗?在某个阶段,我建议您要信任Math.random()
,并确保您没有搞砸限制/范围,这实际上就是您正在做的事情。
答案 1 :(得分:2)
我的答案已经存在缺陷,我需要从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 + ".");
}
}
答案 2 :(得分:1)
您希望测试您的代码,而不是Java提供的Math.random()的质量。假设Java方法很好。所有测试都是必要的,但不是正确性的充分条件。因此,选择一些测试可以发现使用Java提供的方法时可能出现的编程错误。
您可以测试以下内容:最后,在一系列调用之后,该函数至少返回一次数字,而不返回任何超出所需范围的数字。