2013-10-12 155 views
3

我玩TDD和单元测试一般。我见过的所有例子都是返回值,这似乎是最简单的情况。但是,如果我的函数没有返回值呢?单元测试功能,不返回值

例如,假设我有一个Actor类,我需要一种方法来增加它的“健康”。我做了一个像下面这样的单元测试,然后让Actor类满足它,但这是否正常并且很常见?我没有看到很多使用单元测试中的属性的例子。我应该用这种东西来思考吗?

[TestMethod] 
    public void IncreaseHealth_PositiveValue_PositiveHealth() 
    { 
     Actor a = new Actor(); 

     int beforeHealth = a.Health; 

     a.IncreaseHealth(5); 

     int afterHealth = a.Health; 

     Assert.AreEqual(beforeHealth + 5, afterHealth); 
    } 
+3

是的,没有错或不常见的。你的测试没问题。 –

+0

这很好,我会建议使用一些随机数而不是一个常数,以增加覆盖率。 – Ofiris

+1

我不会建议使用随机数字,随机数字可能会导致测试有时会通过,有时会失败。如果有特殊情况需要调查(如int.MaxValue,int.MinValue,溢出等),请为这些测试创建一个单独的测试。在任何情况下,它们可能都需要特殊的处理,运行时的默认行为很少是你想要的。 – jessehouwing

回答

4

这个测试是一个好的开始。但是,就像测试返回值的方法一样,您应该对带有副作用的方法测试边界条件。在这种情况下,您也应该检查

  • 你的方法不带底片(或取底片,并且按预期工作)
  • 当由溢出整数一些较大的值递增健康结果仍然可预测(例如,健康状态的上限为某个值)
  • 当以大于当前健康值的值减少健康值时,剩余健康状况不会变为负值(除非允许)
  • 当健康状况变为零时,不管发生什么其他事情,都应该触发。

虽然您使用本地初始化对象没有问题,但您也可以将其放在单元测试对象上,并在[Setup]方法中初始化它。

+0

我确实添加了负值测试,在这种情况下,因为函数名称是增加I didn'不想要发生任何事情。测试失败,然后我回去,并添加一个if条件,它的工作。我在思考其他情况时遇到了问题,但是你所说的话是非常有意义的。我觉得有一个共同的东西来测试像溢出等主题。谢谢。 – user441521

+0

溢出一个很有趣,因为VS甚至不会让它编译。所以看起来你甚至不能用.NET做这样的测试呢?我知道C++可能会工作。我传入Int32.MaxValue + 1但它不会编译。 – user441521

+0

@ user441521要达到溢出,您需要调用'IncreaseHealth'两次 - 一次使用'1'或其他正数,然后使用'Int32.MaxValue'。 – dasblinkenlight