为何pytest执行测试目录中非测试脚本?如何阻止?
pytest意外执行非测试脚本的排查与解决
问题场景
你的项目结构如下:
proj - src - tests - setup create_expectations.py __init__.py test_1.py test_2.py ...
运行pytest时,发现create_expectations.py里的代码被执行了,但你确认这个脚本没被其他文件导入,只是个一次性运行的独立脚本。而且用pytest --collect-only检查时,显示只收集了名称含test的文件,符合预期。
原因分析
pytest的测试收集逻辑确实只会把名称以test_开头(或_test结尾)的文件当作测试用例,但它在收集测试的过程中,会导入所有能找到的Python模块(包括tests目录下的非测试模块)。如果create_expectations.py里的代码没有用if __name__ == "__main__":包裹,那么当pytest导入这个模块时,里面的顶级代码就会自动执行——这不是pytest把它当成测试用例跑了,而是模块导入时的正常执行行为。
解决方案
给你几个可行的解决办法:
- 规范脚本写法(推荐)
把create_expectations.py里的执行代码放到if __name__ == "__main__":代码块中,示例:
# create_expectations.py def create_expectations(): # 你的逻辑代码 pass # 只有直接运行脚本时才执行 if __name__ == "__main__": create_expectations()
这样即使pytest导入这个模块,也不会触发执行逻辑。
- 让pytest忽略setup目录
在项目根目录创建pytest.ini配置文件,添加以下内容:
[pytest] norecursedirs = tests/setup
或者每次运行pytest时添加忽略参数:
pytest --ignore=tests/setup
这样pytest会完全跳过setup目录,不会导入里面的任何模块。
- 调整目录结构
既然setup目录里的脚本是独立的初始化工具,根本不属于测试代码,直接把它移出tests文件夹,放到项目根目录或者单独的scripts目录下,从根源避免被pytest扫描到。
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

