You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pytest不执行test/__init__.py文件的原因及解决方法

问题原因与解决方案:pytest不执行test/init.py导致测试数据找不到

问题原因

我之前也碰到过类似的问题,核心差异在于PyCharm和pytest加载测试目录的机制不一样:

  • 当你用PyCharm右键点击test目录运行测试时,PyCharm会把这个目录当作标准Python包加载,此时包内的__init__.py会被自动执行,你的路径配置代码也就生效了,自然能找到测试数据文件。
  • 但用python -m pytest lib/test命令运行时,pytest的模块发现逻辑是直接扫描目录下的测试文件(比如test_*.py),不会主动执行目录下的__init__.py——除非你的测试文件显式导入了这个文件里的内容。这就导致你的sys.path没有被更新,最终触发FileNotFoundError。

解决方案

这里有几个实用的解决办法,你可以根据项目情况选择:

1. 把路径配置移到conftest.py中(推荐)

pytest会自动加载测试目录下的conftest.py文件,不管你有没有显式导入。你可以把路径配置代码放到test目录下的conftest.py里:

import os
import sys

SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))))
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, "test_data_files")))

这样不管用哪种方式运行pytest,这段代码都会被执行,路径问题直接解决。

2. 在测试文件中显式触发__init__.py执行

如果不想改动太多结构,你可以在每个测试文件的开头添加导入语句,强制触发__init__.py的执行:

from mylib.test import *  # 哪怕只导入空内容,只要能触发文件执行就行

不过这种方式需要每个测试文件都加导入,适合测试文件数量较少的场景。

3. 直接在测试文件中计算数据文件路径

其实可以完全不依赖sys.path修改,直接通过__file__定位测试数据的绝对路径,这种方式更可靠,也避免了路径污染:

import os

# 获取当前测试文件所在目录的绝对路径
test_file_dir = os.path.dirname(os.path.abspath(__file__))
# 拼接测试数据目录的路径
test_data_dir = os.path.join(test_file_dir, "test_data_files")

# 之后直接用这个路径访问文件,比如:
with open(os.path.join(test_data_dir, "sample_data.txt"), "r") as f:
    content = f.read()

这种方式不需要依赖__init__.py或conftest.py,每个测试文件自己管理路径,灵活且不容易出问题。

内容的提问来源于stack exchange,提问作者LinearLeopard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:20:36