OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

26 | 代码贡献者的拦路虎:test::nginx 简介

作业题
断言风格的测试框架 busted
自动化测试
resty
运行测试案例集
Clone 最新源码
安装 test::nginx
Perl 包管理器 cpanminus
DSL
数据驱动
Perl
高门槛
测试框架
fuzz 测试
mock 测试
性能测试
集成测试
单元测试
持续集成
测试案例
好口碑
质量稳定
写在最后
编写自己的测试案例
安装和示例
test::nginx
持续集成
自动化测试
70 个开源项目
OpenResty
测试驱动开发(TDD)
作者:温铭
标题:代码贡献者的拦路虎:test::nginx
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是温铭。
测试,是软件开发中必不可少的一个重要环节。测试驱动开发(TDD)的理念已经深入人心,几乎每家软件公司都有 QA 团队来负责测试的工作。
测试也是 OpenResty 质量稳定和好口碑的基石,不过同时,它也是 OpenResty 众多开源项目中最被人忽视的部分。很多开发者每天都在使用 lua-nginx-module,偶尔跑一跑火焰图,但有几个人会去运行测试案例呢?甚至很多基于 OpenResty 的开源项目,都是没有测试案例的。但没有测试案例和持续集成的开源项目,显然是不值得信赖的。
不过,和商业公司不同的是,大部分的开源项目都没有专职的测试工程师,那么它们是如何来保证代码质量的呢?答案很简单,就是“自动化测试”和“持续集成”,关键点在于自动和持续,而 OpenResty 在这两个方面都做到了极致。
OpenResty 有 70 个开源项目,它们的单元测试、集成测试、性能测试、mock 测试、fuzz 测试等工作量,是无法靠社区的人力解决的。所以,OpenResty 一开始在自动化测试上的投入就比较大。这样做短期看起来会拖慢项目进度,但可以说是一劳永逸,长期来看在这方面的投入是非常划算的。因此,每当我和其他工程师聊起 OpenResty 在测试方面的思路和工具集时,他们都会惊叹不已。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

