【问题标题】:Writing unit tests in Python: How do I start? [closed]用 Python 编写单元测试:我该如何开始? [关闭]
【发布时间】:2010-07-30 12:10:06
【问题描述】:

我用 Python 完成了我的第一个合适的项目,现在我的任务是为它编写测试。

因为这是我第一次做一个项目,所以这是我第一次为它编写测试。

问题是,如何开始?我完全不知道。谁能指出我可以用来开始编写测试的一些文档/教程/链接/书籍(我猜特别是单元测试)

欢迎就该主题提出任何建议。

【问题讨论】:

标签: python unit-testing testing


【解决方案1】:

如果您刚开始使用单元测试,那么最简单的学习方法通​​常是最好的。在此基础上,我建议使用py.test 而不是the default unittest module

考虑这两个例子,它们做同样的事情:

示例 1(单元测试):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

示例 2(pytest):

def test_starting_out():
    assert 1 == 1

假设两个文件都命名为test_unittesting.py,我们如何运行测试?

示例 1(单元测试):

cd /path/to/dir/
python test_unittesting.py

示例 2(pytest):

cd /path/to/dir/
py.test

【讨论】:

  • 我在多个地方都听说过 py.test 的简单性(docs.python-guide.org/en/latest/writing/tests/#py-testdocs.python.org/3.5/library/unittest.html#module-unittestjeffknupp.com/blog/2013/12/09/…)为什么 unit-test 仍然包含在标准库中,如果 py.testnose 提供相同的功能和更简单的界面?只是为了提供向后兼容性,还是unittest 有一些py.testnosetest 无法提供的优势?
  • @alpha_989 标准 python 库并非旨在包含可用的最佳工具。这就是 PyPI 的用途。标准的unittest 包仍然足够好。它是 standard ,这意味着它可以保证运行良好。最后,任何使用你的代码的人都不需要安装额外的包。
  • 嗨,你能告诉我如何防止skip()skipIf() 方法转义原因字符串。问题是 skip()skipIf() 装饰器的输出在我不想要的 \n 处加入。请赐教!
【解决方案2】:

免费的 Python 书籍 Dive Into Python 有一个 chapter on unit testing,您可能会觉得有用。

如果您遵循现代实践,您可能应该在编写项目时编写测试,而不是等到项目快完成。

现在有点晚了,但现在你知道下一次了。 :)

【讨论】:

  • 我还是想说,如果你想重构没有单元测试的代码,你应该先为它写单元测试
  • 是的,很多第一次参加单元测试的人从老手那里听到“嗯,对你当前的项目来说有点太晚了”之类的话:即使那不是他们实际的意思意思是说,这就是新手听到的。就像中国谚语中的植树造林:开始测试的最佳时间是在项目开始时;开始测试的次佳时间是现在!
  • Dive into Python 链接已损坏... :-(
  • 嗨,你能告诉我如何防止skip()skipIf() 方法转义原因字符串。问题是 skip()skipIf() 装饰器的输出在我不想要的 \n 处加入。请赐教!
【解决方案3】:

在我看来,有三个很棒的 Python 测试框架值得一试:

  • unittest - 模块是所有 Python 发行版的标准配置
  • nose - 可以运行 unittest 测试,并且样板文件更少。
  • pytest - 还运行单元测试测试,样板更少,报告更好,以及许多很酷的额外功能

为了更好地比较所有这些,请在 Start Here - Python Testing 阅读每个的介绍。 还有关于固定装置的扩展文章,等等。

【讨论】:

    【解决方案4】:

    unittest 的文档将是一个很好的起点。

    另外,现在有点晚了,但将来请考虑在项目本身之前或期间编写单元测试。这样,您可以在进行过程中使用它们进行测试,并且(理论上)您可以将它们用作回归测试,以验证您的代码更改没有破坏任何现有代码。这将为您提供编写测试用例的全部好处:)

    【讨论】:

    • 如果你想要测试驱动的开发,这并不是一件坏事。就我而言,我正在查看现有代码并尝试通过编写和调整测试以通过它来理解它,这让我开始使用unittest。一旦掌握了窍门,我将更多地使用它进行开发,并增加每个单元的测试用例数量。
    • 嗨,你能告诉我如何防止skip()skipIf() 方法转义原因字符串。问题是 skip()skipIf() 装饰器的输出在我不想要的 \n 处加入。请赐教!
    【解决方案5】:

    unittest 带有标准库,但我建议您nosetests

    "nose 扩展了 unittest 以简化测试。"

    我也会推荐你pylint

    分析 Python 源代码,寻找错误和质量差的迹象。

    【讨论】:

      【解决方案6】:

      正如其他人已经回答的那样,编写单元测试已经晚了,但还不算太晚。问题是您的代码是否可测试。确实,对现有代码进行测试并不容易,甚至有一本关于此的书:Working Effectively with Legacy Code(参见key pointsprecursor PDF)。

      现在是否编写单元测试由您决定。您只需要意识到这可能是一项乏味的任务。您可能会解决这个问题来学习单元测试或考虑首先编写验收(端到端)测试,然后在您更改代码或向项目添加新功能时开始编写单元测试。

      【讨论】:

        【解决方案7】:

        nosetests 是一个出色的 Python 单元测试解决方案。它支持基于单元测试的测试用例和文档测试,只需一个简单的配置文件即可让您开始使用它。

        【讨论】:

        • 您的鼻子测试链接已过时。新位置似乎是:nose.readthedocs.org/en/latest
        • 根据github和nosetest网站上的文档,nosenose2处于维护模式。最好从py.test 开始,因为它有更多的支持
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 2011-03-16
        相关资源
        最近更新 更多