如何仅用单个终端检测localhost应用响应并实现自动化测试
问题原因
你遇到ConnectionRefusedError报错的核心原因有两点:
- 执行
flask run &将服务放到后台运行后,没有等待Flask完成初始化、开始监听5000端口,就立刻执行了客户端请求脚本。Flask启动本身需要几百毫秒到1秒的加载时间,这时候端口还没对外提供服务,请求发过去自然会被拒绝。 - 原脚本没有做进程收尾,测试跑完后台Flask进程会一直残留占用端口,下次执行容易出现端口冲突;另外目录切换的逻辑没有和后续命令做执行结果绑定,容易出现路径不匹配的问题。
修正后的自动化方案
直接替换你原来的Makefile内容即可,新增了端口就绪等待、异常场景下的进程清理逻辑,执行make check_app就能完成单终端下从启动服务、发请求、比对结果到清理资源的全流程:
.ONESHELL: SHELL := /bin/bash check_app: # 提前清理占用5000端口的残留进程 @fuser -k 5000/tcp 2>/dev/null || true # 后台启动Flask,临时存储启动日志 @flask run > flask_temp.log 2>&1 & @FLASK_PID=$$! # 轮询等待5000端口就绪,最长等待10秒 @for i in {1..50}; do nc -z 127.0.0.1 5000 && break sleep 0.2 done # 切换到客户端目录发起请求,存储返回结果 @cd ../sender @python main.py > received.txt # 比对返回结果和预期结果 @diff received.txt expected.txt @TEST_EXIT=$$? # 切回原工作目录,清理后台进程和临时文件 @cd - >/dev/null @kill $$FLASK_PID @rm -f flask_temp.log # 透传比对结果作为make命令的退出码,比对失败时make会返回非0值 @exit $$TEST_EXIT
如果你的系统没有预装
nc(netcat)工具,不需要额外安装,把端口等待的轮询逻辑替换成下面的Python原生实现即可,兼容所有装了Python3的环境:@for i in {1..50}; do python -c "import socket;s=socket.socket();s.settimeout(0.2);s.connect(('127.0.0.1',5000))" 2>/dev/null && break sleep 0.2 done
额外说明
- 轮询等待端口的逻辑是解决连接被拒绝的核心:后台启动进程后不能默认服务已经就绪,必须确认端口开始监听后再发请求。
- 脚本里特意保存了Flask进程的PID,无论测试成功还是失败,最后都会杀掉后台进程、删除临时日志文件,不会留下残留进程影响下次测试。
- 如果不想用Makefile封装,把上面的逻辑直接复制成shell脚本执行,效果完全一致。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

