即使是一个简单的Python模块,最常见的目录结构似乎也是将单元测试分成各自的test目录:
test
new_project/ antigravity/ antigravity.py test/ test_antigravity.py setup.py etc.
例如,请参阅此Python项目howto。
我的问题是 ,实际上运行测试的通常方法 是 什么? 我怀疑这对除我以外的所有人来说都是显而易见的,但是您不能仅从python test_antigravity.pytest目录运行,import antigravity因为模块不在路径上,它将失败。
python test_antigravity.py
import antigravity
我知道我可以修改PYTHONPATH和其他与搜索路径有关的技巧,但是我不相信这是最简单的方法- 如果您是开发人员,那很好,但如果用户只是想检查测试结果,就不能期望用户使用通过。
另一种选择是将测试文件复制到另一个目录中,但是似乎有点愚蠢,并且错过了将它们放在一个单独目录中的意义。
那么,如果您刚刚将源代码下载到我的新项目中,将如何运行单元测试?我希望有一个答案让我对用户说:“要运行单元测试,请执行X。”
我认为最好的解决方案是使用unittest 命令行界面,该界面会将目录添加到,sys.path因此您不必(在TestLoader类中完成)。
unittest
sys.path
TestLoader
例如,对于这样的目录结构:
new_project ├── antigravity.py └── test_antigravity.py
您可以运行:
$ cd new_project $ python -m unittest test_antigravity
对于像您这样的目录结构:
new_project ├── antigravity │ ├── __init__.py # make it a package │ └── antigravity.py └── test ├── __init__.py # also make test a package └── test_antigravity.py
在test包内的测试模块中,您可以antigravity照常导入包及其模块:
antigravity
# import the package import antigravity # import the antigravity module from antigravity import antigravity # or an object inside the antigravity module from antigravity.antigravity import my_object
运行一个测试模块:
要运行一个测试模块,在这种情况下test_antigravity.py:
test_antigravity.py
$ cd new_project $ python -m unittest test.test_antigravity
只需以导入模块的相同方式引用测试模块即可。
运行单个测试用例或测试方法:
您也可以运行一个TestCase或单个测试方法:
TestCase
$ python -m unittest test.test_antigravity.GravityTestCase $ python -m unittest test.test_antigravity.GravityTestCase.test_method
运行所有测试:
您还可以使用测试发现功能来为您发现并运行所有测试,它们必须是命名的模块或软件包test*.py(可以用-p, --pattern标志进行更改):
test*.py
-p, --pattern
$ cd new_project $ python -m unittest discover $ # Also works without discover for Python 3 $ # as suggested by @Burrito in the comments $ python -m unittest
这将运行包中的所有test*.py模块test。