一般来说,测试代码并不容易。如果是这样的话,我们很久以前就已经做过,而且仅在过去10到15年中才做得这么多。最大的困难之一一直是确定如何测试以内聚方式编写,结构合理,可测试而不破坏封装的代码。BDD负责人建议我们几乎完全将重点放在行为上,并且在某些方面似乎表明您并不需要真正担心内部细节如此之大,但这通常会使事情很难测试。许多私有方法以非常隐蔽的方式进行“填充”,因为这会增加测试的整体复杂性,以便在更公共的级别处理所有可能的结果。
模拟可以在一定程度上有所帮助,但同样是外部关注。依赖注入也可以很好地工作,再次与模拟或测试双打配合使用,但这也可能需要您通过接口或直接公开元素,否则可能更希望保持隐藏状态-如果您希望这样做,尤其如此。对系统中的某些类具有很好的偏执性安全级别。
对我而言,对于是否将您的课程设计为更易于测试的问题,尚无定论。如果您发现自己需要在维护旧代码的同时提供新的测试,则会造成问题。我接受您应该能够绝对测试系统中的所有内容,但我不喜欢公开(甚至间接公开)类的私有内部结构的想法,只是为了让我可以为它们编写测试。
对我而言,解决方案始终是采取一种相当务实的方法,并结合多种技术以适应每种特定情况。我使用许多继承的测试双打来暴露测试的内部属性和行为。我模拟了可以附加到类上的所有内容,并且在不影响类安全性的情况下,我将提供一种方法来覆盖或注入行为以进行测试。我什至会考虑提供更多事件驱动的界面,如果它有助于提高测试代码的能力
在找到任何“无法测试”的代码的地方,我看是否可以重构以使事情更可测试。在您有很多隐藏在后台的私有代码执行的地方,通常您会发现新的类正在等待被突破。这些类可以在内部使用,但通常可以以较少的私有行为进行独立测试,并且随后通常可以减少访问和复杂性的层数。但是,我确实要避免的一件事是使用内置的测试代码编写生产代码。创建“ 测试突耳 ” 可能会很诱人,从而导致诸如的恐怖if testing then ...
,这表明测试问题并未得到完全解构和未完全解决。
您可能会发现阅读Gerard Meszaros的xUnit Test Patterns本书很有帮助,该书比我在此处介绍的所有内容都详尽得多。我可能并没有按照他的建议去做,但是确实有助于弄清一些棘手的测试情况。归根结底,您希望能够在继续应用首选设计的同时满足测试要求,这有助于更好地了解所有选项,以便更好地确定可能需要折衷的地方。