【问题标题】:unit tests - white box vs. black box strategies单元测试 - 白盒与黑盒策略
【发布时间】:2014-04-16 14:16:41
【问题描述】:

我发现,当我写单元测试的时候,尤其是那些不返回值的方法,我大多是用白盒测试的方式来写测试。我可以使用反射来读取私有数据,以检查它在方法执行后是否处于正确的状态等......

这种方法有很多限制,其中最重要的是

  1. 如果你返工方法,你需要改变你的测试,即使是 API 保留 一样的
  2. 从信息隐藏(封装)的角度来看是错误的 - 测试是我们代码的一个很好的文档,所以会阅读的人 它可能会得到一些关于实施的不必要信息

但是,如果方法不返回值并使用私有数据进行操作,那么像使用黑盒测试范例一样进行测试是非常困难的(几乎不可能)。

那么,有什么想法可以很好地解决这个问题吗?

【问题讨论】:

    标签: oop unit-testing black-box-testing white-box


    【解决方案1】:

    白盒测试意味着您必须将桌面上的一些接线拉出以连接您的仪器。我发现有用的东西:

    1) 我继承并且不想重写的一个整体代码序列,我能够通过将状态类变量放入其中进行检测,然后在每个步骤通过时设置状态。然后我用不同的数据进行测试,并将预期状态与实际状态进行匹配。

    2) 为被测方法的任何方法调用创建模拟。检查是否按预期调用了模拟。

    3) 将需要的属性改为protected 而不是private,并创建一个我实际测试过的子类。子类允许我检查状态。

    【讨论】:

    • Mocking 确实是一个不错的选择,但我认为这会让事情变得有点复杂。
    • 与我在第一个示例中必须做的相比,我更愿意引入模拟。你的第一个模拟是最昂贵的;之后,它变得更容易,更有效率。
    • Mark Seemann describes a good approach 用于确定何时使用模拟。这有助于减少可以进入测试的实现细节的数量。
    【解决方案2】:

    我可以使用反射来读取私有数据,以检查方法执行后是否处于正确状态

    这对于维护测试套件来说确实是个大问题

    在 .Net 中,您可以使用 internal 访问修饰符,因此您可以使用类库中的 InternalsVisibleToAttribute 使您的内部类型对您的单元测试项目可见。

    internal 关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问

    这不会解决所有测试困难,但可以提供帮助

    Reference

    【讨论】:

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