如何使用pytest测试资源(如固定的yaml文件)?

时间:2013-04-11 00:35:32

标签: python testing pytest

我查看了pytest网站上的文档,但没有找到使用“测试资源”的明确示例,例如在单元测试期间读取固定文件。类似于http://jlorenzen.blogspot.com/2007/06/proper-way-to-access-file-resources-in.html对Java描述的内容。

例如,如果我在源代码管理中签入了yaml文件,那么编写从该文件加载的测试的正确方法是什么?我认为这可以归结为理解在python等效的类路径(PYTHONPATH?)上访问'资源文件'的正确方法。

这似乎应该很简单。有一个简单的解决方案吗?

2 个答案:

答案 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上存在的第一个文件的完整路径。