1

假设一个方法接受一个字符串作为输入参数,并且这个字符串只能包含从 1 到 8 的数字和一个破折号(“/”)。

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

我的第一个想法是颠倒 ArgumentException 的要求和测试,即有一个数据驱动的单元测试,它使用所有其他可能的字符调用该方法并期望 ArgumentException。然而,……这感觉有点像用大锤敲碎坚果……

有没有针对这种情况的最佳实践?

4

2 回答 2

3

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

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

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

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

于 2012-10-14T08:32:04.450 回答
0

您可以尝试数据驱动单元测试(MSDN:如何:创建数据驱动单元测试)。

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

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

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

于 2012-10-16T12:02:02.257 回答