Python unittest无法发现测试用例:多目录项目测试执行失败求助
解决unittest发现0个测试用例的问题
你执行python3 -m unittest discover后显示Ran 0 tests in 0.000s,是因为默认扫描规则没找到你的测试文件,或者测试模块无法被正确导入,下面是具体解决方法:
项目结构回顾
. ├── src │ └── arithmetics.py └── test └── lcm ├── __init__.py ├── test_lcm_exception.py └── test_lcm.py
核心原因
unittest discover默认从当前目录递归查找以test_开头的.py文件,但它不会自动识别test目录下的子目录lcm;同时测试文件里导入src.arithmetics需要项目根目录在Python路径中,否则会出现模块找不到的错误。
解决方案
1. 正确指定扫描目录
在项目根目录下执行以下命令,明确告诉discover从test目录开始扫描测试文件:
python3 -m unittest discover -s test -p "test_*.py"
参数说明:
-s test:指定扫描的根目录为test-p "test_*.py":指定匹配测试文件的模式(默认规则就是这个,加上后更明确)
2. 解决模块导入问题
如果执行上述命令后出现ModuleNotFoundError: No module named 'src',需要把项目根目录加入Python路径:
- 临时设置环境变量(终端中执行):
export PYTHONPATH=$(pwd)
之后再重新执行测试命令。
- 或者在测试文件开头添加代码,动态添加路径:
import sys from pathlib import Path # 把项目根目录加入Python路径 sys.path.append(str(Path(__file__).parent.parent.parent))
3. 直接运行单个测试文件(快速验证)
如果想快速验证某个测试文件,可直接指定模块路径:
# 运行test_lcm.py的测试 python3 -m unittest test.lcm.test_lcm # 运行test_lcm_exception.py的测试 python3 -m unittest test.lcm.test_lcm_exception
额外测试代码问题提醒
你的测试用例里还有几个逻辑错误,会导致测试失败:
- 测试
lcm(0,0)和lcm(X,0)时,这些调用会触发ZeroDivisionError,不能直接用self.assertTrue(0 == lcm(0,0)),应该用异常断言:
self.assertRaises(ZeroDivisionError, lcm, 0, 0)
lcm_faulty函数逻辑存在问题,比如lcm_faulty(1,1)会返回0而非1,对应的测试断言self.assertTrue(X == lcm_faulty(X,X))会失败,需要修正函数或测试逻辑。
内容的提问来源于stack exchange,提问作者user20666094
相关产品推荐
相关产品推荐

