跳转到内容

测试

设置

提交之前,先在你的机器上检查改动。

  • 先完成环境搭建。Go 测试会用到构建好的 Web 应用,所以要先构建它。

  • 安装一次测试用的浏览器:

    Terminal window
    npx --prefix app/frontend playwright install chromium
  1. 构建并 vet Go 代码:

    Terminal window
    go build ./...
    go vet ./...
  2. 运行 Go 测试:

    Terminal window
    go test ./...
  3. 检查并测试 Web 应用:

    Terminal window
    npm --prefix app/frontend run check
    npm --prefix app/frontend run lint
    npm --prefix app/frontend run test
  4. 运行分层和文件布局规则:

    Terminal window
    go test -tags structure ./app/backend/tools/structurecheck

你应该不会看到任何失败。CI 运行同样的命令,其中 Go 的那些在 amd64 和 arm64 上都跑,另外还有一次带竞态检测的运行(go test -race ./...)。

运行端到端测试

运行端到端测试 的链接

端到端测试用真实的浏览器操作真实的程序。运行你改动的那一块对应的项目:

Terminal window
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 在普通测试之外还会跑这些。发布之前要运行它们。

Terminal window
go test -count=1 -run '^TestFault|^TestCrashInEveryLoopIsContained$' ./app/backend/cmd/holyarrs
HOLYARRS_RESTART_TIMING=1 go test -count=1 -run '^TestCrashRestartTime$' ./app/backend/cmd/holyarrs
HOLYARRS_MEMORY=1 go test -count=1 -timeout 30m -run '^TestMemoryPartsRuns$' ./app/backend/cmd/holyarrs
go 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、赞助它或请我喝杯咖啡。