用Python编写单元测试:如何开始?[关闭]


533

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

由于这是我第一次做项目,所以这是我第一次为此编写测试。

问题是,我该如何开始?我真的一点儿都不知道。谁能指出我一些可以用来开始编写测试的文档/教程/链接/书(尤其是单元测试)

关于该主题的任何建议都将受到欢迎。


4
如果您打算这样做,那么编写测试永远不会太晚。最好有一个总比没有要抱怨的人好……
Asken 2013年

1
这里有一个很好的测试驱动开发的书,网上的出免费:chimera.labs.oreilly.com/books/1234000000754/index.html
威尔

4
很好的资源,我偶然发现https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/。作为python的新手,我发现它是可以理解的。
渡轮

2
《 Hitchhiker Python指南》简要概述了用于单元测试的工具:python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko

之前的注释应该被评为较高,因为该指南还在github.com/kennethreitz/samplemod上有一个示例代码存储库,这也是一个入门的好地方。
setempler'Dec 23'17

Answers:


101

如果您是第一次使用单元测试,那么最简单的学习方法通​​常是最好的。在此基础上,我建议使用py.test而不是默认unittest模块

考虑以下两个示例,它们具有相同的作用:

示例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

7
我听说过的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.test,并nosetest不能提供?
alpha_989 '18

@ alpha_989标准python库并不打算包含可用的最佳工具。这就是PyPI的目的。标准unittest包装仍然足够好。这是标准的,这意味着它可以保证正常工作。最后,使用您的代码的任何人都不需要安装额外的软件包。
Jeyekomon

72

免费的Python书籍Dive Into Python中关于单元测试的,您可能会觉得很有用。

如果您遵循现代实践,则可能应该在编写项目时编写测试,而不要等到项目接近完成时再进行测试。

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


13
我仍然要说的是,如果您要重构没有单元测试的代码,则应首先为其编写单元测试
Hubert Kario 2014年

9
是的,很多第一次参加单元测试的人都是从老手那里听到听起来“嗯,对于您当前的项目来说有点太晚了”:即使这不是他们真正要说的,也是新手听到的。这就像中国人种树的谚语:开始测试的最佳时间是在项目开始时;现在是第二好的开始测试的时间!
JP

4
潜入Python链接已损坏... :-(
Scott Skiles

40

在我看来,有三个很棒的python测试框架值得一试。
单元测试 -模块配备了所有的Python发行标准
鼻子 -可以运行单元测试的测试,而且具有更少的样板。
pytest-还运行单元测试,样板更少,报告更好,还有很多很棒的额外功能

为了对所有这些进行良好的比较,请阅读http://pythontesting.net/start-here的每个介绍。
也有关于灯具的扩展文章,还有更多。


35

的文档 单元测试将是一个良好的开端。

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


那就是如果您想要测试驱动的开发,这不是一件坏事。就我而言,我正在查看现有代码,并试图通过编写和调整要通过的测试来理解它,这使我开始学习unittest。一旦掌握了一切,我将更多地使用它进行开发,并增加每个单元的测试用例数量。
icedwater

27

unittest随标准库一起提供,但是我建议您进行鼻子测试

鼻子扩展了单元测试,使测试更加容易。

我也建议你pylint

分析Python源代码以寻找错误和质量低劣的迹象。


8

正如其他人已经回答的那样,编写单元测试已经晚了,但还不算太晚。问题是您的代码是否可测试。确实,要对现有代码进行测试并不容易,甚至有一本关于此的书:有效地使用遗留代码(请参见要点前期PDF)。

现在编写或不编写单元测试就是您的要求。您只需要意识到这可能是一项繁琐的任务。您可以解决此问题,以学习单元测试或考虑首先编写验收(端对端)测试,然后在更改代码或向项目添加新功能时开始编写单元测试。


2
为“有效使用旧版代码工作” +1。都是关于没有测试的代码。
David

3

鼻子测试是在python中进行单元测试的出色解决方案。它同时支持基于单元测试的测试用例和doctest,并且只需简单的配置文件就可以开始使用它。


您的鼻子测试链接已过时。看来新的位置是:nas.readthedocs.org/en/latest
odigity

1
根据github和鼻子测试网站上的文档,nose并且nose2处于维护模式。最好py.test
从其
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.