对于一个简单的Python模块来说,非常常见的目录结构似乎是将单元测试分离到它们自己的测试目录中:
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.
我的问题很简单,实际运行测试的通常方式是什么?我怀疑这对每个人来说都是显而易见的,除了我,但你不能只是从测试目录运行python test_antigravity.py,因为它的导入antigravity将失败,因为模块不在路径上。
我知道我可以修改PYTHONPATH和其他与搜索路径相关的技巧,但我不能相信这是最简单的方法——如果您是开发人员,这很好,但如果用户只是想检查测试是否通过,那么期望他们使用这种方法是不现实的。
另一种替代方法是将测试文件复制到另一个目录中,但这似乎有点愚蠢,并且没有注意到将它们放在一个单独的目录中。
那么,如果您刚刚下载源代码到我的新项目,您将如何运行单元测试?我更喜欢这样的答案:“要运行单元测试,请执行x。”
对于用户来说,最简单的解决方案是提供一个可执行脚本(runtests.py或类似的脚本),该脚本引导必要的测试环境,包括(如果需要的话)将根项目目录添加到sys. py。临时道路。这并不需要用户设置环境变量,类似这样的东西在引导脚本中工作得很好:
import sys, os
sys.path.insert(0, os.path.dirname(__file__))
然后你给用户的指令可以像“python runtests.py”一样简单。
当然,如果你需要的路径确实是os.path.dirname(__file__),那么你不需要将它添加到sys. path.dirname(__file__)。道路;Python总是将当前运行脚本的目录放在sys. exe的开头。路径,因此根据您的目录结构,将runtests.py定位到正确的位置可能就足够了。
此外,Python 2.7+中的unittest模块(在Python 2.6及更早的版本中被反向移植为unittest2)现在内置了测试发现,所以如果你想自动化测试发现,nose不再是必要的:你的用户指令可以像Python -m unittest discover一样简单。
使用cwd作为根项目的目录(在你的例子中是new_project),你可以在任何目录中不使用__init__.py运行以下命令:
python -m unittest discover -s test
但是你需要在test_antigravity.py中导入如下:
from antigravity import antigravity.your_object
而不是:
import antigravity.your_object
如果你不喜欢反重力条款,你可能会喜欢艾伦L的答案。
如果您正在寻找命令行解决方案:
基于以下目录结构(使用专用源目录进行概括):
new_project/
src/
antigravity.py
test/
test_antigravity.py
Windows:(在new_project中)
$ set PYTHONPATH=%PYTHONPATH%;%cd%\src
$ python -m unittest discover -s test
如果您想在批for循环中使用此语句,请参阅此问题。
Linux:(在new_project中)
$ export PYTHONPATH=$PYTHONPATH:$(pwd)/src [I think - please edit this answer if you are a Linux user and you know this]
$ python -m unittest discover -s test
使用这种方法,还可以在必要时向PYTHONPATH添加更多目录。