没有参数的Pytest有错误的工作目录

时间:2018-06-08 17:56:25

标签: python directory pytest

我试图使用pytest来自动化我的测试过程。我有几个文件'值得测试用例(test_methodA.pytest_methodB.py等)在名为test的文件夹中,它本身位于我项目的顶级目录中。这些测试都在包含在单个文件中的程序上运行 - program.py。此program.py文件也位于顶级目录中,配置文件confs的文件夹需要正常运行。

当我使用我的一个测试文件的参数从顶级目录运行pytest时:

$ pytest test/test_methodA.py

程序正常运行并通过测试。但是,如果我只是运行没有参数的pytest:

$ pytest

我的所有测试都失败了,因为我的程序的初始化方法在尝试访问配置文件时会抛出FileNotFoundError

我已经尝试过这种行为,并确定使用错误的工作目录(项目顶层目录上一级目录)的直接原因是pytest。例如,如果我这样做

$ cd test
$ pytest

所有测试都能正常运行。我还通过将其中一个测试打印到控制台os.getcwd()来确认这一点。

项目中没有涉及的目录包含__init__.py文件,我发现这个问题的大多数搜索结果都是关注的。这个问题会有什么其他原因?

1 个答案:

答案 0 :(得分:0)

打开文件时,您的问题是使用相对路径:

open('file/path.yml', 'r')

将解析您正在执行代码的目录的路径。这意味着从另一个目录运行program.py将导致FileNotFoundError,因为脚本将在错误的目录中查找配置文件。您可以通过更改目录并尝试运行脚本来轻松测试:

$ cd /tmp
$ python /path/to/program.py
Traceback (most recent call last):
  File "/path/to/program.py", line 1, in <module>
    with open('file/path.yaml') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'path/file.yaml'

您可以通过构建相对于program.py脚本的路径来解决这个问题(__file__是正在执行的python文件的名称):

import os

parent_dir = os.path.dirname(__file__)
file = os.path.join(parent_dir, 'file', 'path.yaml')
with open(file, 'r') as fp:
    ...

如果使用Python 3.4或更高版本,使用pathlib可以更加优雅地使用路径解析:

# program.py
import pathlib

parent_dir = pathlib.Path(__file__).parent
file = parent_dir / 'file' / 'path.yaml'

with file.open('r') as fp:
    ...