Status: Draft(論文の設計を製品運用イメージへ翻訳したもの。UC5の3コマンドなど一部はCLI実装済み) 関連ドキュメント: テスト知識管理のGit-nativeモデル_統合版.md(本資料が翻訳する論文本体)、cli-manual.md(UC対応コマンドの実装詳細)
位置づけ:本資料は「テスト知識管理のGit-nativeモデル」論文(テスト知識管理のGit-nativeモデル_統合版.md)の設計を、実際にプロダクトとして運用した場合の操作イメージに落とし込んだものです。論文本文に明記されている箇所には該当節・行番号を付し、製品化にあたって補った箇所は「(製品化提案、論文本文には明記なし)」と明記します。
sequenceDiagram
actor TD as Test Designer
participant KN as .markharness/knowledge/**
actor RM as Release Manager
participant CI as CI Bot
participant GEN as .markharness/generated/testcases/*.yml
participant CH as .markharness/changes/milestone.yaml
participant BF as Backfill Worker
participant NOTES as git notes
TD->>KN: feature.yml を記述
TD->>KN: condition.yml を記述
TD->>KN: expected/*.yml を記述
TD->>KN: forked_from を手動記述(概念的派生がある場合のみ、§3.1)
TD->>CI: PRを作成
CI->>GEN: Feature+Conditionから TestCase を決定的に再生成
CI->>CI: 再生成結果と現在のファイルの一致を検証(§4.5)
alt 差分あり
CI-->>TD: 差分レビューを要求(人間の判断ポイント)
else 差分なし
CI-->>TD: 検証OK
end
RM->>KN: マイルストーンタグを付与(人間の判断ポイント)
RM->>CI: タグpushを通知
CI->>CH: 直近マイルストーン間のFeatureディレクトリtree SHA比較でderived_fromを計算(§3.2-3.4, 核心的貢献)
CI->>NOTES: 「このマイルストーンの系譜計算は完了」を記録(§4.3)
par 非同期バックグラウンド
BF->>NOTES: 未処理の過去マイルストーンを確認
BF->>CH: 優先度の低いジョブとして過去の.markharness/changes/*.yamlを埋め戻し(§4.1-4.2)
BF->>NOTES: 処理済みマイルストーンを記録
end
Note over CI,CH: 問い合わせ時点でバックフィル未完了の区間はオンデマンド計算しキャッシュ(§4.4)
作成順序の要点
.markharness/knowledge/**/feature.yml → condition.yml → expected/*.yml(Test Designerが手動記述).markharness/generated/testcases/*.yml(CIが決定的に生成し、既存ファイルとの一致を検証).markharness/changes/<milestone>.yaml(CIが derived_from を自動計算)git notes への進捗記録 → バックフィルによる過去マイルストーンの遅延埋め戻し(非同期・自動)mermaidにはUMLのユースケース図が無いため、アクターをノード、ユースケースを角丸ノードとして表現します(視覚的な代替表現)。
flowchart LR
subgraph Actors
TD[Test Designer]
RV[Reviewer]
RM[Release Manager]
CIBOT((CI Bot))
BFW((Backfill Worker))
MIG[Data Migration Operator]
end
subgraph UseCases
UC1(("UC1: 知識を記述する"))
UC1b(("UC1b: forked_from を手動記述する"))
UC2(("UC2: TestCaseを決定的生成する"))
UC3(("UC3: 生成物をレビュー・マージする"))
UC4(("UC4: マイルストーンをタグ付けする"))
UC5(("UC5: ChangeEventを自動計算する"))
UC6(("UC6: バックフィルを非同期実行する"))
UC7(("UC7: idキャッシュを破棄・再構築する"))
UC8(("UC8: 既存ツールからインポートする"))
end
TD --> UC1
TD --> UC1b
TD --> UC7
RV --> UC3
RM --> UC4
CIBOT --> UC2
CIBOT --> UC5
CIBOT --> UC7
BFW --> UC6
MIG --> UC8
UC1 -.include.-> UC2
UC2 -.include.-> UC3
UC4 -.include.-> UC5
UC5 -.include.-> UC6
| # | ユースケース | アクター | トリガー | 事前条件 | 主フロー | 事後条件 | 人間の関与 |
|---|---|---|---|---|---|---|---|
| UC1 | 知識を記述する | Test Designer | 新機能・新条件の追加 | なし | feature.yml/condition.yml/expected/*.yml を作成しコミット |
.markharness/knowledge/ 配下が更新される |
手動記述(§3.1, 108行目) |
| UC1b | forked_from を手動記述する | Test Designer | 別Featureからの概念的派生が発生 | 派生元Featureが存在 | forked_from フィールドに派生元idを記述 |
Git履歴に現れないドメイン知識が明示化される | 必須の手動記述(Git履歴からは自動導出不可、153行目) |
| UC2 | TestCaseを決定的生成する | CI Bot | PR作成・push | feature.yml/condition.yml が存在 |
Feature+Conditionの組を機械的に走査し .markharness/generated/testcases/*.yml を再生成 |
生成物が最新の知識と一致する状態になる | 自動(人間介入なし)。ただし既存ファイルとの差分検証結果は人間へ提示(§4.5, 316行目) |
| UC3 | 生成物をレビュー・マージする | Reviewer | UC2完了・差分検出 | CIが差分を検出 | 差分内容を確認し、意図した変更か判断してマージ | .markharness/generated/testcases/*.yml が確定しmainへ統合 |
人間の判断ポイント:意図しない変更の混入を防ぐ最終ゲート |
| UC4 | マイルストーンをタグ付けする | Release Manager | リリース判断 | mainブランチが安定 | git tag <milestone> を実行 |
マイルストーン境界が確定する | 人間の判断ポイント:リリースタイミングの意思決定そのもの(図3) |
| UC5 | ChangeEventを自動計算する | CI Bot | タグpush | 直前マイルストーンのタグが存在 | 2マイルストーン間でid解決経由の各idのFeatureディレクトリtree SHAを比較し derived_from を算出、.markharness/changes/<milestone>.yaml に書き込み |
版履歴(ChangeEvent)が生成される | 自動(核心的貢献、§3.2-3.4)。change_typeは書き込まれず、後述の補足6で人間が事後入力する |
| UC6 | バックフィルを非同期実行する | Backfill Worker | UC5完了、または未処理区間への問い合わせ | git notes に未完了区間が存在 |
直近マイルストーンから優先的に過去の系譜を計算し、完了ごとに git notes へ記録 |
過去マイルストーンの .markharness/changes/*.yaml が段階的に埋まる |
自動。ただし処理優先度の調整は運用者が設定可能(製品化提案、論文本文には明記なし) |
| UC7 | idキャッシュを破棄・再構築する | Test Designer / CI Bot | キャッシュ不整合の疑い | id解決キャッシュが存在 | --no-cache オプションまたは rebuild コマンドを実行 |
キャッシュが再構築される | 明示的な手動破棄(フェイルセーフ、199行目) |
| UC8 | 既存ツールからインポートする | Data Migration Operator | 既存TestRail/Xray/TestLink資産、または既存Gherkin(.feature)資産の移行 |
エクスポートファイル、または.featureファイルが用意されている |
インポータを実行し本フォーマット(.markharness/knowledge/構造)に変換 |
既存資産が .markharness/knowledge/ 配下に反映される |
手動トリガー(移行作業そのものは人間が実行、§4.5)。Gherkinインポートの対応範囲は下記補足参照 |
preconditions/steps/additional_preconditions/additional_steps/resultsにより、素直なFeature+Background+Scenario+Given/When/Then(Feature→Behavior、Background→behavior.preconditions、Scenario→Condition、Scenario冒頭のGiven→condition.additional_preconditions、When→condition.steps、Then→expected_result.results、追加のWhen/Thenペア→追加のexpected/*.ymlのadditional_steps/results)の大部分は表現可能になった。連携は双方向のラウンドトリップとしてではなく、独立した2つの一方向機能として設計する方針である。
.featureファイルを人間レビューを介して(Knowledge Intentを人が確認・編集してから反映するフロー)markharness YAMLへ変換する。Scenario Outline+Examples(0016が対象外としたexamples:と同じ論点)・Given/When/Then内のData Table/Doc String(本フォーマットの全フィールドがVec<String>であるため素の文字列化以外の受け皿がない)・Rule:キーワード(Requirement→Feature→Behavior→Conditionの階層に対応する層がない)・タグ(@tag)とaxisの対応関係(タグは自由ラベル、axisはaxes/*.ymlへの事前登録が必要で単純な1:1変換ではない)・Scenario内でGivenがWhen/Thenより後に出現する非正準順序(condition.additional_preconditionsはCondition内1箇所のみ)・Whenを持たないScenario(condition.stepsのminItems:1と非両立)のように、markharnessの意味モデルに構造的な受け皿がない構文は自動変換の対象とせず、変換ツールが人間に警告し手動対応を求める(常に人間監督下で行う変換であるため、無条件の自動無損失変換までは要求しない)。この変換を1回限りの移行作業として使うか、.featureファイルを引き続き編集し繰り返し変換にかけるかは規定せず、利用者の運用に委ねる。トレーサビリティ確保のため、変換で生成したbehavior.yml/condition.ymlには元の.featureファイルパスと対象Scenario名(Behaviorの場合はFeature名)を記録するsourceフィールド(トレース専用、生成には使わない)を持たせる。同じ.featureファイルが繰り返し変換にかけられた場合、このsourceを照合キーとして既存のuidを維持したまま更新することも可能(繰り返し変換を選んだ運用でのみ必要になる仕組みで、詳細は実装着手時に決定)。TestCaseから.featureを生成するレンダリング機能。generated/testcases/*.ymlと同じ「生成物(コミット対象、CIで再生成一致を検証)」パターンに従う。UC4の主フロー(git tag <milestone> の実行)自体は人間の判断ポイントのまま変わらないが、その後段の「.markharness/executions/ へ実行結果を記録する」という機械的作業を補助する2つのコマンドを実装した(docs/cli-manual.md 1.13/1.14節)。
markharness milestone init <tag>:既存の git tag に対応する .markharness/executions/<tag>/milestone.yml を作成する。タグの存在検証のみ行い、タグ付けの意思決定自体は代行しない。markharness execution record <case_id> --milestone <name> --result <pass|fail|skip> --executor <name>:CI・QAいずれの起点でも共通のインターフェースで .markharness/executions/<milestone>/results.yml にTestCase実行結果を追記する。UC5の主フロー(markharness changes compute)自体は変わらないが、論文§3.2・§3.5が「人間が事後に入力する」「監査用の副次機能」と位置づけていた部分を補助する3つのコマンドを実装した(docs/cli-manual.md 1.15〜1.17節)。
markharness changes annotate <event_id> --type <spec-change|bug-fix|refactor|other>:changes compute が空欄のまま生成した change_type(§3.5)を、人間が事後に設定する。.markharness/changes/ 配下を event_id で横断検索するため、対象のマイルストーン区間ファイルを事前に知る必要はない。markharness changes lineage --commit <merge-commit-sha>:指定したマージコミットの2親と git merge-base によるマージベースを比較し、Feature idごとに線形/真の分岐/1親相当を判定する監査専用コマンド(§3.2)。changes compute の主系譜(.markharness/changes/*.yaml)には書き込まない。markharness validate:.markharness/knowledge/・.markharness/axes/ を .markharness/schema/*.schema.json(markharness init が既定一式を配置)で構造検証し、axisタグの登録有無・forked_from の参照先存在をあわせてチェックする(§3.5の「axes/*.ymlに定義されていない値をfront matterで使えないようスキーマバリデーションで縛る」の実装)。