你应该把单元测试放在哪里?

34
Java).
  • Separate folder for each class's unit tests: This convention would create a folder named after each class, which would contain both the implementation file and the unit test file. This approach keeps everything closely related to each other and avoids cluttering the files with annotations or comments. However, it may result in having many folders if there are many classes in the project.
  • Java) - 我认识的许多开发人员使用 vim/emacs 或类似编辑器,对于 PHP 开发本身几乎没有任何支持。

    您对这些单元测试放置位置的经验如何?您是否有其他我未在此列出的约定?还是我高估了对评审者的单元测试可访问性的重要性?

    3个回答

    26

    我倾向于将单元测试与生产代码(#3)放在同一个目录中的不同源文件中。

    单元测试并非次等公民,它们的代码必须像生产代码一样进行维护和重构。如果您将单元测试放在一个独立的目录中,下一个修改生产代码的开发人员可能会错过与其相关的单元测试,从而无法对其进行维护。

    在C++中,我倾向于每个类使用三个文件:

    MyClass.h
    MyClass.cpp
    t_MyClass.cpp
    

    如果您正在使用Vim,则我的toggle_unit_tests插件可用于在源代码和单元测试文件之间进行切换。


    如果开发人员错过了什么,为什么不应该责怪他们呢?即使单元测试并非直接可见,每个开发人员都应该关注它们。 - kgui
    5
    责怪在我所参与的任何工程团队中都没有证明是有用的方面。我宁愿通过让问题明显化来为未来的开发人员成功铺平道路,使他们花费时间来满足业务要求。 - johnsyweb
    1
    好观点。我认为我应该使用“责任”这个词。你同意开发人员应该感到有责任确保他们的代码经过测试吗? - kgui
    @Crt:我认为我的回答是“要看情况”。原则上我同意,但在某些情况下,我更喜欢放弃单元测试,专注于恢复生产系统的服务。 - johnsyweb

    9

    目前最佳实践是将单元测试分离到它们自己的目录中,#1。所有的“约定优于配置”的系统都是这样做的,例如Maven、Rails等。

    我认为你提出的替代方案很有趣且有效,工具支持也肯定存在以支持它们。但就我所知,它并不那么流行。有些人反对在生产代码中穿插测试代码。但如果你总是编写单元测试,那么将它们放在代码旁边是有道理的。这似乎更简单。


    3
    我总是选择第一种方法。虽然它们彼此之间很接近,但我的原因如下:
    • 我觉得核心代码库和单元测试之间有区别。我需要真正的分离。
    • 终端用户很少需要查看单元测试。他们只对API感兴趣。虽然单元测试提供了对代码的单独视图,但实际上我觉得它不会被用来更好地理解它(更详细的文档+示例可以做到)。
    • 由于终端用户很少需要单元测试,我不想用更多的文件和/或方法来混淆他们。
    • 我的编码标准在单元测试中并不像在核心库中那么严格。这可能只是我的观点,但我对测试中的编码标准并不太关心。
    希望这能帮助你。

    3
    我不同意“最终用户很少需要查看单元测试”。我理解新的代码库的第一件事就是查看单元测试如何使用代码、类和函数。 - Basil Musa
    你并没有让最终用户感到困惑,相反,你在提醒他们将测试视为一等公民,从而帮助他们更好地掌握技能。 - Basil Musa
    @BasilMusa,嗯。这个回答已经有10年了。不过,我还是或多或少有同样的感觉。我猜这主要是主观的吧。 - Evert

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接