背景信息
Apache APISIX 是 Apache 软件基金会下的云原生 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布(金丝雀发布)、服务熔断、身份认证、可观测性等丰富的流量管理功能。你可以使用 APISIX 来处理传统的南北向流量,也可以处理服务间的东西向流量。同时,它也支持作为 K8s Ingress Controller 来使用。
通常情况下,想要保证软件正常运行,在软件上线前我们一般会使用各种技术和方法,通过手动或自动的方式对软件的功能进行检查以确保其运行正常。该操作我们称之为 QA(测试)。测试一般分为单元测试、E2E 测试以及混沌测试。
单元测试是用来检查单一模块的正确性(比如检查某个 RPC 的序列化/反序列化、数据加解密是否正常),但是该测试缺乏对系统的全局视角。而 E2E 测试(即端到端测试),可以补足单元测试的不足,该测试将整个系统和外部依赖服务跑起来,通过真实的软件调用方式检查本系统与其他系统的集成情况;混沌测试则通过在系统各组件间制造突发情况,如 OOM Kill、网络中断等,测试整个系统错误错误的容忍程度与能力。APISIX 的测试更加偏向于 E2E 测试,保证自身功能和与其他系统集成的正确性。
APISIX 测试案例简介
APISIX 作为全球最活跃的 API 网关,其稳定性及服务的健壮性需要得到一定的保障,那么如何避免 APISIX 中潜在的错误呢?这里就需要通过测试用例来实现了。
测试脚本并不仅仅是一个被测试机器执行的程序文件,对于开发者来讲,可以通过测试脚本完成软件所有功能的测试,包括不同配置、不同输入参数等情况下程序的运行状况。而对于用户来说测试提供了某一个功能模块的具体使用示例,例如:程序可以接受的配置和输入,想要得到怎样的输出结果。用户在参考使用文档时遇到不懂的地方,完全可以参考现有的测试用例,寻找是否有类似的使用场景。
在 APISIX 项目中,通常使用 Github Action 运行 CI 测试,执行下图展示的测试脚本。许多 APISIX 的开发者在编写测试用例时,会遇到各种各样的问题。希望通过本文,可以减少你在编写 APISIX 测试案例时出现的错误。
编写测试案例
APISIX的测试用例基于 Test::NGINX
测试框架编写,该测试框架是在 Perl 语言基础上实现的测试环境,可以提供基于脚本的自动化测试能力,为 APISIX 当前如此大规模的测试与质量保证工作提供了支持。当然你不会使用 Perl 也没有关系,因为大部分场景中是不需要编写 Perl 代码的,仅使用 TEST::NGINX
封装的能力即可,如果有特殊需求可以结合 Lua 代码的方式进行增强。
APISIX 的测试用例均存放在 ./apisix/t
目录下面,接下来将以添加 opa
插件为例为你介绍如何编写测试案例。
-
你需要创建一个
.t
结尾的测试文件,例如./t/plugin/opa.t
。如果你是在已有功能上添加特性,可以直接在对应的测试文件中添加测试用例。并在文件中添加固定格式的 ASF 2.0 协议。 -
该部分主要作用是给
opa.t
这个文件中所有的测试用例自动添加no_error_log
,这样就不需要在每个代码下添加error_log
相关的代码了,你可以直接复制使用这段代码。通过这种方式,可以减少一些重复的代码。
add_block_preprocessor(sub {
my ($block) = @_;
if ((!defined $block->error_log) &a