对这个小方法进行哪些测试?

时间:2010-12-03 20:01:12

标签: c# unit-testing testing

我目前有以下方法:

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);

基本上只测试一种情况。回归 - 测试我会说我想不出一种弄乱代码的方法,把它变成功能错误的代码并且仍然有测试通过,也就是说,我觉得这个方法看起来很合理。

您对此有何看法?你会怎么处理这个小方法?

由于

7 个答案:

答案 0 :(得分:2)

如果代码覆盖率适用于您的测试框架,我会使用您使用的任何测试工具检查代码覆盖率。

我个人喜欢使用Microsoft Testing ToolNUnit 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 
                         ); 

你的测试不会通过吗?