1

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2014-04-16T16:10:31.393 回答
0

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

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

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

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

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

参考

于 2014-04-16T14:48:13.640 回答