我应该添加 white/black 框冗余单元测试吗?

Should I add white/black box rendundant Unit Tests?

我已经为我的项目编写了 black-box 单元测试。

重构后,我在代码中采用了 strategy pattern

此代码包含在 black-box 单元测试中,即使在 refactoring 之后也是如此。

但是我想知道:我是否应该添加 white-box unit tests,例如,检查每个策略是否在做应该做的事情?

或者这是 redundant 因为我已经有了正在检查 final outcome 的黑框?

一般测试和单元测试的主要目标之一是发现错误(请参阅 Myers、Badgett、Sandler:软件测试的艺术,或 Beizer:软件测试技术,还有许多其他内容).在您的项目中,您可能对此持更宽松的立场,但有许多软件项目在这些项目中,如果实现级别的错误逃逸到后期开发阶段甚至现场,将会产生严重后果。有人说,您的目标应该是增加对代码的信心——这也是事实,但信心只能是正确进行测试的结果。如果你不去测试找bug,那么你测试完了我对你的代码根本就没有信心。

当查找错误是单元测试的主要目标时,尝试使单元测试套件完全独立于实现细节可能会导致测试套件效率低下——即不适合查找错误的测试套件所有可以找到的错误。不同的实现有不同的潜在错误。如果您不使用单元测试来查找这些错误,那么任何其他测试级别(集成、子系统、系统)肯定不太适合系统地查找它们。

因此,您关于您最初使用黑盒测试测试代码的说法已经让我怀疑测试套件首先是否完全有效。因此,是的,我会为每种策略添加特定测试。

但是,请记住,拥有一个有效的测试套件的目标与另一个目标竞争,即拥有一个易于维护的测试套件。但我将发现错误视为主要目标,将测试套件的可维护性视为次要目标。尽管如此,即使在进行白盒测试时也尽量保持低维护工作量:仅使用白盒测试来查找黑盒测试也找不到的错误。并且,尝试在测试辅助函数之间隐藏实现细节的使用。