Chrono Mock
言語日本語

パイプラインでの日付テスト

ウィンドウは探索のためのものです。こちらはもう一方、約 2.4 MB のコマンドライン版で、インストールするランタイムは不要です。終了コードは対象アプリ自身のものではなく、カバレッジの判定を表します。

終了コードが判定です

スクリプトから扱えるようにするための設計判断です。セッションが終わると、終了コードは「アプリが何を返したか」ではなく「時刻の置き換えが効いたか」に答えます。そのためパイプラインは、静かに失敗した置き換えで失敗させることができます。失敗させる価値があるのはまさにこの失敗です。それ以降のテストは、何も証明していないものになるからです。

対象アプリ自身の終了コードも、セッションデータの中で引き続き報告されます。

コード意味
0有効 - 時刻を読んだすべてのプロセスがセッションの時計を見た
10一部有効 - カバーできたチャネルとできなかったチャネルがある
11無効 - 置き換えが主要なチャネルに届かなかった
4判定不能 - カバレッジを確定できなかった
1使い方の誤り - フラグまたは式が不正
2対象を起動できなかった、またはインジェクトできなかった
12対象が消えた。単一インスタンスのアプリであることを示唆している
3内部エラー - エンジンを起動できなかった、予期しない状態に陥った、またはセッションを閉じる前に停止した(エンジン自身の終了コードにかかわらず)。このような実行には判定がありません
5この版ではその操作はビルドされていない
6実行が途中で打ち切られた - --timeout が経過した、またはエンジンが 15 秒間応答を止めて停止された。これは判定ではありません。セッションが中断されたため、対象についてどちらの方向にも何も証明しません
7別のセッションがすでに実行中です - セッションは一度に一つだけです。終了してから再試行すれば十分です
8セッションは判定に達しましたが、その証拠が --report で指定したファイルにありません - ディスクがいっぱいだったか、別のプログラムが古いファイルを開いたままにしていて、そのファイルは元のまま残ります。判定はコマンドが出力するレポートに引き続き含まれます

2 つのコマンドのすべてのフラグと、電卓向けの同様の表はコマンドラインリファレンスにあります。

実行時間を区切る

パイプラインは、人間がデスクトップアプリを閉じるのを待てません。--ticks N は N 回のハートビート(1 回が実時間で 1 秒)でセッションを終了し、その時点までに分かったことを報告します。カバレッジはどのみちプロセスの最初の数瞬で確定するので、たいていは短い上限で十分です。

# 10 秒だけ実行して、停止して報告する
chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt

機械可読な出力と証拠

  • --json は、人間向けのレポートではなく機械可読なレコードとしてセッションを出力します。チャネルごとのカバレッジを含め、内容は同じです。
  • --report <path> は人間向けのレポートをファイルに書き出します。ビルドの成果物として手頃です。判定が有効以外のセッションでは、注意書きを末尾に埋もれさせず、ファイルの先頭に「信頼できない証拠」の警告バナーが付きます。
  • 電卓も --json を話せるので、パイプラインが必要な日付を計算し、それを渡し直すことができます。
# 日付を求めてから、その日付で実行する
chrono calc --base today --snap eom --json
chrono run ".\build\test.exe" --preset month-end --ticks 10 --json

ステップの例

- name: Month-end behaviour
  shell: pwsh
  run: |
    .\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
    # ここで 0 以外の終了コードが返るなら、置き換えが効いていないということなので、
    # 以降のテストは何も証明しないことになる

- name: Keep the evidence
  uses: actions/upload-artifact@v7
  with:
    name: chrono-evidence
    path: evidence.txt

ランナーに関する正直な注意点 2 つ

  • Windows のランナーが必要です。Linux 版や macOS 版はありませんし、今後も作りません。Linux では libfaketime がすでにこの役目を果たしています。
  • ホスト型ランナーのウイルス対策ソフトがインジェクションをブロックすることがあります。時刻をずらすには対象プロセスにライブラリをインジェクトする必要があり、これは文書化された Windows の手法ですが、マルウェアも使います。ブロックされた場合は、偽の合格ではなくその旨を示す終了コードが返ります。ただし、頼る前に確かめておくべき点です。

同じ理由で、このプロジェクト自身のエンドツーエンドのテスト一式は、ホスト型ランナーではなく実機で動かしています。継続的インテグレーションですべてをビルドしてユニットテストし、置き換えそのものはリリース前に、32 ビット版と 64 ビット版の両方で実際のアプリを使って手作業で確認しています。

試してみる