openresty可通过lua完全接管响应生成以实现mock测试:在location中匹配路径,依请求方法、参数、header等条件启用mock;用cjson.safe构造json响应,设置状态码与header;支持随机延迟、多场景切换、数据驱动及ci集成。

OpenResty 可以用 content_by_lua_block 或 content_by_lua_file 完全接管响应生成,无需调用真实后端,直接返回预设的 JSON、状态码、Header 和延迟,实现轻量、可配置、可复用的 Mock 测试能力。
定义 Mock 规则并拦截请求
在 location 中匹配测试路径(如 /mock/api/users),用 Lua 判断请求方法、参数、Header 等条件,决定是否启用 Mock:
- 用
ngx.var.request_method区分 GET/POST - 用
ngx.req.get_uri_args()或ngx.req.get_post_args()提取参数 - 用
ngx.var.http_x_mock_mode == "on"控制开关,避免影响生产流量 - 支持按 query 参数(如
?env=staging)或 Header(如X-Test-Mode: true)动态启用
构造结构化 Mock 响应
使用 cjson.safe 生成标准 JSON,配合 ngx.status 和 ngx.header 设置完整 HTTP 响应:
-
ngx.status = 200或404、503等模拟不同业务状态 ngx.header["Content-Type"] = "application/json"- 响应体可硬编码,也可从 Lua 表动态组装,例如:
local data = { code = 0, data = { id = 123, name = "mock-user" } } - 支持随机延迟(
ngx.sleep(0.1))模拟慢接口,验证前端超时逻辑
支持多场景切换与数据驱动
把 Mock 数据抽离为独立 Lua 模块(如 mock_data.lua),按场景名索引:
- 模块中定义
scenes = { success = {...}, error_401 = {...}, timeout = {...} } - 请求中通过
?scene=error_401或 HeaderX-Mock-Scene指定场景 - 结合
ngx.var.arg_scene查找并返回对应数据,避免重复写死逻辑 - 支持简单模板替换,比如将
"{{timestamp}}"替换为ngx.time()
集成到测试流程中
Mock 不仅用于开发联调,还可嵌入自动化测试链路:
- 在 CI 阶段启动 OpenResty 实例,加载 Mock 配置,作为被测服务的依赖桩
- 配合 curl 或 pytest 调用
http://localhost:8080/mock/xxx,断言响应字段和状态码 - 用
log_by_lua_block记录每次 Mock 请求的路径、scene、耗时,辅助问题定位 - 禁用
lua_code_cache on(仅测试环境)便于热更新 Mock 数据,无需 reload Nginx











