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

为何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把它当成测试用例跑了,而是模块导入时的正常执行行为。

解决方案

给你几个可行的解决办法:

  1. 规范脚本写法(推荐)
    把create_expectations.py里的执行代码放到if __name__ == "__main__":代码块中,示例:
# create_expectations.py
def create_expectations():
    # 你的逻辑代码
    pass

# 只有直接运行脚本时才执行
if __name__ == "__main__":
    create_expectations()

这样即使pytest导入这个模块,也不会触发执行逻辑。

  1. 让pytest忽略setup目录
    在项目根目录创建pytest.ini配置文件,添加以下内容:
[pytest]
norecursedirs = tests/setup

或者每次运行pytest时添加忽略参数:

pytest --ignore=tests/setup

这样pytest会完全跳过setup目录,不会导入里面的任何模块。

  1. 调整目录结构
    既然setup目录里的脚本是独立的初始化工具,根本不属于测试代码,直接把它移出tests文件夹,放到项目根目录或者单独的scripts目录下,从根源避免被pytest扫描到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:27:43