ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Fleet 仓库变更测试实战:基于 git diff 精准运行 Go 与前端测试

Fleet 仓库变更测试实战:基于 git diff 精准运行 Go 与前端测试 Fleet 仓库变更测试实战基于 git diff 精准运行 Go 与前端测试【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet导读Fleet 是 Go 编写的 osquery 设备管理平台后端server/、pkg/、orbit/等 Go 包与前端frontend/下的 React/TypeScript 组件并存完整测试套件体量大、依赖重MySQL、Redis、集成环境。直接全量跑既慢又容易误伤无关代码。本指南围绕仓库内置的test技能见 .claude/skills/test/SKILL.md展开说明如何基于git diff判断变更范围用正确的环境变量运行受影响的 Go 包测试用--testPathPattern精准执行前端组件测试并汇总通过/失败结果。读完你将掌握一套只测改动的高效测试工作流也能理解其中每个环境变量和命令参数的底层含义。一、技能定位为最近的更改跑测试test技能的设计目标非常明确围绕最近的变更而非全仓库。它的核心工作流程是运行git diff和git diff --cached确定哪些文件被修改根据修改文件的归属决定运行 Go 测试、前端测试还是两者都跑若传入参数将其作为测试过滤器Go 的-run或前端的--testPathPattern输出一份摘要哪些包/套件通过、哪些失败、失败详情。技能元数据声明了它的适用环境与工具边界allowed-tools仅包含Bash(go test *)、Bash(MYSQL_TEST*)、Bash(FLEET_INTEGRATION_TESTS_DISABLE_LOG1 *)、Bash(yarn test*)、Bash(npx jest*)、git diff/git status以及 Read/Grep/Glob 类检索工具effort: low表明它应当快速完成而不是长时间跑完整套件。二、判定变更范围git diff 是第一步技能要求通过两条命令确认工作区状态git diff # 未暂存的更改 git diff --cached # 已暂存的更改拿到变更文件列表后按以下规则归类Go 文件进入 Go 测试分支按包位置决定环境变量frontend/下的文件进入前端测试分支找到与被改组件对应的测试文件Go 与前端同时有改动两个分支都要执行。这一先 diff 再定向测试的思路在仓库的工程实践中处处可见例如 Makefile 中的增量 lint 使用--new-from-merge-baseorigin/main只检查相对主干的新增代码与技能只测变更的理念一脉相承。三、Go 测试按包位置选择环境变量3.1 环境变量的选择规则技能给出的判定规则非常简洁变更包位置需要的环境变量原因server/datastore/mysql下MYSQL_TEST1需要真实的 MySQL 数据存储做测试server/service下MYSQL_TEST1 REDIS_TEST1service 层测试同时依赖 MySQL 与 Redis其余包不需要特殊环境变量纯单元测试无外部依赖对应命令形如MYSQL_TEST1 go test ./server/datastore/mysql/... MYSQL_TEST1 REDIS_TEST1 go test ./server/service/... go test ./orbit/pkg/...3.2 为什么必须设置 MYSQL_TEST源码里的跳过逻辑MYSQL_TEST并非装饰性变量它直接决定测试是否执行。在 server/datastore/mysql/mysqltest/mysqltest.go#L471-L474 中可以看到func CreateNamedMySQLDSWithConns(t *testing.T, name string) (*mysql.Datastore, *common_mysql.DBConnections) { if _, ok : os.LookupEnv(MYSQL_TEST); !ok { t.Skip(MySQL tests are disabled) } ... }即不设置MYSQL_TEST1所有需要真实数据库的测试都会被t.Skip跳过看似跑通了实则什么都没测。同样的守卫逻辑也出现在 server/datastore/mysql/testing_utils_test.go#L423。因此凡是改动触及server/datastore/mysql或server/service忘记注入环境变量就等于放弃了全部数据库相关断言。REDIS_TEST同理server/service层的集成测试如实时查询、活动记录、分布式锁相关逻辑需要 Redis 支撑server/service目录下的integration_*.test.go文件即为其典型载体。3.3 底层 go test 命令形态与 Makefile 对齐仓库的 Makefile 中.run-go-tests目标给出了标准的 Go 测试命令形态go test -tags full,fts5,netgo -run${TESTS_TO_RUN} ${GO_TEST_EXTRA_FLAGS} \ -parallel 8 -coverprofilecoverage.txt -covermodeatomic -coverpkg$(COVER_PKG) $(go_test_pkg_to_test)关键参数说明-tags full,fts5,netgoFleet 使用构建标签区分功能集full启用完整功能fts5启用 SQLite FTS5 全文检索用于查询/策略全文搜索netgo使用纯 Go 网络栈-run${TESTS_TO_RUN}技能中的$ARGUMENTS过滤器正是传入此处-parallel 8包内测试并行度为 8。手动复现技能行为时可以直接把环境变量与go test -run组合例如只跑名为TestListVulnerabilities的测试MYSQL_TEST1 go test -tags full,fts5,netgo -run TestListVulnerabilities ./server/datastore/mysql/...3.4 集成测试日志开关FLEET_INTEGRATION_TESTS_DISABLE_LOG技能允许使用的另一个变量是FLEET_INTEGRATION_TESTS_DISABLE_LOG1。它作用于server/service下的集成测试——例如 server/service/integration_enterprise_test.go#L173 与 integration_mdm_test.go#L236 均通过os.Getenv(FLEET_INTEGRATION_TESTS_DISABLE_LOG)判断是否压制服务日志输出。在集成测试全量跑动、日志刷屏时设置该变量可显著降低输出噪音便于定位真实失败。四、前端测试用 testPathPattern 定点打击4.1 定位测试文件前端是 React/TypeScript见 package.json 中react、testing-library/react等依赖。技能要求查找与被改组件同名的测试文件命名规范为ComponentName.tests.tsx通过--testPathPattern将 Jest 限定到该路径。yarn test --testPathPattern path/to/changed/component这里的yarn test在 package.json 中定义为jest --config ./frontend/test/jest.config.js即始终使用仓库统一的 Jest 配置。4.2 测试匹配规则为什么是 .tests.tsxfrontend/test/jest.config.js 中的testMatch决定了哪些文件会被 Jest 视为测试testMatch: [**/*tests.[jt]s?(x)],即仓库只把形如*.tests.ts、*.tests.tsx、*.tests.js、*.tests.jsx的文件当作测试用例。因此寻找与被改组件对应的组件名.tests.tsx是命中测试的唯一可靠方式。技能中如果改了很多文件就退化为全量yarn test的建议也与 Jest 配置中transformIgnorePatterns、moduleNameMapper等全局设定相呼应——全量跑能覆盖到组件间联动回归。4.3 前端测试环境要点从 jest.config.js 还能看到前端测试的几个关键事实测试环境为jest-fixed-jsdom测试 URL 为http://fleettest.test:9876testEnvironmentOptions适合组件渲染与交互断言CSS/SCSS 文件通过identity-obj-proxy桩掉脚本类资源.sh/.ps1有独立 mock全局挂载TransformStream与空的featureFlagsglobals保证运行时 API 可用。五、选择要运行的测试四象限决策技能给出了明确的决策矩阵变更类型执行内容只有 Go 文件只跑 Go 测试只有前端文件只跑前端测试两者都有Go 与前端都跑提供了参数Go 侧传入-run前端侧传入--testPathPattern其中参数即过滤器的设计非常实用例如只想验证某个策略引擎改动可以运行MYSQL_TEST1 go test -run TestPolicy ./server/...或对单个前端页面yarn test --testPathPattern frontend/pages/hosts把验证范围压缩到最小。六、收尾输出结果摘要技能要求最后输出一份可读的汇总哪些包/套件通过、哪些失败、以及失败详情。这一要求与仓库 CI 的分桶并行思想一致——Makefile 中test-go目标按fast、service、scripts、mysql、fleetctl、vuln、activity、main把测试拆成多个可独立运行的桶便于并行与定位失败归属。你在本地按技能跑完一轮后也应给出类似的归类摘要例如server/datastore/mysql通过N 个测试server/service失败列出失败用例与断言信息frontend/pages/hosts通过N 个测试七、在仓库中进一步深入如果想把这套流程与仓库工程基建对齐可以继续研读Makefile.run-go-tests与run-go-tests目标后者默认注入MYSQL_TEST1 REDIS_TEST1 S3_STORAGE_TEST1 SAML_IDP_TEST1 NETWORK_TEST1展示了仓库哪些层需要哪些外部依赖的完整映射MakefileDEFAULT_PKGS_TO_TEST、FAST_PKGS_TO_TEST等测试桶定义可帮助你判断自己改动的包属于快测还是重依赖类型frontend/test/jest.config.js前端测试匹配、mock、环境的全部约定package.jsonyarn test、yarn lint、yarn test:ciCI 模式带覆盖率等脚本入口server/datastore/mysql/mysqltest/mysqltest.go#L471-L474MYSQL_TEST跳过守卫的真实实现。结语test技能把为最近改动跑测试这个高频操作固化为一套可复制的流程git diff定范围、Go 按包注入MYSQL_TEST/REDIS_TEST、前端按ComponentName.tests.tsx命名用--testPathPattern定点执行、可选参数作为过滤器、最后输出结构化摘要。理解每个环节背后的源码依据MYSQL_TEST的跳过逻辑、testMatch的命名约束、Makefile 的标签与并行参数你就能在 Fleet 仓库中既快又准地完成变更验证把精力留给真正失败的断言。【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表