Python单元测试与发现
我有一些文件夹,里面的文件名像这样:
test_foo.py
每个文件都是一个测试案例。
我想要做的是:
从命令行运行一个文件夹里的所有测试。我在用
unittest2
,因为我们使用的是 Python 2.5.1。在其中一个文件夹里,我在命令行输入了这个:python -m unittest2 discover -p 'test_*.py'
我试了好几种不同的写法。没有报错,但也没有任何反应。我原本期待这个文件夹里的所有测试都能运行并显示结果。
我还尝试在这个文件夹里写了一个脚本:
loader = unittest2.TestLoader() t = loader.discover('.')
如果我打印
t
这个变量,我能看到我的测试案例,但从文档上我搞不清楚一旦有了加载器对象该怎么处理。
3 个回答
根据你在命令行中使用 unittest2
的方式,特别是在 Python < 2.7
的情况下,我觉得你可能错过了 unittest2 在 PyPI 页面上的说明:
注意
命令行使用
在 Python 2.7 中,你可以通过
python -m unittest <args>
来使用 unittest 的命令行功能(包括测试发现)。因为 unittest 是一个包,而在 Python 2.7 中可以用python -m ...
来调用包的功能是新加入的,所以我们不能用这个方式来调用 unittest2。相反,unittest2 提供了一个叫做 unit2 的脚本。命令行使用方法:
unit2 discover unit2 -v test_module
还有一个这个脚本的副本叫
unit2.py
,它对 Windows 用户很有用,因为它是通过文件扩展名来判断用哪个程序来执行文件,而不是通过 shebang 行。以上这两个脚本都是通过 distutils 安装的。
试试这个 unit2
脚本吧,它是这个说明推荐给旧版 Python 的替代方案,用来替代 Python 2.7 的“将包作为主脚本运行”功能。如果你想从自己的代码中发现并运行测试,或许它的源代码也会对你有帮助。
一旦你找到了测试,你就可以用一个测试运行器来执行它们。
对于Python 2:
import unittest2
loader = unittest2.TestLoader()
tests = loader.discover('.')
testRunner = unittest2.runner.TextTestRunner()
testRunner.run(tests)
对于Python 3:
import unittest
loader = unittest.TestLoader()
tests = loader.discover('.')
testRunner = unittest.runner.TextTestRunner()
testRunner.run(tests)
运行上面的代码会把测试结果显示在屏幕上。
我在运行 python -m unittest discover
时也遇到了同样的问题。这里有一个不错的检查清单,可以帮助你确认你的设置是否正确。虽然 Nose
对配置的要求更灵活,但并不一定更好。
确保所有的文件和文件夹名都以
test
开头。不要使用test-something.py
,因为那不是一个有效的 Python 模块名。应该用test_something.py
。如果你把测试放在一个子目录里(比如
test/
),一定要创建一个test/__init__.py
文件,这样 Python 才会把这个目录当作一个包来处理。所有的测试类必须继承
unittest.TestCase
。比如:class DataFormatTests(unittest.TestCase)
所有的测试方法名必须以
test_
开头。def test_data_format(self):