测试
设置
提交之前,先在你的机器上检查改动。
开始之前
开始之前 的链接-
先完成环境搭建。Go 测试会用到构建好的 Web 应用,所以要先构建它。
-
安装一次测试用的浏览器:
Terminal window npx --prefix app/frontend playwright install chromium
运行日常检查
运行日常检查 的链接-
构建并 vet Go 代码:
Terminal window go build ./...go vet ./... -
运行 Go 测试:
Terminal window go test ./... -
检查并测试 Web 应用:
Terminal window npm --prefix app/frontend run checknpm --prefix app/frontend run lintnpm --prefix app/frontend run test -
运行分层和文件布局规则:
Terminal window go test -tags structure ./app/backend/tools/structurecheck
你应该不会看到任何失败。CI 运行同样的命令,其中 Go 的那些在 amd64 和 arm64 上都跑,另外还有一次带竞态检测的运行(go test -race ./...)。
运行端到端测试
运行端到端测试 的链接端到端测试用真实的浏览器操作真实的程序。运行你改动的那一块对应的项目:
npm --prefix app/frontend run e2e -- --project=movies这次运行会用一个全新的配置文件夹启动它自己的 HolyArrs。setup 项目会先创建所有者,其他项目大多要等它。发布之前,不带 --project 运行完整的测试套件。
选项
选项 的链接该运行哪些项目
该运行哪些项目 的链接| 你改了 | 运行 |
|---|---|
| 电影 | movies |
| 剧集 | shows |
| 请求 | requests, lists, reports |
| 下载 | sources, downloaders, downloads |
| 登录和用户 | accounts, kid |
| 健康状况和计划 | schedules, controls |
| 页面布局 | desktop, phone, a11y |
项目的名字在 app/frontend/playwright.config.ts 里。一个项目如果依赖另一个,会先运行那一个。
新测试该放在哪里
新测试该放在哪里 的链接| 类型 | 位置 |
|---|---|
| Go | 放在被测文件旁边 |
| Web 单元测试 | 放在对应文件旁边,命名为 name.test.ts |
| 端到端 | app/tests/<module>/ |
绝不要调用真实的外部服务。在 app/tests/fakes 下加一个替身。只在你的机器上能通过的测试,就是坏的测试。
如果不成功
如果不成功 的链接现象。 某项结构检查失败。 原因。 提示信息里写了是哪个文件、你破坏了哪条规则。 解决办法。 把代码挪走,或者由高层模块把普通数据传进来。见模块。
现象。 端到端测试启动不了。
原因。 测试用的浏览器没有安装。
解决办法。 运行上面那行 playwright install 命令。
现象。 Go 测试因为缺少页面而失败。
原因。 Web 应用没有构建。
解决办法。 运行 npm --prefix app/frontend run build。
进阶
进阶 的链接构建标签
带标签的测试在普通的 go test ./... 里会被跳过。传入 -tags <tag> 才会运行它。
| 标签 | 内容 |
|---|---|
structure |
tools/structurecheck 里的分层、文件布局、SQL 位置和注释规则 |
measure |
下载耗时检查 |
lab |
针对测试实验环境里真实应用的测试。它们读取 HOLYARRS_LAB_*,没有设置这些变量时会跳过 |
labms, livesubs |
针对媒体服务器和真实字幕站的实验环境测试 |
长时间测试和故障测试
CI 在普通测试之外还会跑这些。发布之前要运行它们。
go test -count=1 -run '^TestFault|^TestCrashInEveryLoopIsContained$' ./app/backend/cmd/holyarrsHOLYARRS_RESTART_TIMING=1 go test -count=1 -run '^TestCrashRestartTime$' ./app/backend/cmd/holyarrsHOLYARRS_MEMORY=1 go test -count=1 -timeout 30m -run '^TestMemoryPartsRuns$' ./app/backend/cmd/holyarrsgo test -count=1 -run '^TestDownloaderConformance$' ./app/backend/internal/downloads| 变量 | 作用 |
|---|---|
HOLYARRS_FAULT_OUT |
故障测试把结果表写入的文件 |
HOLYARRS_RESTART_TIMING, HOLYARRS_RESTART_TIMING_OUT |
打开从崩溃到可以登录的计时,并指定它的输出文件 |
HOLYARRS_MEMORY, HOLYARRS_MEMORY_OUT |
打开内存测试,并指定它们的输出文件 |
HOLYARRS_CRASH_RUNS, HOLYARRS_CRASH_SEED |
app/backend/internal/mediafiles/dbtests(crash_test.go)里崩溃循环的轮数和种子值,带 -short 时会跳过 |
替身服务器和变量
端到端测试会为下载器、来源和元数据服务器启动替身服务器,所以没有任何测试会连到真实的服务。测试会设置 HOLYARRS_TMDB_URL、HOLYARRS_MUSICBRAINZ_URL、HOLYARRS_PLEX_URL 和 HOLYARRS_QBITTORRENT_URL 这样的变量,让程序指向它们。真实的安装永远用不到这些变量。
API 契约有自己的测试。openapi.json 和路由对不上时,TestOpenAPIGenerated 会失败;tools/structurecheck/testdata 里的路由表快照会在任何路由被添加、删除或挪动时失败。
相关页面
相关页面 的链接HolyArrs 是免费的。如果它帮你省了时间,欢迎在 GitHub 上点个 Star、赞助它或请我喝杯咖啡。