概述
Test::Nginx 是一个基于 Perl 的 Nginx 测试框架,由 OpenResty 团队开发和维护,是 OpenResty 生态系统中最核心的测试工具。
什么是 Test::Nginx
Test::Nginx::Socket 是一个用于自动化测试 Nginx C 模块、Nginx 配置以及 OpenResty/Lua 相关模块的测试框架。它以数据驱动(data-driven)的方式编写测试用例,将测试的输入、配置和预期输出都声明在测试文件的 __DATA__ 段中。
该框架会自动完成以下工作:
- 根据测试用例生成完整的
nginx.conf配置文件 - 启动一个临时的 Nginx 服务器实例
- 向该实例发送 HTTP 请求
- 检查响应状态码、响应头、响应体
- 检查错误日志内容
- 测试完成后自动关闭并清理 Nginx 实例
它是 OpenResty 自身(包含 80+ 子项目,共计 600,000+ 行测试代码)的核心测试基础设施。
为什么使用 Test::Nginx
相比其他 Nginx 测试方法,Test::Nginx 具有以下优势:
声明式测试:你只需要描述"做什么"和"期望什么",而不需要写大量的过程式代码。每个测试块都是自描述的。
完整的生命周期管理:框架自动处理 Nginx 的启动、配置生成、请求发送、日志检查、进程关闭等全部流程。
内置 Mock 服务器:支持 TCP/UDP mock 服务器,无需依赖外部服务即可测试代理和上游交互。
强大的断言系统:支持精确匹配、正则匹配、日志检查、错误码检查等多种断言方式。
与 Perl TAP 生态集成:基于 Perl 的 TAP (Test Anything Protocol) 协议,可以与 prove 等标准工具无缝配合。
模块体系
Test::Nginx 包含多个子模块:
| 模块 | 用途 |
|---|---|
| Test::Nginx::Socket | 最常用的核心模块,基于 socket 进行 HTTP 通信 |
| Test::Nginx::Socket::Lua | 针对 OpenResty Lua 模块的扩展测试类 |
| Test::Nginx::Socket::Lua::Stream | 针对 stream 模块的 Lua 测试 |
| Test::Nginx::Socket::Lua::Dgram | 针对 UDP/dgram 的 Lua 测试 |
大多数情况下你只需要使用 Test::Nginx::Socket::Lua,它继承了 Test::Nginx::Socket 的所有功能并添加了 Lua 相关的测试支持。
perl
1use Test::Nginx::Socket::Lua;23# 或者直接使用基础模块4use Test::Nginx::Socket 'no_plan';