单元测试有效字符的最佳实践

时间:2012-10-14 08:18:36

标签: c# unit-testing tdd vs-unit-testing-framework

假设一个方法接受一个字符串作为输入参数,并且该字符串必须只包含1到8之间的数字和短划线(“/").

在开发测试驱动时,您如何编写单元测试来验证该方法是否进行了正确的参数检查?

我的第一个想法是反转需求并测试ArgumentException,即有一个数据驱动的单元测试,它使用其他所有可能的字符调用该方法并期望ArgumentException。然而,......感觉有点像用大锤开裂坚果......

对于这种情况,有没有最佳做法?

2 个答案:

答案 0 :(得分:3)

  

我的第一个想法是颠倒了要求并测试了ArgumentException

这是该功能应该做的第一件事。如果它是一个公共函数,那么它应该假设它的参数是无效的,除非另有证明。你说的要求很容易用正则表达式检查覆盖 - 如果正则表达式失败则抛出ArgumentException或OutOfRangeException。

  

如何编写单元测试来验证方法是否进行了正确的参数检查

您只需要两种重复调用目标函数的测试方法。对于第一个有一堆带有有效参数的调用,并确保检查返回值是否有。
对于第二个测试方法,它会触发一堆无效输入,包括带有特殊字符,大写和小写等的字符串,无效输入应该触发异常,这会导致测试失败(你需要用这个方法来装饰这个方法)预期的异常属性)。

答案 1 :(得分:0)

您可以尝试数据驱动的单元测试(MSDN:How to: Create a Data-Driven Unit Test)。

这允许您定义XML,CSV或数据库表等数据源,并将几种可能的输入放入其中。单元测试只写入一次,但每个数据行执行一次。

你可以填充,例如包含一些有效输入字符串并对其进行测试的CSV文件,以及另一个带有一些无效字符串的CSV文件,其中测试方法检查[ExpectedExcetion(typeof(...))](或者在这种情况下代码应该执行的任何操作。)

这很容易实现(请参阅上面的链接),如果愿意,您甚至可以随机生成各种格式的数千种输入。