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

如何阻止Pytest执行非测试Python文件?解决导入触发主代码运行问题

问题原因与解决方法

为什么py1.py的代码会被执行?

这不是Pytest的问题,是Python的模块导入机制导致的:

  • 当你的测试文件test_py1.py里写了from py1 import create_table时,Python会先完整执行py1.py里的所有顶级代码(也就是不在函数、类或者if __name__ == "__main__"块里的代码),之后才会把create_table函数导入到测试文件中。
  • 你在py1.py里直接调用了create_table(),这行代码属于顶级代码,所以导入模块时就会被触发执行,自动创建表。
  • Pytest确实只运行文件名带test的文件,但测试文件依赖的模块会被Python正常加载,加载过程中的代码执行是Python的默认行为,和Pytest无关。

解决方法

把py1.py里直接调用create_table的代码放到if __name__ == "__main__"判断块里:

修改前的py1.py(有问题的写法):

import sqlite3

def create_table():
    conn = sqlite3.connect('test.db')
    cursor = conn.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS my_temp_table (id INT)')
    conn.commit()
    conn.close()

# 顶级代码,导入时会执行
create_table()

修改后的py1.py:

import sqlite3

def create_table():
    conn = sqlite3.connect('test.db')
    cursor = conn.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS my_temp_table (id INT)')
    conn.commit()
    conn.close()

# 只有直接运行py1.py时才执行这段代码,被导入时不会触发
if __name__ == "__main__":
    create_table()

这样修改后,只有你直接运行python py1.py时才会自动建表;测试文件导入py1.py时,只会加载create_table函数,不会主动执行建表操作,你可以在测试用例里按需调用这个函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:07:12