ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SmartDNS 自动化测试落地指南:从 make test 到提交级 CI 的完整实操

SmartDNS 自动化测试落地指南:从 make test 到提交级 CI 的完整实操 SmartDNS 自动化测试落地指南从 make test 到提交级 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假设你刚改完 src/dns_server/cache.c 里的 TTL 处理逻辑合入之前想确认解析结果没有变坏。手工起服务、发几条查询、翻一遍答案太耗时而且换台机器就没法复现。SmartDNS 的测试体系给出的答案是一条make test命令跑完 test/cases/ 下几十个用例覆盖缓存、规则、DoH、速度检查等模块并且可以挂到提交钩子上变成自动化测试的固定关卡。这篇文章按先跑通、再拆解、后进阶的顺序把这条路径走一遍。先跑起来从 clone 到一次完整测试的最短路径准备环境与克隆仓库跑测试只需要 g、libgtest、OpenSSL 和 dig其余依赖 test/Makefile 会自己探测处理。git clone https://gitcode.com/GitHub_Trending/smar/smartdns cd smartdns make -C test testMakefile 如何完成测试构建test/Makefile 是 SmartDNS 测试框架的枢纽它做的事可以按输入→依赖→产物三步看输入TEST_SOURCES用通配符把 test/ 目录下所有.cc收进来test/cases/ 里每个文件对应一个功能模块缓存、域名规则、DNS64、DoH、性能等。依赖-DTEST宏让核心代码启用测试钩子libsmartdns-test.a由src目录的 Makefile 现编译测试跑的是真实服务代码不是简化副本。产物test.bin链接-lgtest -lssl -lcryptotest目标就是直接执行它clean会连同 src 的构建产物一起清掉保证环境干净。全部通过时输出[ PASSED ]任何一条失败Google Test 会打印断言所在文件与行号可以直接定位到改动点。认识测试框架入口、客户端与 MockServer 的分工入口test.cc 与用例的注册方式test/test.cc 是唯一的程序入口做三件事检查dig是否存在Client底层用它发查询缺失会直接报错退出、InitGoogleTest初始化框架、RUN_ALL_TESTS()执行所有注册过的TEST_F用例。两个协作角色Server 与 MockServer用例真正在用的类只有两个都定义在 test/server.hServer把一段配置字符串或临时配置文件喂给 fork 出来的 smartdns 进程起一个真实运行的本地服务另有MockPing方法可给指定 IP 注入虚拟的 ICMP/TCP 探测时延不需要真实网络。MockServer扮演上游 DNS 服务器你传入回调函数决定它对每个查询返回什么 A/AAAA 记录返回值SERVER_REQUEST_OK或SERVER_REQUEST_SOA控制应答类型。而 test/client.h 的Client负责从客户端一侧发起真实查询Query(domain, port)发请求GetAnswerNum()、GetAnswer()[i].GetData()、GetStatus()、GetQueryTime()用来逐项断言。入口、双端模拟、真实查询三者拼成一个封闭回路。拆一个真实用例速度检查的测试是怎么写出来的MockServer、MockPing 与 Client 的三层关系速度检查是 SmartDNS 的核心能力之一同一域名解析出多个 IP 时用探测挑出最快的返回。test/cases/test-speed-check.cc 里的fastest_ip用例完整演示了这个决策的验证过程TEST_F(SpeedCheck, fastest_ip) { smartdns::MockServer server_upstream; smartdns::Server server; // 模拟上游对 b.com 返回两条 A 记录 server_upstream.Start(udp://0.0.0.0:61053, { if (request-qtype DNS_T_A) { smartdns::MockServer::AddIP(request, b.com, 1.2.3.4); smartdns::MockServer::AddIP(request, b.com, 5.6.7.8); return smartdns::SERVER_REQUEST_OK; } return smartdns::SERVER_REQUEST_SOA; }); // 给两个 IP 注入不同的虚拟 ICMP 时延 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); }从断言反推被测行为这个用例的断言链值得逐行读第一次查询只应返回一条记录且是 1.2.3.4——速度检查尚未完成时服务先把最快的候选以短 TTL3 秒返回避免用户等探测跑完。用例随后usleep(220 * 1000)再查一次此时期望两条记录都出现TTL 回到上游给的 600 秒——探测完成后按完整结果返回。非 A 查询走SERVER_REQUEST_SOA返回 SOA等价于 NXDOMAIN 场景用来验证错误路径。同一个文件里还有约十个用例覆盖speed-check-mode none/ping/tcp:80、domain-rules /b.com/ -c ping按域名覆盖、ICMP 不可用时回退 TCP、最佳 IP 不可达时换上游等分支。写用例时的习惯是断言精确到每条记录的 TTL、名称、数据而不是只看有没有应答。把测试挂到提交上本地 CI 的三种触发方式仓库本身没有附带流水线配置持续集成需要自己搭。核心动作只有一个构建并执行test.bin触发时机任选。方式一pre-commit 钩子在.git/hooks/pre-commit里执行make -C test clean make -C test test非零退出码会直接阻止本次提交这是最严格的本地关卡适合单人长期开发。方式二独立脚本把清理、构建、执行、覆盖率生成gcovr输出 HTML 报告写进一个脚本手动或按需调用好处是可以在同一条命令里加失败标记便于贴进评审记录。#!/bin/bash set -e make -C test clean make -C test test gcovr -r . --html -o coverage.html --excludetest/方式三cron 定时任务多人协作或想巡检主干时用 crontab 每天固定时间执行该脚本日志追加到ci.log。三种方式可以叠加钩子管提交、脚本管按需、定时任务管兜底。再往前一步TDD、性能基线与可视化监控用 TDD 驱动一个新规则流程就是红-绿-重构先在test/cases/新增断言例如给某类域名配置-c none规则后查询应返回全部原始记录、TTL 保持 600跑make test确认失败再改src里的实现直到通过。参考 test/cases/test-speed-check.cc 中domain_rules_none用例的断言粒度即可。给性能建一条基线test/cases/test-perf.cc 与 test/cases/test-stress.cc 是现成起点。可以在用例里做多线程并发查询用EXPECT_GT给 QPS 设门槛每次改动后记录耗时作为回归对比的基线。用 smartdns-ui 做可视化监控plugin/smartdns-ui/ 是 Rust 实现的 Web 管理界面插件调试测试时打开它能实时看到查询统计、上游服务器健康状态与缓存命中率比对纯文本断言更直观。下一步可以做什么装好 gtest、OpenSSL、dig执行make -C test test跑通第一次全量用例确认环境无遗漏。针对你改过的模块src/dns_conf/或src/dns_server/在 test/cases/ 中找到同名文件补一条回归用例。用 pre-commit 钩子把make test挂到本地提交上让失败的用例无法合入。跑一次全量用例记录各 suite 耗时作为后续性能基线的参照。【免费下载链接】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),仅供参考
返回列表