对于一个简单的Python模块来说,非常常见的目录结构似乎是将单元测试分离到它们自己的测试目录中:
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.
我的问题很简单,实际运行测试的通常方式是什么?我怀疑这对每个人来说都是显而易见的,除了我,但你不能只是从测试目录运行python test_antigravity.py,因为它的导入antigravity将失败,因为模块不在路径上。
我知道我可以修改PYTHONPATH和其他与搜索路径相关的技巧,但我不能相信这是最简单的方法——如果您是开发人员,这很好,但如果用户只是想检查测试是否通过,那么期望他们使用这种方法是不现实的。
另一种替代方法是将测试文件复制到另一个目录中,但这似乎有点愚蠢,并且没有注意到将它们放在一个单独的目录中。
那么,如果您刚刚下载源代码到我的新项目,您将如何运行单元测试?我更喜欢这样的答案:“要运行单元测试,请执行x。”
Python 3 +
添加到@Pierre
使用这样的unittest目录结构:
new_project
├── antigravity
│ ├── __init__.py # make it a package
│ └── antigravity.py
└── test
├── __init__.py # also make test a package
└── test_antigravity.py
运行测试模块test_antigravity.py:
$ cd new_project
$ python -m unittest test.test_antigravity
或者一个单独的TestCase
$ python -m unittest test.test_antigravity.GravityTestCase
强制性的不要忘记__init__.py,即使为空,否则将无法工作。
Python 3 +
添加到@Pierre
使用这样的unittest目录结构:
new_project
├── antigravity
│ ├── __init__.py # make it a package
│ └── antigravity.py
└── test
├── __init__.py # also make test a package
└── test_antigravity.py
运行测试模块test_antigravity.py:
$ cd new_project
$ python -m unittest test.test_antigravity
或者一个单独的TestCase
$ python -m unittest test.test_antigravity.GravityTestCase
强制性的不要忘记__init__.py,即使为空,否则将无法工作。
如果你使用VS Code,并且你的测试与你的项目位于同一级别,那么运行和调试你的代码就不能开箱即用。你能做的就是改变启动方式。json文件:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"pythonPath": "${config:python.pythonPath}",
"program": "${file}",
"cwd": "${workspaceRoot}",
"env": {},
"envFile": "${workspaceRoot}/.env",
"debugOptions": [
"WaitOnAbnormalExit",
"WaitOnNormalExit",
"RedirectOutput"
]
}
]
}
这里的关键行是envFile
"envFile": "${workspaceRoot}/.env",
在项目的根目录中添加.env文件
在.env文件中添加项目根目录的路径。这将临时添加
PYTHONPATH = C: \ \ PYTHON项目\ \ ROOT_DIRECTORY
路径到你的项目,你将能够使用调试单元测试从VS Code
如果没有一些巫术,就不能从父目录导入。下面是另一种至少适用于Python 3.6的方法。
首先,创建一个包含以下内容的test/context.py文件:
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
然后在test/test_antigravity.py文件中导入如下内容:
import unittest
try:
import context
except ModuleNotFoundError:
import test.context
import antigravity
请注意,这个try-except子句的原因是
导入测试。当使用“python test_antigravity.py”运行时,上下文将失败
在new_project目录下使用"python -m unittest"运行时导入context失败。
通过这种诡计,他们都成功了。
现在你可以运行test目录下的所有测试文件:
$ pwd
/projects/new_project
$ python -m unittest
或者运行一个单独的测试文件:
$ cd test
$ python test_antigravity
好吧,这并不比在test_antigravity。py中包含context。py的内容漂亮多少,但也许会漂亮一点。欢迎提出建议。