pytest的fixtures允许测试函数/方法轻松地从本地文件系统检索测试资源。
pytest-datadir-ng的Python项目详细描述
pytest的datadir-ng插件提供了datadir 以及datadir_copyfixtures,它们允许测试函数轻松访问资源 在数据目录中。它的灵感来源于pytest-datadir plugin,并且是有意的 是一个更灵活的插件版本(因此名字中的“NG”部分) 在“下一代”中)。
此插件提供两个固定装置:
- datadirfixture允许测试函数和方法访问 所谓的“数据目录”。
- datadir_copy夹具类似于datadir夹具,但它复制 首先向临时目录请求资源,以便测试功能或 方法可以在不影响其他测试功能的情况下修改它们在磁盘上的资源 和方法。
安装
只要做:
pip install pytest-datadir-ng
datadir设备
“datadir”fixture允许测试函数和方法访问 所谓的“数据目录”。
这个装置的工作原理就像一本字典。当前,仅使用 d[key]语法受支持。像迭代器,len(d)等都不是。
fixture如何查找资源最好用一个例子来描述。 我们假设您的测试使用以下目录结构:
tests/ +-- test_one.py +-- test_two.py +-- data/ | +-- global.dat +-- test_one/ | +-- test_func/ | +-- data.txt +-- test_two/ +-- TestClass/ +-- test_method/ +-- strings.prop
文件test_one.py包含以下函数:
deftest_func(datadir):data_path=datadir["data.txt"]# ...
文件test_two.py包含以下类:
classTestClass(object):deftest_method(self,datadir):strings_path=datadir["strings.prop"]# ...
当test_func()函数请求data.txt资源时, 在以下目录中搜索名为data.txt的文件或目录, 按此顺序:
- tests/test_one/test_func/
- tests/test_one/
- tests/data/test_one/test_func/
- tests/data/test_one/
- tests/data/
第一个现有文件(或目录)的路径作为一个返回 py.path.local对象。在这种情况下,返回的路径将是 tests/test_one/test_func/data.txt。
当test_method()方法请求strings.prop资源时, 在以下目录中搜索具有以下名称的文件或目录 strings.prop,按以下顺序:
- tests/test_two/TestClass/test_method/
- tests/test_two/TestClass/
- tests/test_two/
- tests/data/test_two/TestClass/test_method/
- tests/data/test_two/TestClass/
- tests/data/test_two/
- tests/data/
这里,这将返回路径 tests/test_two/TestClass/test_method/strings.prop。
如您所见,如果 method而不是function请求资源。这样你就可以 如果愿意,可以根据测试类的名称加载不同的资源。
最后,如果测试函数或测试方法需要名为 global.dat,则结果路径为tests/data/global.dat 因为在搜索的目录层次结构中没有其他目录包含 名为global.dat的文件。换句话说,tests/data/目录 是全局(或回退)资源的位置。
如果在搜索目录的any中找不到资源,则 引发键错误。
数据目录复制设备
“datadir_copy”fixture类似于datadirfixture,但是将请求的资源复制到 首先是临时目录,以便测试函数或方法可以在不影响 其他测试功能和方法。
每个测试函数或方法都有自己的临时目录,因此有自己的资源的新副本 请求。
caveat:每次使用字典符号请求资源时,都会生成该资源的新副本。 如果一个测试函数或方法多次请求同一资源,也会出现这种情况。因此,如果您修改 资源并需要稍后访问资源的修改版,将其路径保存在变量中并使用 以后访问资源而不是多次使用字典符号的变量:
deftest_foo(datadir_copy):# This creates the initial fresh copy of data.txt and saves# its path in the variable "resource1".resource1=datadir_copy["data.txt"]# ...modify resource1 on-disk...# You now want to access the modified version of data.txt.# WRONG way: This will overwrite your modified version of the# resource with a fresh copy!fh=datadir_copy["data.txt"].open("rb")# CORRECT way: This will let you access the modified version# of the resource.fh=resource1.open("rb")
版本历史记录
版本1.1.0
- 在data/下允许每个测试目录(谢谢,alexander lukanin)。
版本1.0.1
- 添加了这个Version history部分。:-)
- 修复了代码示例中py.path.local对象的错误用法。
版本1.0.0
- 初始版本