有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中创建单元测试?

我有一个java类,它接受一个数字数组和一个相应概率数组,并充当一个随机数生成器,根据另一个数组中定义的相应概率从数组中返回一个数字。如何编写一组最小但有效的单元测试

class RandomGen {

    private int[] randomNums;
    private float[] probabilities;
    private float[] total_prob;

    RandomGen(int[] randomNums, float[] probabilites) throws Exception {
        if (this.set_arrays(randomNums, probabilites));
        else {
            throw new Exception("Invalid array format");
        }
    }

    private boolean set_arrays(int[] randomNums, float[] probabilities) {
        if (check_arrays(randomNums, probabilities)) {
            this.randomNums = randomNums;
            this.probabilities = probabilities;
            this.total_prob = new float[this.probabilities.length];

            total_prob[0] = probabilities[0];
            for (int i = 1; i < probabilities.length; i++){
                total_prob[i] = total_prob[i-1] + probabilities[i];
            }
            return true;
        }
        return false;
    }

    public int[] return_randomNums() {
        return this.randomNums;
    }

    public float[] return_probabilites() {
        return this.probabilities;
    }

    private boolean check_arrays(int[] randomNums, float[] probabilities) {
        float total_prob = 0;
        for (int i = 0; i < probabilities.length; i++) {
            if (probabilities[i] < 0) return false;
            total_prob += probabilities[i];
        }
        if (randomNums.length != probabilities.length || total_prob != 1) return false;
        return true;
    }

    public int nextNum() {
        float random = (float) Math.random();
        if (random <= total_prob[0]) {
            return randomNums[0];
        }
        for (int i=1; i < total_prob.length; i++) {
            if (total_prob[i-1] < random  && random <= total_prob[i]) return randomNums[i];
        }
        return 0;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    对于学习单元测试来说,这门课可能有点太复杂了。我们也可以在这里触及表面,因为这不是你可以从几个例子中学到的东西。我劝你买一本关于这个话题的书

    既然我们已经到了,让我们看看你们的课

    类的公共接口由构造函数nextNum()和两个getter组成(只返回字段的方法称为getter,因为它们通常被命名为getFieldName(),例如getRandomNums()

    getter不包含任何逻辑。因此,我将避免测试它们

    你的构造函数实际上做了很多事情。首先,它检查数组是否有效(长度相同,概率加起来为1),然后存储数组并使用累积概率构建一个新数组。为了测试它,每个测试用例将创建一个新的RandomGen实例,该实例具有构成不同情况的不同数组。显而易见的三种情况是:

    • 概率之和为1,但两个数组的长度不同
    • 这两个数组的长度相同,但概率数组元素的总和不等于1
    • 这两个数组的长度相同,概率加起来等于一

    前两种情况是错误情况,预计会引发异常,最后一种情况是“阳光情况”,您可以在其中检查两个数组现在是否由getter返回。累积概率(total_prob)只能通过使用nextNum()来观察

    然后是nextNum()方法。这已经有点高级了,因为您无法预测Math.random()的结果。可能的解决方案是使用预定义的种子(如Victor Polo De Gyves Montero所建议的),或者包装并注入^{)。在你的情况下,我会跳过这一步,先读一本书,获得一些单元测试的经验