如何阻止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
相关产品推荐
相关产品推荐

