Skip to content

test: compareTimeStringsのゴールデンテストを追加(フェーズ1お手本PR) - #419

Merged
taminororo merged 2 commits into
developfrom
test/kanba/404-compare-time-strings
Jul 16, 2026
Merged

test: compareTimeStringsのゴールデンテストを追加(フェーズ1お手本PR)#419
taminororo merged 2 commits into
developfrom
test/kanba/404-compare-time-strings

Conversation

@taminororo

@taminororo taminororo commented Jul 11, 2026

Copy link
Copy Markdown
Collaborator

概要

フェーズ1(依存ゼロの純関数テスト)の最初の実装。compareTimeStringsapi/lib/usecase/shift_usecase.go:509)にゴールデンテスト(今のコードが実際に返している値を、そのまま「正解」としてテストに固定する手法。仕様書ではなく現状の動作を基準にする)を追加する。api配下で初めての_test.goファイルであり、以降メンバーが残り7関数(#420#426)を実装する際のお手本を兼ねる。

背景(なぜこの実装なのか)

このPRはお手本を兼ねるため、機械的な変更内容だけでなく設計判断の理由も残す。

なぜこの関数を最初の実装対象に選んだか

フェーズ1(純関数、単体テスト)は依存先を偽装する必要が無く、誰の環境で実行しても結果が変わらない。一方フェーズ2(repository、実DB統合)は環境に結果が左右されやすい(このPRに先立つ調査で、ローカルに残っていた古いDBボリュームのせいで誤った挙動を観測しかけたことがあった)。メンバーへの最初の割り振りには環境依存の無いフェーズ1が適しており、その中でも戻り値がintのみで比較しやすく、要判断も少ないcompareTimeStringsを選んだ。

なぜ期待値がこの数字なのか

wantの値は、コードを読んで「こう動くべき」と推測したものではない。設計書(docs/development/test-design/phase1-pure-functions.md)作成時に、実際に使い捨てテストを実行し、今のコードが実際に返す値を観察してから記録したもの(ゴールデンテストの定義どおり)。たとえば"aa:bb"のケースが-10:00扱い)になるのは、strconv.Atoiのエラーが_で握りつぶされる現状のコードをそのまま反映した結果であり、「本来こうあるべき」という設計上の意図ではない。

なぜ要判断2件をこのPRの中で直さなかったか

