使用Dockerfile构建镜像后运行pytest无测试用例检测到的问题排查
你好,我来帮你排查一下这个问题。从你的描述和配置来看,主要可能是这几个原因导致pytest没检测到测试用例,咱们一个个来梳理:
测试文件/函数的命名不符合pytest默认规则
pytest默认只会识别命名符合test_*.py或者*_test.py的文件,而且文件内的测试函数也需要以test_开头。你当前的测试文件是test.py,这个文件名是符合规则的,但如果里面的测试函数没有用test_前缀(比如写成了mytest_demo()),那pytest会判定没有可执行的测试用例。建议先检查下test.py里的函数命名是否符合要求。pytest运行时未指定明确的测试路径
虽然你把工作目录设为了/app,但部分场景下pytest可能不会自动递归扫描子目录(或者镜像内的pytest默认配置有差异)。你可以尝试把CMD命令改成明确指定测试目录的形式,同时加上-v参数查看详细日志:CMD python -m pytest test/ -v这样能直观看到pytest是否扫描到了
test/test.py文件,以及有没有识别到里面的测试用例。文件复制的路径是否正确
你的Dockerfile里用COPY main /app,理论上会把main目录下的所有内容(包括src、test文件夹)复制到/app目录下,但你可以在构建镜像时加一步验证,确认文件结构是否正确:COPY main /app RUN ls -la /app构建过程中就能看到
/app下是否存在test文件夹及里面的test.py了。另外也可以把复制命令改成COPY ./main/ /app/,明确复制目录内的内容(你的写法本身没问题,但末尾加斜杠在部分场景下会更清晰)。容器内文件权限问题
有时候复制到容器里的文件可能没有可读权限,导致pytest无法读取测试文件。你可以在COPY之后添加权限设置:COPY main /app RUN chmod -R 755 /app确保容器内的用户能够正常访问这些文件。
另外,你也可以先在本地环境做个验证:在项目根目录(和Dockerfile同目录)下运行python -m pytest main/test/,看看能不能正常检测到测试用例。如果本地能正常运行,那问题大概率出在容器内的配置或文件复制环节;如果本地也不行,那就是测试文件本身的命名或内容不符合pytest规则。
备注:内容来源于stack exchange,提问作者Alexis Kan

