【问题标题】:Should Python unittests be in a separate module?Python 单元测试应该在一个单独的模块中吗?
【发布时间】:2010-11-23 09:02:37
【问题描述】:

对于放置 Python 单元测试的最佳位置是否存在共识?

是否应该将单元测试包含在与被测试功能相同的模块中(在模块独立运行时执行(if __name__ == '__main__' 等)),还是将单元测试包含在不同的模块中更好?

也许将这两种方法结合起来是最好的,包括在每个模块中进行模块级测试,并添加更高级别的测试,这些测试将多个模块中包含的测试功能作为单独的模块(可能在 /test 子目录中?)。

我认为,如果测试包含在单独的模块中,测试发现会更直接,但如果开发人员必须记住在被测模块被修改时更新额外的测试模块,则会增加开发人员的负担。

我很想知道人们对组织单元测试的最佳方式的看法。

【问题讨论】:

    标签: python unit-testing testing


    【解决方案1】:
    1. 如果使用指定单元测试应该存在的位置的库,您必须在哪里,
    2. 在用于小型项目的模块本身中,或
    3. 在您的包中的 tests/ 子目录中,用于较大的项目。

    关键是什么最适合您正在创建的项目。

    有时,您使用的库决定了测试的位置,就像 Django 一样(您将测试放在应用程序中的 models.pytests.pytests/ 子目录中)。

    如果没有现有的限制,这是个人喜好问题。对于一小组模块,将单元测试放在您正在创建的文件中可能更方便。

    除了几个模块之外,我在包的tests/ 目录中单独创建测试。将测试代码与实现混合在一起会给任何阅读代码的人带来不必要的噪音。

    【讨论】:

    • 感谢您提供全面的答案。我喜欢你关于减少实现代码中的噪音的观点。我也喜欢 Mike 关于在单独的 /tests 子目录中包含测试时尝试保持模块与其测试之间的一对一关系的回答。
    • 我在这里真的很迂腐,但 Django(以及任何决定你将测试放在哪里的东西)可能应该被称为框架而不是库。
    【解决方案2】:

    是的,请使用单独的模块。

    使用__main__ 技巧没有任何意义。假设您的模块中有多个文件,但它不再起作用,因为您不想在测试模块时单独运行每个源文件

    此外,在安装模块时,大多数时候您不想安装测试。您的最终用户不关心测试,只有开发人员应该关心。

    不,真的。将您的测试放入tests/,将您的文档放入doc,并为make test 准备好Makefile。任何其他方法都只是中间解决方案,仅对特定的微型模块有效。

    【讨论】:

    • 同意“主要”技巧没有帮助(如果其他人甚至有机会看到代码)。
    • 同意。在开始学习 Python 时,当有人建议使用“main”技巧来放置测试代码时,我感到很惊讶(不记得来源,但很可靠),我认为这是某种奇怪的 Python 约定。跨度>
    【解决方案3】:

    我通常将它们放在一个单独的文件夹中,通常称为 test/。我个人没有使用 if __name__ == '__main__' 检查,因为我使用nosetests,它自己处理测试检测。

    【讨论】:

      【解决方案4】:

      除了测试之外,可能还有其他原因使用if __name__ == '__main__' 检查。将测试保留在其他模块中会使您可以选择该选项。另外——如果你重构了一个模块的实现并且你的测试在另一个没有被编辑的模块中——你知道当你对重构的代码运行它们时测试没有被改变。

      【讨论】:

        【解决方案5】:

        if __name__ == '__main__' 等非常适合小型测试。

        【讨论】:

          【解决方案6】:

          我通常将测试代码保存在一个单独的模块中,并在一个发行版中发布模块/包和测试。如果用户使用setup.py 安装,他们可以从测试目录运行测试以确保一切都在他们的环境中运行,但只有模块的代码最终在Lib/site-packages 下。

          【讨论】:

            【解决方案7】:

            就我个人而言,我在我的源目录中创建了一个 tests/ 文件夹,并尝试或多或少地用单元测试等效项来镜像我的主要源代码层次结构(根据经验,有 1 个模块 = 1 个单元测试模块)。

            请注意,我使用的是 nose,它的理念与 unittest 的理念有些不同。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-02-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多