pytest测试中如何正确定位测试目录下的文件路径?
pytest测试文件中正确定位数据文件的方法
目录结构
tests/my_test1.py tests/input/data.txt tests/bench/bench.csv
问题描述
测试文件my_test1.py需要读取tests/input/data.txt,但直接用./input/data.txt这类相对路径会失效——因为pytest支持多种调用方式,当前工作目录会随调用方式变化,导致相对路径找不到文件。之前尝试通过os.getenv('PYTEST_CURRENT_TEST')推导路径,结果不管从何处调用,该环境变量返回的路径始终是tests/,无法准确定位数据文件。
正确的解决方法
方法一:利用测试文件的__file__属性构建绝对路径
__file__会返回当前测试文件的绝对路径,不受工作目录影响,是最可靠的方式:
import os # 获取当前测试文件所在的目录绝对路径 test_file_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接得到data.txt的绝对路径 data_file_path = os.path.join(test_file_dir, "input", "data.txt") # 读取文件 with open(data_file_path, "r") as f: data_content = f.read() # 后续测试逻辑
方法二:通过pytest的pytestconfig fixture获取项目根目录
如果你的项目根目录是包含tests文件夹的上级目录,可以用pytestconfig fixture拿到项目根目录,再拼接数据文件路径:
def test_read_data(pytestconfig): # 获取pytest识别的项目根目录 project_root = pytestconfig.rootdir # 拼接数据文件路径 data_file_path = os.path.join(project_root, "tests", "input", "data.txt") with open(data_file_path, "r") as f: data_content = f.read() # 测试断言或处理逻辑
为什么之前的方法不可行
- 相对路径依赖当前工作目录,而pytest可以从项目根、
tests目录甚至其他子目录启动,工作目录随时变化,导致路径失效。 PYTEST_CURRENT_TEST环境变量的作用是标记当前正在运行的测试用例信息,并非用于获取文件系统路径,所以无法用来推导数据文件的位置。
内容的提问来源于stack exchange,提问作者Rajesh Kazhankodath
相关产品推荐
相关产品推荐