OpenResty的测试体系中的核心是`test::nginx`,这是一个高门槛的测试框架,与一般的测试框架不同。它不基于断言,也不使用Lua语言。`test::nginx`的安装和示例,以及如何编写自己的测试案例都在文章中有所介绍。通过对参数和环境变量的控制,`test::nginx`可以实现乱序执行、多次重复、内存泄漏检测、压力测试等不同的效果。该测试框架的DSL提高了测试逻辑的清晰度和扩展性,但也提高了学习门槛。文章强调了`test::nginx`的重要性,指出它是OpenResty代码贡献者的拦路虎。文章内容深入浅出,适合读者快速了解OpenResty的测试体系及`test::nginx`的特点。 虽然`test::nginx`强大,但并不一定适合所有场景。在OpenResty中,读者也可以选择使用断言风格的测试框架`busted`。`busted`结合`resty`命令行工具,也可以满足不少测试的需求。最后,读者被鼓励在本地运行memcached的测试,并新增一个测试案例。欢迎读者记录操作和心得,分享给更多对OpenResty感兴趣的人,一起交流和探讨。 总之,本文介绍了OpenResty的测试体系及`test::nginx`的特点,同时提到了其他可选的测试框架`busted`,并鼓励读者参与测试案例的运行和分享。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • K1
    最近开始学习Perl了,因为在复杂一点的测试案例中,需要在DATA前做一些事情,而又不得不使用perl;虽然已经抽象成数据驱动了,但是还是有很多细节涉及到perl语法,对于从未接触过perl的人来说,因为一些细节问题,会耽误很长时间。 test::nginx确实是门槛,是代码贡献者和二次开发者们的门槛。

    作者回复: 嗯,perl 的语法真不是一般人能够适应的,需要一个明显的学习曲线

    2019-07-24
    1
  • J.Smile
    ./resty -e 'local memcached = require "resty.memcached" > local memc, err = memcached:new() > > memc:set_timeout(1000) > local ok, err = memc:connect("127.0.0.1", 11212) > local ok, err = memc:set("dog", 32) > if not ok then > ngx.say("failed to set dog: ", err) > return > end > > local res, flags, err = memc:get("dog") > ngx.say("dog: ", res)' -----执行结果是: failed to set dog: closed

    作者回复: 你可以在这一行的后面判断下 err: local ok, err = memc:connect("127.0.0.1", 11212) 可能是 memcached 的服务没有启动。

    2019-08-09
  • HelloBug
    老师,DSL的翻译应该是领域专用语言?搜领域小语言没有搜到,搜到了这个DSL(Domain Specific Language)https://en.wikipedia.org/wiki/Domain-specific_language

    作者回复: 是的,就是领域专用语言。之所以叫它小语言,是因为它不是通用的编程语言,只在特定领域内使用。

    2019-07-27
  • HelloBug
    问个可能很白痴的问题,如果环境里安装了好几个不同版本或者不同编译参数的nginx,怎么配置test::nginx使用指定的的nginx呢?在执行的时候,发现默认使用的是一个不支持stream的nginx,然后看prove 提供的参数也没有,感觉是在.t文件里指定,请老师指点一下~

    作者回复: 是从系统的 PATH 里面查找 nginx 的路径的

    2019-07-27
  • 冰沁宇诺
    上面的案例,还有github文档中mysql 的例子中set_timeout通常都是设置成1秒,但是并发大的情况下经常会出现超时的情况,一般怎么评估自己工程中timeout应该设置成多少

    作者回复: 这个是看具体的场景了,比如统计 MySQL 的日志,看看请求时间的分布情况。如果 MySQL 的慢查询比较多,很多超过 1 秒的,那这个时候更好的方案是去优化数据库。

    2019-07-24
  • 刘丹
    请问执行完git clone后,是否要执行以下命令来安装test::nginx? cd test-nginx perl Makefile.PL make sudo make install

    作者回复: 并非如何,你可以参考一些开源项目的 travis 的做法: 1. 先通过包管理器安装: sudo cpanm --notest Test::Nginx >build.log 2>&1 || (cat build.log && exit 1) https://github.com/iresty/apisix/blob/master/.travis/linux_runner.sh#L20 2. git clone 最新的 test::nginx: https://github.com/iresty/apisix/blob/master/.travis/linux_runner.sh#L35 3. 用 prove 命令的时候,把 test nginx 的目录包含进去: prove -Itest-nginx/lib -r t

    2019-07-24
  • Geek_584aa7
    请问,怎么修改一些非nginx的标准配置呢?也是用config吗?
    2022-06-18
  • 三叶虫tlb
    测试报错 Can't determine section names. Need two sections in first block at t/01-memd.t line 0. END failed--call queue aborted. # Looks like your test exited with 3 just after 3. 看了下报错提示和文档 改为:use Test::Nginx::Socket::Lua::Stream 'no_plan'; 或:use Test::Nginx::Socket::Lua::Stream tests => 3; 测试通过
    2021-04-08
  • fangminyu
    老师 我一直有如下错误: prove -Itest-nginx/lib -r t/mem_server.t t/mem_server.t .. nginx: [alert] could not open error log file: open() "/usr/local/var/log/nginx/error.log" failed (13: Permission denied) t/mem_server.t .. 1/? Can't determine section names. Need two sections in first block at t/mem_server.t line 0. END failed--call queue aborted. # Looks like your test exited with 3 just after 3. t/mem_server.t .. Dubious, test returned 3 (wstat 768, 0x300) All 3 subtests passed Test Summary Report ------------------- t/mem_server.t (Wstat: 768 Tests: 3 Failed: 0) Non-zero exit status: 3 Files=1, Tests=3, 0 wallclock secs ( 0.02 usr 0.01 sys + 0.12 cusr 0.04 csys = 0.19 CPU) Result: FAIL 请问如何解决?实在没办法了。。。。
    2020-02-20
  • undefined   
    #!/usr/bin/env bash export PATH=/usr/local/openresty/nginx/sbin/nginx:$PATH # 部分系统perl环境会提示(Can't locate t/.pm in @INC) export PERL5LIB=$(pwd):$PERL5LIB exec prove "$@"
    2020-01-07
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部