如何在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 楼答案
对于学习单元测试来说,这门课可能有点太复杂了。我们也可以在这里触及表面,因为这不是你可以从几个例子中学到的东西。我劝你买一本关于这个话题的书
既然我们已经到了,让我们看看你们的课
类的公共接口由构造函数
nextNum()
和两个getter组成(只返回字段的方法称为getter,因为它们通常被命名为getFieldName()
,例如getRandomNums()
)getter不包含任何逻辑。因此,我将避免测试它们
你的构造函数实际上做了很多事情。首先,它检查数组是否有效(长度相同,概率加起来为1),然后存储数组并使用累积概率构建一个新数组。为了测试它,每个测试用例将创建一个新的
RandomGen
实例,该实例具有构成不同情况的不同数组。显而易见的三种情况是:前两种情况是错误情况,预计会引发异常,最后一种情况是“阳光情况”,您可以在其中检查两个数组现在是否由getter返回。累积概率(
total_prob
)只能通过使用nextNum()
来观察然后是)。在你的情况下,我会跳过这一步,先读一本书,获得一些单元测试的经验
nextNum()
方法。这已经有点高级了,因为您无法预测Math.random()
的结果。可能的解决方案是使用预定义的种子(如Victor Polo De Gyves Montero所建议的),或者包装并注入^{