要判断とは、実装時に見つかった「これは仕様として固定してよい挙動か、それともバグとして直すべきか」がまだ決まっていない箇所のこと。「異常な入力を0扱いにすべきか、エラーにすべきか」は、compareTimeStrings単体を読むだけでは決められず、呼び出し元のsort.Sliceshift_usecase.go:423-425)や、その先のシフトデータの整合性まで調査が要る。テストを書くPRとバグを直すPRを混ぜると、後から見た人が「これは現状を記録しただけか、意図的に挙動を変えたのか」をdiffから判断できなくなる。そのため、判断が必要な部分は現状の挙動をそのまま固定した上で、判断そのものを別issue(#418)に切り出した。

変更内容

api/lib/usecase/shift_usecase_test.go を新規追加。docs/development/test-design/phase1-pure-functions.mdcompareTimeStringsセクションに載っている10ケースを、そのままテーブル駆動テスト(入力と期待値の組み合わせをスライスで列挙し、1つのループで全パターンを検証するGoの定番の書き方)として実装した。

  • ファイル配置: 対象ファイルと同じディレクトリに <対象ファイル名>_test.go
  • パッケージ: package usecase(テスト対象と同一パッケージ)。compareTimeStringsは小文字始まりのunexportedな関数で、Goでは同じパッケージ内のコードからしか呼び出せない。そのためテストファイルもpackage usecaseにして、直接呼べるようにしている
  • レシーバ: compareTimeStringsfunc (a *shiftUseCase) compareTimeStrings(...)という、構造体のメソッドとして定義されている(この構造体をレシーバと呼ぶ)。ただし関数の中身はレシーバaのフィールドを一切参照していない純関数なので、テストでは中身が空のゼロ値&shiftUseCase{}を作ってメソッドを呼び出すだけで済む(DBやSlackへの接続を用意する必要が無い)
  • ケース表のname/time1/time2/wantをそのまま構造体スライスにし、t.Runでサブテスト化

要判断2件は、設計書の記載どおり現状挙動をそのまま期待値にし、コメントで issue #418 にリンクした。

動作確認

$ go test ./lib/usecase/... -run TestCompareTimeStrings -v -count=1
--- PASS: TestCompareTimeStrings (0.00s)
    --- PASS: TestCompareTimeStrings/桁数が異なる時刻の数値比較 (0.00s)
    --- PASS: TestCompareTimeStrings/逆順で正の値を返す (0.00s)
    --- PASS: TestCompareTimeStrings/同一時刻は等価 (0.00s)
    --- PASS: TestCompareTimeStrings/同時間帯での分単位の差 (0.00s)
    --- PASS: TestCompareTimeStrings/ゼロ値時刻と一日の最大時刻 (0.00s)
    --- PASS: TestCompareTimeStrings/ゼロパディング表記の同値性 (0.00s)
    --- PASS: TestCompareTimeStrings/非正規化の分表記は換算後に等価 (0.00s)
    --- PASS: TestCompareTimeStrings/空文字列は正当な時刻とも等価扱い(要判断: issue #418) (0.00s)
    --- PASS: TestCompareTimeStrings/コロンが2個以上の書式は等価扱い (0.00s)
    --- PASS: TestCompareTimeStrings/非数値の時分は暗黙に0:00扱い(要判断: issue #418) (0.00s)
PASS

go vet ./lib/usecase/...golangci-lint run ./lib/usecase/... ともに指摘なし。

関連

Summary by CodeRabbit

  • テスト
    • 時刻文字列の比較処理に対するテストを追加しました。
    • 時刻の大小・同値性、ゼロパディング、桁数や分の違い、無効な形式など、さまざまなケースを検証します。
    • 現在の比較結果をテストで固定し、今後の変更による不具合を検出しやすくしました。

フェーズ1(依存ゼロの純関数テスト)の最初の実装。api配下で初めての _test.go ファイルとして、ファイル配置・命名・テーブル駆動テストの書き方の実例にする。

設計書(docs/development/test-design/phase1-pure-functions.md)の10ケースをそのまま実装。要判断2件(空文字列→等価扱い、非数値だがコロンありの入力→0:00扱い)は現状挙動をそのまま固定し、issue #418で判断する。
@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a16c76c1-bf47-4ace-95db-f77bf5089b7f

📥 Commits

Reviewing files that changed from the base of the PR and between ee6a30b and 517cf35.

📒 Files selected for processing (1)
  • api/lib/usecase/shift_usecase_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • api/lib/usecase/shift_usecase_test.go

📝 Walkthrough

Walkthrough

compareTimeStrings に対し、時刻の大小比較・同値性・形式差・異常入力を検証する TestCompareTimeStrings のゴールデンテストを追加した。

Changes

時刻文字列比較テスト

Layer / File(s) Summary
compareTimeStrings のテストケース追加
api/lib/usecase/shift_usecase_test.go
大小比較、同値、桁数差、分単位の差、ゼロパディング、非正規化分、空文字列、非数値、複数コロンを含む入力を t.Run で検証する。

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related issues

  • NUTFes/SeeFT issue 418: compareTimeStrings の異常入力を含むゴールデンテスト追加を直接扱っている。
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed 主要変更であるcompareTimeStringsのゴールデンテスト追加を簡潔に表しており、内容も一致しています。
Description check ✅ Passed 必須の概要・背景・変更内容・動作確認が揃っており、テンプレートとの差分も非致命的です。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch test/kanba/404-compare-time-strings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
api/lib/usecase/shift_usecase_test.go (1)

5-9: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

GoDoc形式のコメントはガイドラインで禁止されています。

行5のコメントが関数名 TestCompareTimeStrings で始まっており、GoDoc形式に該当します。コーディングガイドラインでは api/**/*.go に対して GoDoc形式を禁止しています。本PRは後続テスト実装の例と位置付けられているため、ガイドラインに準拠した形式に修正することを推奨します。

As per coding guidelines: api/**/*.go: Use Japanese for code comments; do not use GoDoc format.

♻️ 提案する修正
-// TestCompareTimeStrings は compareTimeStrings のゴールデンテスト。
+// compareTimeStrings のゴールデンテスト。
 // 期待値は docs/development/test-design/phase1-pure-functions.md の
 // compareTimeStrings セクションに記載のケース表と、実行による裏取り結果に基づく。
 // 「要判断」の付いたケースは現状の挙動をそのまま固定したもので、
 // 挙動の是非は issue `#418` で判断する。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api/lib/usecase/shift_usecase_test.go` around lines 5 - 9,
TestCompareTimeStrings
のコメントをGoDoc形式にならないよう更新し、コメント冒頭を関数名以外の日本語表現に変更してください。既存のテスト目的、参照ドキュメント、判断保留ケースに関する説明は維持してください。

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@api/lib/usecase/shift_usecase_test.go`:
- Around line 5-9: TestCompareTimeStrings
のコメントをGoDoc形式にならないよう更新し、コメント冒頭を関数名以外の日本語表現に変更してください。既存のテスト目的、参照ドキュメント、判断保留ケースに関する説明は維持してください。

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fcd96b8e-6b76-4f6a-8045-f0acaf3bdcb3

📥 Commits

Reviewing files that changed from the base of the PR and between 4f666f4 and ee6a30b.

📒 Files selected for processing (1)
  • api/lib/usecase/shift_usecase_test.go

CodeRabbitの指摘どおりTestCompareTimeStringsコメントの関数名始まりを解消(AGENTS.mdのGoDoc形式禁止規約に準拠)。
また「コロンが2個以上」ケースが空文字列ケースと同じガード節(issue #418の論点1)を通るにもかかわらずissue参照が漏れていたため追加した。
@taminororo
taminororo merged commit 0c0d9c1 into develop Jul 16, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant