单元测试框架的选择

选择框架之前首先要确认一下我们的选项概念和她们之间的区别。

PyUnit

PyUnit(The Python unit testing framework) 是 Kent Beck 和 Erich Gamma 所设计的 JUnit 的 Python 版本。从 Python 2.1 版本后,PyUnit 成为 Python 标准库的一部分。

这就是我们日常使用的 unittest 。它太过优秀了,以至于我们几乎没有必要再用别的测试框架了。

下面这个例子,是bottle框架下测试首页的简单例子,首先是bottle的代码:

#!/usr/bin/env python
# encoding: utf-8
import bottle


@bottle.route('/')
def index():
    return 'Hi!'


if __name__ == '__main__':
    bottle.run()

这是单元测试的代码:

#!/usr/bin/env python
# encoding: utf-8
import mywebapp
import unittest


class TestBottle(unittest.TestCase):
    def test_webapp_index(self):
        assert mywebapp.index() == 'Hi!'


if __name__ == '__main__':
    unittest.main()

直接运行这个文件就可以了,可以看到在普通模式,和verbosity模式下的返回结果:

普通模式:


.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

verbosity模式:

test_webapp_index (__main__.TestBottle) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

表示我们的测试都通过了。

doctest

doctest 也是 Python 标准库的一部分。

doctest 可以用来写一些比较简单的测试,也可以用来检查文档和注释能否解释当前版本的代码。

pytest

pytest 也是一个很流行的测试框架,是很多公司的首选。

看一份邮件流吧,一些工程师阐述了他们为什么会选择使用pytest: 我是邮件链接

nose

nose 并不是一个真正的测试框架,它只是一个很优秀的测试执行器,是unittest的拓展。

它的官方也是这样介绍自己的:nose extends unittest to make testing easier.

nose 可以运行由PyUnit(unittest), doctest,pytest创建的测试。