ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SmartDNS 自动化测试指南:3 步搭好本地 CI/CD 流水线

SmartDNS 自动化测试指南:3 步搭好本地 CI/CD 流水线 SmartDNS 自动化测试指南3 步搭好本地 CI/CD 流水线【免费下载链接】smartdnsA local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH, DoQ. 一个本地DNS服务器获取最快的网站IP获得最佳上网体验支持DoHDoTDoQ。项目地址: https://gitcode.com/GitHub_Trending/smar/smartdns最疼的 DNS 事故往往出在最显然的小改动上改了速度检查的一行代码没跑测试就发版当晚全公司的域名解析集体翻车。这篇文章以本地 DNS 服务器 SmartDNS 为例讲 SmartDNS 自动化测试和 SmartDNS CI/CD 流水线怎么落地从写一个速度检查用例到跑通带覆盖率报告的本地流水线。从一条测试到一条流水线理解测试体系先要知道 SmartDNS 在链路里的位置它夹在本地客户端和多台上游服务器之间拿到 A 记录后还要对 IP 做 ICMP/TCP 测速最后把最快的一条返回给客户端。这张架构图把三个角色标得很清楚测试要做的就是把这三个角色全部搬进进程内。test/目录在 Google Test 上搭了一套完整沙箱test/server.h 里的MockServer模拟上游 DNS 服务器按请求逐条回 A 记录Server类还提供MockPing直接指定哪个 IP 的 Ping 耗时多少毫秒。test/client.h 的Client则负责发出真实 DNS 查询、解析 dig 风格的返回。入口在 test/test.cctest/cases/ 下 40 余个用例按功能域分文件每个文件只验证一件事。构建入口 也不复杂通配收集所有.cc用-DTEST编译、链接libgtest同时从src/编出libsmartdns-test.a注意它带DEBUG1这为后面收集覆盖率数据埋好了条件。写出真正验证问题的测试用例编写第一个速度检查用例速度检查最值得写用例因为选最快是 SmartDNS 的立身之本而它的行为依赖两个不可控的外部因素上游返回哪组 IP、网络延迟多大。CI 里这两项必须完全确定这正是上面两个 mock 的分工。以 test-speed-check.cc 里的 fastest_ip 用例为例意图是让上游返回两个 IP、分别指定 Ping 耗时断言被选中的是更快的那个TEST_F(SpeedCheck, fastest_ip) { smartdns::MockServer upstream; // 模拟上游 smartdns::Server server; // 被测的 SmartDNS upstream.Start(udp://0.0.0.0:61053, { if (req-qtype DNS_T_A) { smartdns::MockServer::AddIP(req, req-domain.c_str(), 1.2.3.4); smartdns::MockServer::AddIP(req, req-domain.c_str(), 5.6.7.8); return smartdns::SERVER_REQUEST_OK; } return smartdns::SERVER_REQUEST_SOA; }); // 指定 Ping 耗时100ms 对 110ms server.MockPing(PING_TYPE_ICMP, 1.2.3.4, 60, 100); server.MockPing(PING_TYPE_ICMP, 5.6.7.8, 60, 110); server.Start(R(bind [::]:60053 server 127.0.0.1:61053 speed-check-mode ping dualstack-ip-selection no )); smartdns::Client client; ASSERT_TRUE(client.Query(b.com, 60053)); ASSERT_EQ(client.GetAnswerNum(), 1); EXPECT_EQ(client.GetAnswer()[0].GetData(), 1.2.3.4); }两个细节值得注意。其一首次应答只有一条 IP 且 TTL 为 3这是测速完成前的临时答案等测速结束再查同一域名才能拿到完整 IP 列表断言要区分这两个阶段。其二MockPing绕开了内核的 ICMP 通路测试机网络再抖结果也不会漂。用例覆盖了哪些功能域用例目录按功能域组织不是杂烩功能域测试文件关注点地址解析与映射test-address.cc固定地址、域名映射规则缓存行为test-cache.cc命中、TTL 过期、记录更新客户端规则test-client-rule.cc按来源 IP 分流查询DoH 链路test-https.ccHTTPS 隧道内的握手与查询速度检查test-speed-check.cc最快 IP 选择、降级与回退上游服务器组test-server.cc多服务器轮询与故障切换新增用例时先找最接近的邻居文件照抄它的搭建模式只改配置文本和断言不要重新发明启动与收尾流程。让测试自动跑起来一条脚本串起四个步骤把整条链路写进一个幂等脚本ci-run.sh放在本地克隆的根目录人跑和机器跑走同一条路#!/bin/bash set -e make -C test clean # 清掉旧产物避免脏构建 make -C test test # 构建并跑全部用例 gcovr -r . --html-details --excludetest/ -o coverage.html echo ✅ all cases passed关键是set -e加上脚本退出码的语义make test里任一用例失败就立即中止覆盖率这一步根本不会执行。流水线只看返回值不用去解析日志文本。钩子与定时任务各管一段本地守门把脚本挂进.git/hooks/pre-commit非零返回即挡住提交#!/bin/sh ./ci-run.sh || { echo 提交被拦截用例未通过; exit 1; }环境相关的回归则交给定时任务在固定基线机上每小时跑一轮10 * * * * cd /opt/smartdns ./ci-run.sh ci.log 21两者分工不同钩子拦下确定不能合的改动定时任务捞回只在某些环境挂的问题后者往往只有在固定机器上复现才有价值。怎么证明质量是可靠的用 gcovr 生成覆盖率报告跑完make test只说明该过的都过了不说明没跑过的没风险。Makefile 里的libsmartdns-test.a是带DEBUG1编出来的具备插桩条件跑完用例后执行gcovr -r . --html-details --excludetest/ -o coverage.html浏览器打开生成的 coverage.html逐文件看命中率未覆盖行会被直接标出来。用法上别追求数字好看主路径已有用例兜底重点盯speed_check、缓存这类目录里没被踩到的分支它们就是下一批用例的优先级清单。性能基准与运行监控性能测试有专门入口test/cases/test-perf.cc 用dnsperf打流量机器上没装这个命令就GTEST_SKIP()性能用例是可选依赖不会拖垮整个套件。写 QPS 基准的核心是先定门槛再断言// 吞吐用例的核心记录总查询数与耗时算 QPS 后断言 double qps total_queries * 1000.0 / elapsed_ms; std::cout throughput: qps qps std::endl; EXPECT_GT(qps, 1000);门槛值比如 1000 QPS必须在基线机上先实测标定写死进用例否则每次 CI 都是在掷骰子。长时间压测期间可以挂上 plugin/smartdns-ui/Rust 实现的 Web 监控插件实时核对 QPS、缓存命中率、平均查询时长是否符合预期容易踩的坑固定端口冲突用例里写死了 60053、61053 这类端口同一台机器上两个 test.bin 并行必撞上一个用例崩溃留下的残留进程还会占住端口让下一个用例绑定失败。共享 CI 机上让任务串行跑或者错开端口段。容器里 ICMP 未必可用CI 容器经常没有原始套接字权限Ping 类用例会静默走降级逻辑。仓库里现有用例已经用IsICMPAvailable()做了分支自己加用例时同样别写依赖 ICMP 的硬断言。时间断言最易抖动在慢机器上断言响应小于 20ms迟早出事。阈值留 3 到 5 倍余量或改成相对断言比如首次应答比命中缓存的应答慢不要贴着极限卡。三步上手第一步取代码git clone https://gitcode.com/GitHub_Trending/smar/smartdns cd smartdns第二步装好 gtest跑通全量套件cd test make test第三步从 test/cases/ 拷一个用例做模板改配置文本和断言加上自己的用例然后把ci-run.sh挂进 pre-commit。到这里测试不过就不能合从口号变成了机制。这套流水线的价值不在用例数量而在每次改动合入前都过一遍固定的确定性验证MockServer 钉死了上游行为覆盖率指出了没测的地方性能基线记录着每一次回归。下一次小改动再来的时候你敢直接提交坏了也知道坏在哪。如果你在其他 DNS 项目的 CI 实践里踩过不一样的坑欢迎在评论区聊聊。【免费下载链接】smartdnsA local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH, DoQ. 一个本地DNS服务器获取最快的网站IP获得最佳上网体验支持DoHDoTDoQ。项目地址: https://gitcode.com/GitHub_Trending/smar/smartdns创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表