コンテンツにスキップ

テスト

セットアップ

変更を送る前に、自分のマシンでチェックします。

  • セットアップを済ませます。Go のテストはビルド済みの Web アプリを提供するため、先にビルドしておきます。

  • テスト用のブラウザーを 1 回だけインストールします:

    Terminal window
    npx --prefix app/frontend playwright install chromium

ふだんのチェックを実行する

ふだんのチェックを実行する へのリンク
  1. Go のコードをビルドし、vet にかけます:

    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

失敗が 1 つも表示されなければ問題ありません。CI も同じコマンドを実行します。Go のコマンドは amd64 と arm64 で実行し、さらに race detector を付けた実行(go test -race ./...)を 1 回行います。

エンドツーエンドテストを実行する

エンドツーエンドテストを実行する へのリンク

エンドツーエンドテストは、実際のブラウザーで実際のプログラムを操作します。変更した領域のプロジェクトを実行します:

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 のコントラクトには専用のテストがあります。TestOpenAPIGenerated は openapi.json がルートとずれると失敗し、tools/structurecheck/testdata にあるルート表のスナップショットは、ルートの追加、削除、移動があると失敗します。

HolyArrs は無料です。時間の節約になったら、GitHub でスターを付ける、スポンサーになる、コーヒーをおごるのいずれかで応援してください。