我正在尝试将一些按合同设计的技术融入我的编码风格。后置条件在我看来很像嵌入式单元测试,我想知道我的想法是在正确的轨道上还是偏离了基础。
维基百科将后置条件定义为“一个条件或谓词,在执行某些代码部分或正式规范中的操作后必须始终为真。后置条件有时使用代码本身中的断言进行测试”。
这与您在直接验证状态(不使用模拟)的单元测试中所做的不太相似吗?
如果是这样的话:
1)通过使用后置条件,我现在不是在我的生产代码中嵌入测试代码吗,这不是不被接受吗?
2) 使用后置条件是否应该改变我的单元测试的结构?我的第一个想法是断言逻辑从测试转移到后置条件。也就是说,测试将使用相同的输入,我仍在测试我之前测试的所有内容,但现在我不是在单元测试中做出断言,而是对后置条件是否通过进行简单的二进制断言。
3)我的第二个想法是后置条件代码可能具有控制流,因此不适用于测试代码,测试代码应该简单并避免控制流。但是,如果我测试后置条件,我可以在单元测试中依赖它们吗?
4) 测试后置条件似乎很困难,因为如果我正确理解它们,它们基本上通过或失败,您将不得不重复后置条件本身的逻辑以检查它是否做了正确的事情。那么,如何测试后置条件呢?您是否通过不在单元测试中使用它们并确保您的单元测试和后置条件一起通过或失败来检查它们?
5) 我的单元测试有时会验证某个方法是否会导致协作者的状态发生变化。在标准实践中,后置条件是涵盖协作者状态还是仅涵盖它们所定义的类的状态?