cli のチュートリアル

このチュートリアルでは mare-mark コマンドを使って、JSONL イベントファイルを HTML レポートに変換し、記録された検証失敗を調べてからリプレイします。コマンドはリポジトリをチェックアウトした場所から実行します。例では testdata/ にあるフィクスチャを使います。

クイックスタート

git clone https://github.com/Luna-Flow/mare_mark
cd mare_mark
moon run src/cli --target native -- report testdata/report/sample.jsonl report.html

出力:

report written: /path/to/mare_mark/report.html
events: 5
elapsed: 1333.542ms

report.html をブラウザで開きます。経過時間の値は変動します。ラベルは ms ですが、単位はマイクロ秒です。

日常的な作業

パイプを使う

cat testdata/report/sample.jsonl \
  | moon run src/cli --target native -- report - - > report.html

出力に - を指定すると他には何も表示されないため、HTML を直接ファイルや別のツールに渡せます。

リプレイする前に失敗を調べる

moon run src/cli --target native -- replay testdata/replay/sample.jsonl --dry-run
command: printf
arguments: [replayed]
timeout: 1000ms

コマンドを読んでください。信頼できるなら実行します:

moon run src/cli --target native -- replay testdata/replay/sample.jsonl --yes

コマンドは記録されたタイムアウトで実行されます。その stdout が表示され、非ゼロの終了やタイムアウトがあると mare-mark は 1 で終了します。

リプレイ可能なアーティファクトを生成する

ランナーは、ケースの replay 関数が返す ReplaySpec を伴う validation_failure イベントを書き出します。そのコマンドが単独で失敗を再現するようにしてください。例えば、実装 ID と最小入力を受け取る小さなワーカーです。"Luna-Flow/mare_mark/model" をインポートした状態で:

test "a replayable failure description" {
  let replay = (input : Int, implementation : String) => {
    @model.ReplaySpec::new("my-worker", [implementation, input.to_string()], timeout_ms=2000)
  }
  let spec = replay(0, "off-by-one")
  debug_inspect(spec.arguments, content="[\"off-by-one\", \"0\"]")
}

runner のチュートリアルに、そのようなイベントを生成する実行を示しています。

さらに先へ

  • CI にレポートの手順を追加します。ベンチマークを実行して JSONL を書き出し、mare-mark report run.jsonl report.html を実行して、両方のファイルをアップロードします。
  • その他のターゲットでは、このコマンドはファイルパスを使う report だけをサポートします。

よくある落とし穴

  • stdin からのリプレイ。 サポートされていません。アーティファクトをファイルに保存してください。
  • --yes を忘れる。 これ(および --dry-run)がないと、replay は 2 で終了し、何も実行しません。
  • 余分な引数。 3 つ目の位置引数は使い方の誤りです。

次のステップ