Test::Nginx 使用
https://github.com/openresty/test-nginx
https://openresty.gitbooks.io/programming-openresty/content/testing/test-nginx.html
Test::Nginx 使用 Perl 便携的 nginx 测试组件
安装
1 | cpan Test::Nginx |
测试布局
按照惯例,会在项目的根目录创建一个 t/
的目录来作为测试文件的目录. 当有很多测试文件时,可以在 t/
中进一步的分组 ,比如 t/001-test/
本质上每个 .t 文件都是一个 Perl 脚本文件 ,可以使用 Prove (perl 的通用测试工具)来运行
比如 prove t/001.t
测试文件布局
这里有一个简单的例子
1 | use Test::Nginx::Socket 'no_plan'; |
测试文件通常以 .t 作为扩展名 ,每个测试文件本身就是一个 Perl 脚本.
每个测试文件分为两个部分,两个部分使用 __DATA__
来分隔
- 第一部分是简短的 Perl 代码
1 | # 调用对应的测试模块 一般使用 'no_plan' 即可 |
- 第二部分是测试用例
测试用例格式 https://openresty.gitbooks.io/programming-openresty/content/testing/test-file-layout.html
数据块通过三个横线来设置某种数据块,比如如下的四种类型:
1 | --- config |
数据块的过滤器
在类型后可以跟一个和多个过滤器
1 | # chomp : 去掉换行符 |
运行
Test::Nginx 依赖 Perl 的 prove 命令来运行测试用例.
运行时 Test::Nginx 会调用 nginx 服务器和 socket 客户端来运行测试,它会自动在系统环境的 Path 中找到 nginx . 所有需要在环境中指定 nginx 的程序路径
1 | export PATH=/usr/local/openresty/nginx/sbin:$PATH |
可以在程序的根目录添加一个 go.sh 的文件
1 | #!/usr/bin/env bash |
然后使用这个脚本来做测试 ,比如测试 t/aa.t 这个文件.
1 | $ ./go.sh t/aa.t |
可以通过 -v 的选项来生成详细的测试报告
prove -v t/aa.t
运行多个文件
prove -v t/foo.t t/bar.t t/baz.t
通配符运行多个文件
prove -v t/*.t
递归运行目录 -r
prove -r t/
测试单个用例,只需要在用例中为单个用例添加 --- ONLY
测试文件运行的顺序
测试文件通常按照字母顺序运行, 可以通过在测试文件名前面添加数字序列来控制运行的顺序. 例如
1 | t/000-sanity.t |
虽然 Prove 可以通过 -jN 来支持作业并行运行,但是 Test::Nginx 并真正不支持这种模式.
测试块运行的顺序
测试块会打乱每个文件中的测试块 ,可以通过加入 no_shuffle()
来禁用这种行为
1 | use Test::Nginx::Socket 'no_plan'; |
测试组件
Test::Nginx::Socket::Lua
用于 ngx_lua 相关的测试框架
https://metacpan.org/pod/Test%3A%3ANginx%3A%3ASocket%3A%3ALua
通过环境变了 TEST_NGINX_INIT_BY_LUA 导入 ngx_lua module
1 | export TEST_NGINX_INIT_BY_LUA="package.path = '$PWD/../lua-resty-core/lib/?.lua;' .. (package.path or '') require 'resty.core'" |
example
1 | use Test::Nginx::Socket::Lua; |
Test::Nginx::Socket::Lua::Stream
测试 stream
example
1 | stream { |
Test::Nginx::Socket::Lua::Dgram
测试 upd stream
example
1 | stream { |