setter & getter 上的单元测试 - 最佳实践



我有2个函数,我想在我的类测试-get&set。这两个函数执行实际的逻辑,而不仅仅是返回和设置,所以我想测试它们。

我已经开始为这些函数编写单元测试,在伪代码中像这样:

value_to_write = 5
my_class.set_value(value_to_write)
read_value = my_class.get_value()
assert(read_value == value_to_write)

所以在这个例子中,我们set,然后与get检查set是否成功。
但后来我想起了"测试应该检查且只检查一件事"的最佳实践。在这个例子中,我同时检查setget

这个例子的最佳实践是什么?
正在创建检查set,检查get和最后检查用set写的值是否正确的3个函数(如上面的例子)?
这个方法的问题是第三个测试已经涵盖了第一个和第二个测试,所以我想知道这有什么意义

如果你的类实现了equals()(或者在你的语言/平台中任何合适的东西)和另一种设置值的方式(即通过构造函数),你可以设置值,然后将整个对象与使用其他设置值方式的引用对象进行比较。如果在您的情况下这是不可能的,那么还是实用一点,使用getter。毕竟,在测试getter时,您可能会遇到同样的问题(如何在不使用setter的情况下设置值)。

首先,您应该重新评估您的setter和getter是否真的应该按原样命名。例如,setter中的一个简单的验证应该是好的,但对我来说,让setter和getter包含很多或复杂的逻辑看起来很危险。调用者对函数的名称有一定的期望,并且不会意识到这样的函数不仅仅是设置或返回一个值。例如,我希望getter的调用是便宜的,如果它访问数据库而不是返回一个类变量,情况就不是这样了。因此,您可以考虑将函数重命名为loadX()getConvertedX()getXAsNumber或类似的名称,这取决于它们实际做什么。

为了能够检测故障,测试oracle必须能够观察到状态或输出的错误部分。因此,您可以考虑添加一个真正的getter,它只返回值或显示内部状态。这个getter可以具有测试访问该值所必需的最小可见性。然后,您可以通过调用特殊的setter并使用真正的getter验证结果来测试它。要测试您的特殊getter,您可以准备对象(如果有必要,使用setter),使用真正的getter验证您是否拥有想要的状态,然后调用您的特殊getter。或者,你可以引入一个特殊getter的附加变体,它执行逻辑并通过参数接受必要的输入;然后,你可以测试那个函数原始的特殊getter会委托给新函数。

总之,我建议

  • 评估函数名是否合适
  • 在合理的地方引入额外的getter,并使用它们来获取关于
  • 状态/对象的信息。