我目前有以下方法:
public void SetNewRandomValue() {
double newValue = numberGenerator.GenerateDouble(
genesValuesInterval.MinimumValue,
genesValuesInterval.MaximumValue
);
this.value = newValue;
}
决定对此方法进行多少次测试(和哪些测试)的准则应该是什么?我目前已完成以下任务(仅在实施该方法后 - 即不是测试优先):
var interval = new Interval(-10, 10);
var numberGeneratorMock = new Mock<INumberGenerator>(MockBehavior.Strict);
var numberGenerator = numberGeneratorMock.Object;
double expectedValue = 5.0;
numberGeneratorMock.Setup(ng =>
ng.GenerateDouble(interval.MinimumValue, interval.MaximumValue))
.Returns(expectedValue);
var gene = new Gene(numberGenerator, 0, new Interval(-10, 10));
gene.SetNewRandomValue();
Assert.AreEqual<double>(expectedValue, gene.Value);
基本上只测试一种情况。回归 - 测试我会说我想不出一种弄乱代码的方法,把它变成功能错误的代码并且仍然有测试通过,也就是说,我觉得这个方法看起来很合理。
您对此有何看法?你会怎么处理这个小方法?
由于
答案 0 :(得分:2)
如果代码覆盖率适用于您的测试框架,我会使用您使用的任何测试工具检查代码覆盖率。
我个人喜欢使用Microsoft Testing Tool
或NUnit Testing Framework
。然后我可以右键单击我的测试项目和Test with NCover
(使用NUnit时),它将运行测试并告诉我每个对象和测试所涵盖的代码百分比。
我说当你完成检查至少98%代码覆盖率的代码覆盖率时,你的代码很可能会得到很好的测试。
答案 1 :(得分:1)
我建议你看看Pex - 它确实可以帮助你生成所需的单元测试(即根据方法和返回值找出不同的潜在路径和结果)。
答案 2 :(得分:1)
那个测试看起来不错。您唯一可以断言SetNewRandomValue
的是Value
成员之后被分配。您已经模拟了对GenerateDouble
的来电,并确认Value
包含预期的数字,因此您应该做得很好。
答案 3 :(得分:1)
你绝对可以为不进行单元测试提供理由。恕我直言,代码检查是一种完全有效的测试方法。你通常不测试属性设置器/ getter这样的东西,我认为这个方法很简单,可以避免单元测试,原因相同。
那就是说,如果你真的想测试一下,这就是我要做的事情:我用几个值测试它,而不是用5测试一次。(SetNewRandomValue可以实现为this.value = 5;
,这不应该通过。)我用一个非整数来测试它,以确认那里没有一个奇怪的球被转换成整数。
您可以使用适当的参数测试它是否正在调用GenerateDouble,尽管这确实在测试实现细节。 (SetNewRandomValue可以实现为numberGenerator.GenerateDouble(0, interval.max - interval.min) + interval.min;
,这不应该使测试失败。)您可以使用真正的随机数生成器,并执行SetNewRandomValue几千次,并测试值是否均匀分布在您的预期中范围。
答案 4 :(得分:1)
当Gene.SetNewRandomValue
返回超出指定间隔的值时,您还可以编写测试来记录(并验证)NumberGenerator.GenerateDouble
的预期行为。
答案 5 :(得分:1)
该方法做了三件事:
使用numberGenerator.GenerateDouble
作为第一个参数调用genesValuesInterval.MinimumValue
,
并以genesValuesInterval.MaximumValue
作为第二个参数,
并将this.value
设置为该通话的结果。
您的测试测试了第三项,但不测试前两项。您可以编写另外两个测试,检查使用正确的第一个和第二个参数调用mock。
编辑(回复以下评论):
如果此方法的预期行为是将this.value
设置为先前指定范围内的随机双精度,则上述三个测试很有用(假设genesValuesInterval
min和max是先前指定的范围,并且您进行测试以断言numberGenerator.GenerateDouble(min,max)返回指定范围内的double。
如果此方法的预期行为只是将this.value
设置为(Double.MinValue,Double.MaxValue)中的随机双精度,则前两个测试是不必要的,因为这只是一个实现细节。 / p>
如果是
答案 6 :(得分:0)
要回答如何测试它,您应该能够描述所需的行为。
查看你的代码,我假设“Gene.SetNewRandomValue”应该将self.Value
设置为一个落在传递给构造函数的Interval内的数字。
我对Mock
课程并不是非常熟悉,所以我可能会离开基础,但看起来你没有测试它。如果您的实施有这个错误怎么办?
double newValue = numberGenerator.GenerateDouble(
genesValuesInterval.MinimumValue,
genesValuesInterval.MinimumValue
);
你的测试不会通过吗?