使用通配符*执行pytest tests/*时测试模块重复收集执行的问题
问题分析与解决
你遇到的问题根源是shell路径展开导致pytest重复识别测试模块:
当执行pytest tests/*时,shell会将*通配符展开为tests目录下的所有文件/子目录(比如tests/__init__.py、tests/TestEndToEndDemo.py)。pytest在处理这些参数时,会同时做两件事:
- 把
tests/当作一个Python包(因为存在__init__.py),递归扫描并导入tests.TestEndToEndDemo模块 - 把单独的
tests/TestEndToEndDemo.py当作独立模块导入
这就导致同一个测试模块被加载了两次,里面的测试用例自然执行两次。
解决方法
1. 直接指定tests目录而非通配符
用pytest tests/替代pytest tests/*,pytest会将tests目录作为一个完整的包来处理,递归扫描所有测试模块,不会出现重复收集的问题。
2. 避免shell展开的影响(可选)
如果一定要用通配符,给路径加引号让pytest自己处理通配符:
pytest "tests/*"
这样pytest会自己解析通配符,而不是让shell提前展开,就能避免重复识别。
额外说明
你的测试模块里的@staticmethod测试用例和@pytest.fixture不是问题根源——毕竟直接指定单个文件时测试正常执行。核心问题还是路径参数的传递方式导致的重复模块导入。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

