尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何为一个CLI爬虫写可靠的测试?http-status-check 的 Node 模拟服务器 + PHPUnit 测试方案全解

如何为一个CLI爬虫写可靠的测试?http-status-check 的 Node 模拟服务器 + PHPUnit 测试方案全解 如何为一个CLI爬虫写可靠的测试http-status-check 的 Node 模拟服务器 PHPUnit 测试方案全解【免费下载链接】http-status-checkCLI tool to crawl a website and check HTTP status codes项目地址: https://gitcode.com/gh_mirrors/ht/http-status-checkhttp-status-check 是一款 PHP 编写的 CLI 爬虫工具负责爬取网站并检查每个链接的 HTTP 状态码。为这样的 CLI 爬虫工具写测试最大的难题是它必须对着一个真实网站才能跑。本文完整拆解该项目如何用 Node 模拟服务器 PHPUnit 的组合写出快、稳、可重复的爬虫测试方案。痛点为什么真实网站不适合做爬虫测试 爬虫工具天然依赖外部网络环境直接拿真实网站做测试会遇到一连串麻烦内容不可控目标网站随时改版链接说变就变测试随之失效结果不可预期状态码、页面结构都可能发生变化断言无法写死速度慢且不稳定受网络延迟影响偶发超时会污染测试结果覆盖不全想测重定向、404 死链、外部链接得祈祷真实网站恰好有。解决思路只有一句话自己造一个网站。它跑在本地、响应固定、行为 100% 可预测——这就是 tests/server/server.js 里那个 Node 模拟服务器的职责。方案总览一个模拟网站 一套测试用例整个测试架构非常轻核心就三块┌──────────────────────┐ ┌─────────────────────────────┐ │ Node 模拟服务器 │ HTTP │ PHPUnit 测试用例 │ │ tests/server/server.js│◄──────│ tests/ScanCommandTest.php │ │ 端口 8080 │ │ 调用真实 CLI 入口 scan 命令 │ └──────────────────────┘ └─────────────────────────────┘组件文件作用模拟网站tests/server/server.js用 Express 搭建行为固定的假站点测试用例tests/ScanCommandTest.php5 个覆盖核心场景的 PHPUnit 用例测试配置phpunit.xml.dist指定测试目录与自动加载CLI 入口http-status-check测试直接调用它保证测的是用户真实入口如何设计一张可预测的模拟网站 打开 tests/server/server.js你会发现这个网站的路由设计得非常讲究——每一条路径都在刻意覆盖一类 HTTP 场景路径行为覆盖的测试场景/返回指向/link1、/link2、/link4及一个mailto:邮件链接的页面首页解析、非 HTTP 链接/link1200内含指向 example.com 的外部链接外部链接爬取/link2200链接到/link3二级链接发现/link3200内含指向/notExists的死链404 断链 found on 溯源/link4302 重定向到/link1重定向识别/redirectToNotFound302 重定向到不存在的/notExists2重定向链最终落到 404这张小小的链接地图把 200、302、404、外部链接、非 HTTP 链接五种情况一网打尽。测试网站的设计原则是让每个路由都是一个考题而不是照抄真实网站。模拟服务器启动与测试运行步骤 准备两个终端即可。第一个终端启动模拟网站cd tests/server npm install node server.js第二个终端在项目根目录运行 PHPUnitvendor/bin/phpunit如果你想在 CI 里一条命令搞定项目还提供了 tests/server/start_server.sh它会先执行npm install再以后台方式node server.js 拉起模拟服务。PHPUnit 五种测试用例全解析 tests/ScanCommandTest.php 里只有 5 个测试方法却覆盖了scan命令的全部关键行为用例 1完整爬取一个站点it_can_scan_a_site 通过exec()直接执行真实 CLI 入口把控制台输出重定向到临时文件然后逐行断言5 个 200、1 个 302、1 个 404并且 404 那行带有found on 哪个页面的溯源信息。用例 2只爬站内链接it_can_scan_only_internal_links 加上-x参数验证爬虫不会跟着 example.com 跑出去——注意它的断言里 200 数量从 5 变成了 4这正是该选项生效的证明。用例 3重定向链落到 404it_can_follow_redirect_to_not_found 只扫/redirectToNotFound这一个入口断言输出里同时出现 302 和 404验证 CrawlLogger 里对重定向历史的拆解逻辑。用例 4错误链接写入输出文件it_can_write_urls_with_errors_to_an_output_file 使用--output选项后用assertFileEquals把生成的文件与 tests/fixtures/output.txt 逐字节对比——fixture 文件让文件写入这种副作用断言变得精确且可回归。用例 5交互式确认框的行为it_removes_output_file_on_overwrite 是最见功力的一条当输出文件已存在时命令会弹出Overwrite it? (y/n)确认见 src/ScanCommand.php。测试没有绕过它而是用 Symfony 的CommandTester进程内执行命令并通过setInputs([y])模拟用户敲下y连续执行两次验证覆盖逻辑结果与 tests/fixtures/overwrite.txt 对比。 这里体现了双管齐下的测试姿势exec()走黑盒验证用户在终端里看到什么CommandTester走白盒验证需要交互输入的内部流程。控制台输出断言技巧把日志当测试数据 CLI 程序没有返回值可供断言输出本身就是产品。该项目的做法很实用输出落地setUp()里先建好临时日志文件tests/ScanCommandTest.phpexec()时用把整段控制台输出重定向进去精确保次辅助方法 appearsInConsoleOutput 用substr_count断言每行文本恰好出现 1 次——既防漏行也防重复行爬虫最容易出的 bug 就是同一链接重复输出摘要断言对 CrawlLogger 打印的 Crawled N url(s) with statuscode X 汇总行做断言一次性校验统计口径是否正确。新手必看的清单给 CLI 爬虫写测试 从这个项目中可以带走 5 条通用经验✅Mock 优于真实永远不要依赖外网做测试本地模拟服务器的成本极低收益巨大✅先设计考题地图路由即场景让模拟站点覆盖 200 / 302 / 404 / 外链 / 非 HTTP 链接等全部分支✅测真实入口用exec()跑用户实际执行的命令行而不是只测内部函数✅交互逻辑用 CommandTester 模拟输入确认框、选项问答都能被稳定测试✅副作用用 fixture 对比文件写入、覆盖行为用逐字节比较杜绝含糊断言。这套Node 模拟网站 PHPUnit 双姿势断言的方案代码量极少却覆盖完整是任何需要对着 HTTP 服务干活的 CLI 工具都值得参考的测试模板。【免费下载链接】http-status-checkCLI tool to crawl a website and check HTTP status codes项目地址: https://gitcode.com/gh_mirrors/ht/http-status-check创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表