我查看了pytest网站上的文档,但没有找到使用“测试资源”的明确示例,例如在单元测试期间读取固定文件。类似于http://jlorenzen.blogspot.com/2007/06/proper-way-to-access-file-resources-in.html对Java描述的内容。
例如,如果我在源代码管理中签入了yaml文件,那么编写从该文件加载的测试的正确方法是什么?我认为这可以归结为理解在python等效的类路径(PYTHONPATH?)上访问'资源文件'的正确方法。
这似乎应该很简单。有一个简单的解决方案吗?
答案 0 :(得分:2)
您所寻找的可能是 pkg_resources 或 pkgutil 。例如,如果你的python源代码中有一个名为" resources"的模块,你可以阅读你的"资源文件"使用:
with open(pkg_resources.resource_filename("resources", "resourcefile")) as infile:
for line in infile:
print(line)
或:
with tempfile.TemporaryFile() as outfile:
outfile.write(pkgutil.get_data("resources", "resourcefile"))
后者甚至适用于你的"脚本"是一个可执行的zip文件。前者的工作无需从鸡蛋中取出资源。
请注意,创建源的子目录不会使其成为模块。您需要在目录中添加名为__init__.py
的文件,以便将其作为模块显示,以用于pkg_resources和pkgutil。 __init__.py
可以为空。
答案 1 :(得分:1)
我认为“资源文件”是你在python中给它的任何定义(在Java中,资源文件可以捆绑到带有普通Java类的jar文件中,Java提供库函数来访问这些信息)。
一个等效的解决方案可能是访问PYTHONPATH环境变量,将“资源文件”定义为相对路径,然后拖动PYTHONPATH查找它。这是一个例子:
pythonpath = os.env['PYTHONPATH']
file_relative_path = os.path.join('subdir', 'resourcefile') // e.g. subdir/resourcefile
for dir in pythonpath.split(os.pathsep):
resource_path = os.path.join(dir, file_relative_path)
if os.path.exists(resource_path):
return resource_path
此代码段返回PYTHONPATH上存在的第一个文件的完整路径。