使用 httptest 测试 Echo 路由 handler 时,需通过 echo.New().NewContext() 构造上下文,配合 httptest.NewRequest() 和 httptest.NewRecorder() 模拟请求与响应,手动设置路由参数(如 c.SetParamNames/Values)和上下文值(如 c.Set),最后断言 rec.Code 和 rec.Body.String()。

怎么用 httptest 测试 Echo 路由 handler
直接 mock 请求,不启动真实 HTTP 服务,是 Echo 单元测试最轻量、最可控的方式。核心依赖 net/http/httptest 和 Echo 自带的 echo.New() 实例。
关键点在于:handler 函数本身不依赖全局 server 实例,只接收 echo.Context;测试时用 echo.New().NewContext() 构造上下文,再用 httptest.NewRequest() 和 httptest.NewRecorder() 模拟输入输出。
- 必须显式调用
c.Request().URL.Path或c.Param("id")前先设置路由参数(如用c.SetParamNames("id")+c.SetParamValues("123")) - 如果 handler 内部用了
c.Get("user")这类中间件注入的值,测试前得手动c.Set("user", mockUser) - 别忘了检查
rec.Code(HTTP 状态码)和rec.Body.String()(响应体),而不是只看是否 panic
示例片段:
func TestGetFileHandler(t *testing.T) {
e := echo.New()
req := httptest.NewRequest(http.MethodGet, "/api/v1/files/123", nil)
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
c.SetParamNames("id")
c.SetParamValues("123")
<pre class="brush:php;toolbar:false;">if assert.NoError(t, getFileHandler(c)) {
assert.Equal(t, http.StatusOK, rec.Code)
assert.Contains(t, rec.Body.String(), `"id":"123"`)
}}
接口自动化测试该从哪几步跑起来
不是先写框架,而是先确认「这个接口现在能不能通」——这是所有自动化落地的前提。跳过这步,后面写的全是空中楼阁。
真实执行顺序就是:发请求 → 看状态码 → 解析响应体 → 校验字段 → 记录日志。工具只是把这四步封装得更稳、更可复用。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 用
requests发请求时,timeout必须设(比如(3, 7)),否则网络卡住会拖垮整个测试集 - 响应体校验优先用
response.json().get("code") == 0,而不是正则匹配字符串,避免字段顺序或空格干扰 - 敏感字段(如 token、password)绝对不能硬编码在 YAML/Excel 里,应通过环境变量或密钥管理服务注入
- 每次运行前清掉旧的
allure-results/目录,否则历史失败用例会污染新报告
为什么 route/v1/samba_test.go 当前是待修复状态
查了 CasaOS 代码库,这个文件报错的核心原因是:测试用例里直接 new 了一个未初始化的 sambaService 实例,而它依赖的 sqlite.DB 是 nil,导致调用 .CreateShare() 时 panic。
这不是测试写得不对,是被测代码没做依赖隔离——handler 里 new 了 service,service 又 new 了 db,整条链路无法 mock。
- 修复方向不是给测试加 try-catch,而是改
sambaHandler函数签名,把*samba.Service作为参数传入(依赖注入) - 单元测试里就可以传一个带 mock 方法的
mockSambaService{},完全绕过真实 DB - 对应地,
service/samba.go的构造函数要暴露出来,不能只在main()里隐式初始化
没走这一步,所有基于该 handler 的测试都会脆弱且难维护。
Pytest + Requests 工程里 conftest.py 干了什么
它不是装饰器集合,而是整个测试生命周期的“控制台”。真正起作用的是三块逻辑:fixture 注册、日志接管、失败快照。
比如 @pytest.fixture(autouse=True) 修饰的 init_logger(),会在每个测试函数执行前自动初始化 logger,并把 level 设为 INFO;而 after_scenario 钩子会在用例失败时自动调用 screenshot_on_failure(),把当前请求/响应 dump 到 logs/ 下。
- 所有 fixture 默认 scope="function",意味着每个 test_* 函数都拿到全新实例,避免状态污染
- 日志文件名带
%(asctime)s_%(name)s.log,能区分test_postman_api.py和test_health_check.py的输出 - 截图函数里用的是
requests.Session()的history属性,不是 Selenium,所以轻量但只能记录重定向链,不抓页面 DOM
这些细节不写进 conftest.py,后续加日志级别切换、失败重试、环境标记,就得每个测试文件重复粘贴。


















