pytest测试会话完成后不终止,导致Jenkins任务无法结束求助
pytest测试会话在Jenkins中无法终止的排查与解决方法
我之前也碰到过类似的情况:本地跑pytest测试明明显示全部通过,但Jenkins任务就是卡着不往下走,核心原因就是测试进程没正常退出。结合你的场景,给你几个实用的排查和解决方向:
1. 优先排查导入的外部模块(最可能的原因)
你代码里加了sys.path.append('../../bindings/python'),这个目录下的代码很可能是“元凶”——比如里面有后台线程、子进程没被正确关闭,或者打开了网络连接、文件句柄这类资源没释放,导致pytest进程无法正常退出。
解决方法:
- 检查
../../bindings/python下的代码,找到所有创建线程/子进程、打开资源的地方,确保有对应的关闭/终止逻辑。 - 在测试中添加会话级的清理逻辑,比如用pytest的自动 fixture 来做全局清理:
import pytest import sys sys.path.append('../../bindings/python') # 假设你导入的模块是custom_bindings,需要调用它的清理方法 from custom_bindings import release_all_resources # 这个fixture会在整个测试会话结束后自动执行 @pytest.fixture(scope="session", autouse=True) def cleanup_after_session(): yield # 先执行所有测试 # 在这里添加资源清理代码 release_all_resources() class TestControl(): def test_sanity_check(self): """ Basic Test """ assert (True)
2. 检查Jenkins的执行环境差异
本地你用了sudo执行命令,但Jenkins默认是用jenkins用户运行任务的,权限差异可能导致某些资源无法正常释放。
可以试试:
- 去掉命令里的
sudo,确保jenkins用户有访问测试文件和绑定模块的权限; - 如果必须用sudo,在Jenkins任务里配置允许该用户免密执行python命令(修改
/etc/sudoers文件,添加jenkins ALL=(ALL) NOPASSWD: /usr/bin/python3)。
3. 调试pytest的执行细节
如果上面的方法都没效果,打开pytest的详细日志来定位问题:
python3 -m pytest -v -s --debug test_control.py::TestControl::test_sanity_check
查看输出里有没有异常的资源占用、线程未终止的提示。另外,也可以在Jenkins服务器上用ps aux | grep pytest查看进程状态,看看有没有子进程还在运行。
4. 临时应急方案(不推荐长期用)
如果暂时找不到根本原因,可以用timeout命令强制终止进程,保证Jenkins任务能继续:
timeout 15s python3 -m pytest -s test_control.py::TestControl::test_sanity_check
这个命令会在15秒后强制杀死pytest进程,避免Jenkins任务卡住,但还是建议尽快找到资源泄漏的根源。
内容的提问来源于stack exchange,提问作者Troski
相关产品推荐
相关产品推荐

