YAOTU INSIGHTS

SmartDNS 本地自动化测试与 CI/CD 实操:从跑通测试到让每次提交自动过测

SmartDNS 本地自动化测试与 CI/CD 实操:从跑通测试到让每次提交自动过测
SmartDNS 本地自动化测试与 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你刚改了一行解析逻辑想确认它没把现有查询功能弄坏。这个项目的测试套件就是为这种时刻准备的SmartDNS 是一个本地 DNS 服务核心工作是给域名挑最快的 IP。整套自动化测试基于 Google Test测试代码全部放在 test/cases/ 下四十多个.cc文件覆盖了地址映射、缓存、规则等常见路径。下面四步从第一次跑通到让每次提交自动过测。阶段一一条命令把测试跑起来先克隆到本地git clone https://gitcode.com/GitHub_Trending/smar/smartdns cd smartdns/test依赖只要两件C 工具链和 gtest另外dig命令必须装着test/test.cc 的 main 函数开头会检查缺了直接退出。然后一条命令构建并执行全部用例make test它背后做三件事test/Makefile 里-j$(nproc)用满 CPU 核数先调 src/ 编译出libsmartdns-test.a静态库再链接出test.bin并直接执行。全部通过时每个用例一行[ PASSED ]末尾给出汇总数字。想只跑某个用例加 gtest 参数即可./test.bin --gtest_filterSpeedCheck.*跑过一次后它跑通了这件事就落地了。后面每个阶段都建立在这个基线上。阶段二看懂一个用例到底在测什么以 test/cases/test-speed-check.cc 里的SpeedCheck为例它模拟了什么server.MockPing(PING_TYPE_ICMP, 1.2.3.4, 60, 100); server.MockPing(PING_TYPE_ICMP, 5.6.7.8, 60, 150); server.Start(R(bind [::]:60053 server 127.0.0.1:61053 speed-check-mode none domain-rules /b.com/ -c ping ));上游是一个MockServer假进程对b.com固定回两个 IPMockPing给它们各贴一个假的 ICMP 延迟100 毫秒对 150 毫秒配置串则起一个真实 smartdns 子进程-c ping让b.com走 ping 检查。它断言了什么client.Query(b.com, 60053)之后应答区只有 1 条记录ASSERT_EQ(client.GetAnswerNum(), 1)且这条就是1.2.3.4TTL 是 3 秒。也就是说慢的那个 IP 被丢掉了。为什么这样写速度选择这个功能只依赖谁延迟小不需要真发 ICMP 包所以把延迟 mock 成两个不同的数字行为就确定可断言。这也是整个套件的模式——上游用 MockServer被测对象用真进程客户端用 test/client.h 里的 Client 收包。其余用例可按主题速查address 用例管固定地址映射cache 管缓存命中domain-rule 管按域名走不同解析路径test/cases/test-perf.cc 用dnsperf工具灌 10 万个随机域名压测吞吐量没有 dnsperf 就自动跳过。阶段三把测试接进提交动作自动化触发的时机就一个你敲git commit的那一刻。仓库里没有现成钩子自己加一个。把下面的内容写进克隆目录的.git/hooks/pre-commit只动你本地的钩子不碰仓库文件#!/bin/sh set -e make -C test clean make -C test test提交之后发生的事按时序排git 先调起钩子clean清掉旧的目标文件和test.binmake 重新编译并跑完全部用例全绿git 才落盘这次提交任何一个用例红提交当场中止你的 diff 还在工作区里直接回去改。这样回归在你按回车之前就被拦住了。不想每次提交都等全量也可以换成定时跑在 crontab 里加一行每小时把结果追加到日志10 * * * * cd /path/to/smartdns/test make test /tmp/smartdns-ci.log 21本地调试时Web 管理界面能看到实时查询数和缓存命中率配合测试输出对照排查。阶段四让测试结果可信全绿不等于可信两个维度补上。覆盖率编译时加 gcov 插桩测试结束后用 gcovr把编译器插桩数据汇总成覆盖率报告的命令行工具出 HTML 报告make -C src CFLAGS-O0 -fprofile-arcs -ftest-coverage LDFLAGS-lgcov clean make -C test CXXFLAGS-O0 -fprofile-arcs -ftest-coverage test gcovr -r . -e test/ --html -o coverage.html浏览器打开coverage.html重点看你刚改的文件改动行覆盖率为 0说明没有用例走到这段逻辑得补用例再谈合并。性能基线test/cases/test-perf.cc 跑完后 dnsperf 会输出Queries per second把这个数按日期存进一个本地 txt 文件每次改动后对比吞吐量比基线掉 10% 以上先怀疑自己的改动而不是测试波动查清楚再提交。两个标准都是可量化的绿勾之外多了一道硬门槛。跑通之后下一步可以试试在 test/cases/ 下照着SpeedCheck的骨架写一个自己的用例把域名换成你自己的断言返回你配置的固定 IP。用例本身会告诉你配置写对没有。【免费下载链接】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),仅供参考