即使是一个简单的Python模块,最常见的目录结构似乎也是将单元测试分成各自的test目录:
new_project/ antigravity/ antigravity.py test/ test_antigravity.py setup.py etc.
例如,请参见此Python项目howto。
我的问题是,实际上运行测试的通常方法是什么?我怀疑这对除我以外的所有人来说都是显而易见的,但是你不能仅从python test_antigravity.pytest目录运行,import antigravity因为模块不在路径上,它将失败。
python test_antigravity.pytest
import antigravity
我知道我可以修改PYTHONPATH和其他与搜索路径有关的技巧,但我不敢相信这是最简单的方法-如果你是开发人员,那很好,但如果用户只是想检查测试结果,就不能期望用户使用通过。
另一种选择是将测试文件复制到另一个目录中,但是似乎有点愚蠢,并且错过了将它们放在一个单独目录中的意义。
那么,如果你刚刚将源代码下载到我的新项目中,将如何运行单元测试?我希望有一个答案可以对用户说:“要运行单元测试,请执行X。”
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照常导入包及其模块:
# 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:
$ cd new_project $ python -m unittest test.test_antigravity
只需以导入模块的相同方式引用测试模块即可。
运行单个测试用例或测试方法:
你也可以运行一个TestCase或一个测试方法:
$ python -m unittest test.test_antigravity.GravityTestCase $ python -m unittest test.test_antigravity.GravityTestCase.test_method
运行所有测试:
你还可以使用测试发现,它将为你发现并运行所有测试,它们必须是命名为模块或包的模块test*.py(可以通过-p, –pattern标记进行更改):
-p
pattern
$ cd new_project $ python -m unittest discover
这将运行包中的所有test*.py模块test。
test*.py
test