【问题标题】:Best Practice for Unit Testing valid characters单元测试有效字符的最佳实践
【发布时间】:2012-10-16 20:02:02
【问题描述】:

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

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

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

对于这种情况有什么最佳做法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这正是我的想法。但是……这个“一堆无效输入”会是每个可能是可能输入字符的字符吗?我该如何做到这一点?
    • @Mephisztoe 不,您实际上不可能做每一个错误的字符 - 只需专注于一大堆您知道无法通过验证的输入,无论是因为长度、字母字符还是斜杠太多等。
    • 这是您可能想要查看 Pex 的地方 - Pex 非常适合“建议”一组良好的边界条件案例。 research.microsoft.com/en-us/projects/pex
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多