6

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

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

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

4

2 回答 2

2

也许您正在寻找的是pkg_resourcespkgutil。例如,如果您的 python 源中有一个名为“resources”的模块,您可以使用以下命令读取您的“resourcefile”:

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 文件时,后者甚至可以工作。前者无需从鸡蛋中提取资源即可工作。

请注意,创建源的子目录不会使其成为模块。为了 pkg_resources 和 pkgutil 的目的,您需要添加一个__init__.py在目录中命名的文件,以使其作为模块可见。__init__.py可以为空。

于 2014-07-01T08:07:44.367 回答
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 上存在的第一个文件的完整路径。

于 2013-04-11T00:56:52.060 回答