所以我有一个我想要测试的这个长期的方法。我可能会打破其他一些4-5方法,但我不想公开这些方法(虽然我可能,但如果可能的话,我想远离它们。进入包保护/内部):
如果我的数学没有错误,要测试它,我需要8次测试。用较小的方法划分它不会让我不得不进行更少的单元测试,是吗? 除了可见性问题之外,我在创建更小的方法(用于测试)时看到的一个大问题是需要向这些小方法传递大量参数。
虽然最初编写此代码的是我,但我仍然觉得很难理解。 所以我的问题是......如何测试这个?!?你会怎么做?我应该以任何方式对其进行重组吗?
public Genoma GenerateOffspring(Genoma genoma1, Genoma genoma2) {
if (genoma1.NumberOfGenes != genoma2.NumberOfGenes) throw new ArgumentException("Both individuals must have the same size!");
if (genoma1.NumberOfGenes == 0 || genoma2.NumberOfGenes == 0) throw new ArgumentException("0-sized genomas not allowed!");
if (genoma1.NumberOfGenes == 1) {
if (numberGenerator.GenerateInteger(0, 2) == 0) {
return genoma1;
} else {
return genoma2;
}
}
int cutPoint = numberGenerator.GenerateInteger(1, genoma1.NumberOfGenes);
Genoma parent1;
Genoma parent2;
if (numberGenerator.GenerateBool()) {
parent1 = genoma1;
parent2 = genoma2;
} else {
parent1 = genoma2;
parent2 = genoma1;
}
Genoma offspring = parent1.Clone();
if (numberGenerator.GenerateBool()) {
for (int i = 0; i < cutPoint; ++i) {
offspring.SetGeneAt(i, parent2.GetGeneAt(i));
}
} else {
for (int i = cutPoint; i < offspring.NumberOfGenes; ++i) {
offspring.SetGeneAt(i, parent2.GetGeneAt(i));
}
}
return offspring;
}
由于
答案 0 :(得分:1)
我说这个没有简单的方法。您似乎随机生成了一些值然后决定如何设置实例变量,因此像真值表这样的东西基本上可以帮助您,以便检查您正在设置的变量的所有可能值。另外,我会在顶部测试if语句,以确保在继续执行其余操作之前满足这些条件。现在有办法轻松测试,只是彻底。
答案 1 :(得分:1)
要记住的主要事情是,当你开始测试时,你将运行所有测试,但对于给定的测试,如果它在某个时刻失败了一个断言,它将停止,这意味着它之后的内容将不会进行测试,因为它被认为需要已经没有正确断言的内容。
将它分成更小的方法的好处是你最终会得到更多可以独立测试的东西,但是你提到的论据的增加表明它不是一个“自然”的事情,所以你应该把它全部保存在同一个测试中,因为按照你的说法,你将整个函数视为一个单元本身,因此,一个单元测试应该测试该单元。
另外,我认为参数的增加也会使你的代码变得不那么漂亮,效率也会降低。
我希望有所帮助。
答案 2 :(得分:1)
略过代码,至少应测试以下条件
您的测试工作可以通过模拟numberGenerator对象并使其返回固定值而大大受益。
这将为您提供以下附加条件进行测试
使用给定的intputs测试所有可能的组合调用432个测试用程序 (6.6.6.2)
使用pairwise testgeneration工具可将此功能减少到39个测试用例。
当你的所有测试都通过时,你应该运行一个覆盖率分析器来验证你没有错过编码路径。每条路径至少应该执行一次。
PICT模型
genoma1_NumberOfGenes: -1, 0, 1, HighboundMinOne, HighBound, HighBoundPlusOne
genoma2_NumberOfGenes: -1, 0, 1, HighboundMinOne, HighBound, HighBoundPlusOne
numberGenerator.GenerateInteger: LowBoundMinOne, LowBound, LowBoundPlusOne, HighBoundMinOne, HighBound, HighBoundPlusOne
numberGenerator.GenerateBool: True, False
PICT生成的测试用例参数
genoma1_NumberOfGenes genoma2_NumberOfGenes numberGenerator.GenerateInteger numberGenerator.GenerateBool
HighBoundPlusOne -1 HighBoundPlusOne True
HighBound 1 HighBoundPlusOne False
-1 HighBoundPlusOne HighBound True
HighBoundPlusOne 0 LowBound False
0 HighBoundPlusOne HighBoundPlusOne False
0 1 HighBoundMinOne True
-1 0 HighBoundMinOne False
HighBound 0 LowBoundPlusOne True
1 HighboundMinOne LowBound True
HighboundMinOne HighBound LowBoundMinOne False
-1 HighBound HighBoundPlusOne True
1 0 HighBound False
HighBoundPlusOne HighboundMinOne HighBoundMinOne False
HighboundMinOne HighboundMinOne LowBoundMinOne True
HighBound -1 LowBoundMinOne False
HighBoundPlusOne 1 LowBoundMinOne True
HighBoundPlusOne HighBound LowBoundPlusOne False
1 -1 HighBoundMinOne True
HighBound HighBound HighBoundMinOne False
1 HighboundMinOne HighBoundPlusOne True
HighBound HighboundMinOne HighBound False
1 1 LowBoundPlusOne False
HighBoundPlusOne -1 HighBound True
0 0 LowBoundMinOne True
1 HighBound LowBound True
0 HighBound HighBound False
HighBound HighBoundPlusOne LowBound True
-1 -1 LowBoundMinOne True
0 HighboundMinOne LowBoundPlusOne True
HighBoundPlusOne HighBoundPlusOne LowBoundPlusOne False
HighboundMinOne 1 HighBound True
-1 1 LowBound True
HighboundMinOne -1 LowBound True
HighboundMinOne -1 LowBoundPlusOne False
-1 HighboundMinOne LowBoundPlusOne False
HighboundMinOne HighBoundPlusOne HighBoundMinOne False
HighboundMinOne 0 HighBoundPlusOne False
1 HighBoundPlusOne LowBoundMinOne False
0 -1 LowBound False