You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用单个终端检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:24:15