对于一个简单的Python模块来说,最常见的目录结构似乎是将单元测试分离到他们自己的test目录中:
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.我的问题仅仅是,实际运行测试的通常方式是什么?我猜想,除了我之外,每个人都很清楚这一点,但您不能只从测试目录运行python test_antigravity.py,因为它的import antigravity将失败,因为模块不在路径上。
我知道我可以修改PYTHONPATH和其他与搜索路径相关的技巧,但我不敢相信这是最简单的方法--如果您是开发人员,但如果用户只想检查测试是否通过,那么期望他们使用它是没问题的。
另一种选择是将测试文件复制到另一个目录中,但这似乎有点愚蠢,而且它忽略了首先将它们放在单独的目录中的意义。
那么,如果您刚刚下载了我的新项目的源代码,您将如何运行单元测试?我更喜欢让我对我的用户说的答案:“运行单元测试做X。”
发布于 2014-06-17 14:49:19
在我看来,最好的解决方案是使用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标志进行更改):
$ 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包中的所有test模块。
发布于 2009-12-13 20:40:58
用户最简单的解决方案是提供一个可执行脚本(runtests.py或其他类似的脚本),它引导必要的测试环境,包括在需要时将根目录临时添加到sys.path。这不需要用户设置环境变量,在引导脚本中,类似这样的操作很好:
import sys, os
sys.path.insert(0, os.path.dirname(__file__))然后,您对用户的说明就可以像"python runtests.py“一样简单。
当然,如果您真正需要的路径是os.path.dirname(__file__),那么根本不需要将它添加到sys.path中;Python总是将当前正在运行的脚本的目录放在sys.path的开头,因此根据目录结构的不同,只需将runtests.py定位在正确的位置就可以了。
此外,Python 2.7+中的单元测试模块 (支持Python2.6和更早版本的unittest2 )现在已经内置了测试发现,因此如果您想要自动测试发现,就不再需要鼻子了:用户指令可以像python -m unittest discover一样简单。
发布于 2020-01-14 11:15:05
我也有同样的问题有很长时间了。我最近选择的是以下目录结构:
project_path
├── Makefile
├── src
│ ├── script_1.py
│ ├── script_2.py
│ └── script_3.py
└── tests
├── __init__.py
├── test_script_1.py
├── test_script_2.py
└── test_script_3.py在测试文件夹的__init__.py脚本中,我编写了以下内容:
import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
PROJECT_PATH,"src"
)
sys.path.append(SOURCE_PATH)共享项目的超级重要的是Makefile,因为它强制正确地运行脚本。下面是我在Makefile中输入的命令:
run_tests:
python -m unittest discover .Makefile非常重要,不仅因为它运行的命令,而且还因为它从哪里运行它。如果您要在测试中进行cd并执行python -m unittest discover .,它将无法工作,因为unit_tests中的init脚本调用了os.getcwd(),这将指向不正确的绝对路径(该路径将被附加到sys.path中,您将丢失源文件夹)。这些脚本将在发现查找所有测试后运行,但它们无法正常运行。所以Makefile的存在是为了避免记住这个问题。
我非常喜欢这种方法,因为我不需要触摸src文件夹、单元测试或环境变量,一切都会顺利运行。
https://stackoverflow.com/questions/1896918
复制相似问题