8

我有一个返回 0 到 10 之间的随机数的方法。

public int roll(){
    int pinsKnockedDown = (int) (Math.random() * 10);
    return pinsKnockedDown;
}

我将如何为此编写 JUnit 测试?到目前为止,我已将调用置于循环中,因此它运行 1000 次并且如果 - 数字小于 0 - 数字大于 10,则测试失败

我如何测试所有数字不一样,即

呆伯特

4

3 回答 3

3

随机性测试可能很复杂。例如,在上面你只是想确保你得到 1 到 10 之间的数字吗?您想确保均匀分布等吗?在某个阶段,我建议您要信任Math.random()并简单地确保您没有搞砸限制/范围,这本质上就是您正在做的事情。

于 2013-02-11T11:12:26.127 回答
3

我的答案已经有缺陷了,我需要返回一个 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 + ".");
    }

}
于 2013-02-11T12:28:42.073 回答
1

您想测试您的代码,而不是 Java 提供的 Math.random() 的质量。假设 Java 方法是好的。所有测试都是正确性的必要条件,但不是充分条件。因此,选择一些测试来发现使用 Java 提供的方法时可能出现的编程错误。

您可能会测试以下内容:最终,在连续调用之后,该函数将每个数字至少返回一次,而不会返回任何超出所需范围的数字。

于 2015-12-10T12:21:15.303 回答