多機器タイミング試験
複数のセッション(機器)を 1 本のタイムラインで協調して動かし、遅延・ロス・発火時刻などのパラメータを機械的に振りながら、各回の合否を自動判定します。手動では狙って再現できない「タイミング依存の不具合」を、条件を変えながら総当たりで探すための機能です。
timing-race(入退室ゲートの競合・機器 2 台=TCP 9710 / 9711)に、わざとタイミング競合を仕込んだテスト対象アプリと試験定義が入っています。手順は 多機器タイミング試験でタイミング競合を捕まえる を参照してください。概要と用語
この機能では次の言葉を使います。
| 用語 | 意味 |
|---|---|
| 試験 | 「参加機器+タイムライン+掃引軸+アサーション+実行設定」の 1 セット。プロジェクトに複数持てます |
| 参加機器 | 試験に参加させる既存のセッション。1 セッション=1 機器です |
| タイムライン | 試験開始(0 ms)からの時刻に、機器への指示(起動・停止・オートメーション実行・障害変更・切断)を並べたもの |
| 掃引軸 | 値を振るパラメータとその範囲(例:機器 A の応答遅延を 0〜500 ms、50 ms 刻み) |
| ラン | パラメータの 1 組み合わせを 1 回実行したもの。合否はランごとに決まります |
| アサーション | ランの合否を決める判定条件 |
CommSim が複数の機器役を同時に演じ、共有の時計にしたがって指示を出します。テスト対象アプリを手で操作する必要がないため、そのまま繰り返し実行できます。
画面を開く
メニューの 「ツール」→「多機器タイミング試験を開く…」 で専用ウィンドウが開きます。ログビュワーと同じくメインウィンドウとは別のウィンドウなので、試験を回しながら他の作業を続けられます。
- 左:試験の一覧(追加・複製・削除)
- 右:選択中の試験の設定タブ(参加機器/タイムライン/掃引軸/アサーション/結果)
- 下:実行バー(実行・中断・進捗・PASS/FAIL の集計)
試験の定義はプロジェクトファイル(.commsim)に保存されます。プロジェクトを保存すれば、次回も同じ試験をそのまま実行できます。
参加機器を選ぶ
「参加機器」タブに、プロジェクト内のセッションが一覧で並びます。試験に使うものだけ「参加」にチェックを入れてください。試験専用のセッションを作る必要はありません。既存のスタブ設定・オートメーション・構造体定義をそのまま使います。
| 項目 | 内容 |
|---|---|
| 別名 | 試験の中での呼び名。空ならセッション名を使います。掃引軸やアサーションの選択肢にもこの名前が出ます |
| 既存オートメーションを有効にする | 既定はオフ。オフの場合、その機器の既存オートメーションは試験中に自動発火せず、タイムラインから明示的に呼んだものだけが動きます |
タイムラインを組む
「タイムライン」タブで、試験開始からの時刻(ミリ秒)に機器への指示を並べます。行を選んで ダブルクリックまたは Enter で編集、Delete で削除できます。「複製」は、同じ指示を機器ごとに少しずつずらして並べたいときに便利です。
| 種類 | 内容 |
|---|---|
| 起動 | 指定した機器のセッションを起動します。機器ごとに時刻をずらせば「起動順序」を試験できます |
| 停止 | 指定した機器のセッションを停止します |
| オートメーション実行 | その機器の既存オートメーションを手動トリガーで実行します。送信内容は既存の設定をそのまま使います(試験用に書き直す必要はありません) |
| 障害パラメータ変更 | 遅延・ゆらぎ・ロス率・N 回送信後の切断を、実行の途中で差し替えます(例:2 秒後から回線を悪化させる) |
| 切断 | 接続を 1 本だけ切ります。待ち受けは維持されるので、アプリの再接続動作を確認できます |
条件分岐やループは持ちません。複数機器のタイミングを組み合わせることに用途を絞っています。
掃引軸と探索方式
「掃引軸」タブで、振るパラメータと値の範囲を指定します。
| 対象 | 振れるパラメータ |
|---|---|
| 機器 | 応答遅延・ジッタ(ゆらぎ)・ロス率・N 回送信後に切断 |
| タイムラインイベント | 発火時刻(=機器間の相対タイミング・起動順序) |
値の指定方法は「範囲と刻み」(例 0〜500 を 50 刻み)か「候補値」(例 0, 100, 250)のどちらかです。
- グリッド(全数):すべての組み合わせを実行します。軸ごとの値数の積になるため、軸を増やすと急激に増えます
- ランダム N 件:指定した件数を乱数で抽出します。シードが同じなら毎回同じ組み合わせになります
タブには組み合わせ数と推定所要時間が常に表示されます。大きすぎる場合はここで刻みを粗くするか、ランダム探索へ切り替えてください。実行を始めたあとは、実測した 1 ラン平均で推定が更新されます。
合否条件(アサーション)
「アサーション」タブで、ランの合否を決める条件を宣言します。1 つでも満たせなければそのランは FAIL です。
| 種類 | 判定内容 |
|---|---|
| 受信あり | 指定機器が、指定パターンに一致するデータを受信する(ちょうど N 回/N 回以上/N 回以下を指定可) |
| 受信なし | 指定機器が、指定パターンを受信しない |
| 順序 | ある受信が別の受信より先に起きる(例:機器 A の応答が機器 B より先) |
| タイミング | タイムラインイベントの発火から指定の受信までが N ms 以内/N ms 以上 |
| 最終接続状態 | ラン終了時点で、指定機器が接続されている/切断されている |
パターンの指定方法(完全一致・部分一致・前方一致・正規表現・HEX)とデータの解釈(UTF-8/ASCII/HEX)は、オートメーションのパケット一致と同じです。
実行と結果の見方
下部の「実行」を押すと、組み合わせを 1 つずつ順番に実行します。「中断」でいつでも止められ、そこまでの結果は残ります。
- ランは直列に実行されます(実際にポートを開いて通信するため、同時に走らせるとポートの取り合いとタイミングの干渉で結果がぶれます)
- 1 ランの流れは「全機器の停止 → 設定の適用 → タイムラインの再生(起動を含む)→ 余韻(遅れて届く応答を拾う待ち時間)→ 全機器の停止 → 合否判定」です
- 結果は確定したランから順に「結果」タブへ追記されます
機器役(CommSim)を待ち受けにする通常構成では、アプリ側が接続をやり直します。逆にアプリが待ち受け側なら、機器役セッションが毎回つなぎに行くので追加の対応は要りません。
なお「再接続できない」こと自体が実装の穴なので、この試験で早期に気づけます。同梱サンプル
timing-race は自動再接続の実装例です。ランとランの間には「ラン間待ち」の時間が入ります(既定 500 ms)。ポートが解放されるまでの猶予で、次のランの起動失敗を防ぎます。
「結果」タブでは、ラン番号・合否・そのランのパラメータ・失敗した条件・所要時間が一覧で並びます。行を選ぶと、下にアサーションごとの根拠(期待と実際)が出ます。
timing-race。センサの応答遅延が 240 ms 以上のランだけ FAIL している)。選択した行の根拠は下段に出る。- このランを再現:同じパラメータ・同じシードでもう一度だけ実行します。結果は同じ行が置き換わるので、直したあとの確認に使えます
- このランのログを開く:ログビュワーを開きます。合否だけで原因が分からないときに、実際のパケット列を確認してください
「一度も接続されませんでした」の警告
ランの間に一度も接続されなかった機器があると、その旨が警告として出ます。合否より手前の話 ——「試験の前提が成立していなかった」—— なので、失敗の根拠とは別に表示します。
- 「結果」タブの各行:失敗した条件に続けて
⚠ 機器「◯◯」はこのランで一度も接続されませんでした。と併記されます(PASS のランでも出ます) - 実行バーとレポート:機器ごとに
機器「◯◯」は 6 ラン中 6 ランで一度も接続されませんでした。と集約されます
ほとんどの場合、原因はテスト対象アプリ側にあります。アプリを起動していない・接続先のポートが試験の機器と食い違っている・再接続に対応していない、のいずれかを確認してください。この警告は合否を変えません(アサーションの判定はそのままです)。
接続という概念のない UDP・シリアルの機器は対象外です。また、タイムラインに「起動」イベントが無い機器は、そもそも動いていないため別の警告(「タイムラインに『起動』イベントがありません」)で伝えます。
試験実行中のセッション
試験の実行中、参加している機器のセッションは試験側が制御します。セッション画面の起動/停止ボタンは無効になり、どの試験が使用中かがボタンの説明と状態ランプで分かるようになっています。
試験が終わると操作できる状態に戻ります。このときセッションは停止した状態になります(試験は各ランの最後に必ず全機器を停止するため)。必要なら手で起動し直してください。なお、試験のために書き換えた設定(障害注入・オートメーションの抑止)は試験の前の状態へ戻しますので、続けて手動で使っても挙動は変わりません。
レポート出力
「結果」タブの「レポート出力」で、実行結果を保存できます。保存先を 1 つ指定すると、同じ場所に 2 つのファイルが出力されます。
| 形式 | 用途 |
|---|---|
| HTML | 人が読む・共有する。試験名・実行日時・掃引空間の要約・PASS/FAIL 集計・失敗ランのパラメータと根拠・再現手順が 1 枚にまとまります。外部ファイルに依存しないので、そのままメールや課題管理システムに添付できます |
| JSON | 機械可読。前回との差分比較や、独自の集計に使えます |
レポートには通信データそのもの(バイト列)は含めません。通信の中身の確認はログビュワーの役割です。
注意事項・制限
切断イベントが効く機器
「切断」イベントは TCP のサーバーモードで動作している機器でのみ有効です。TCP クライアント・UDP・シリアルの機器では「待ち受けを維持したまま接続を 1 本だけ切る」という操作自体が存在しないため、実行前に警告が出て、そのイベントは実行されません(代わりに「停止 → 起動」を組み合わせてください)。
中継(プロキシ)設定との併用
試験はスタブ構成を前提としています。転送先(上流)が有効なセッションを参加させると実行前に警告が出ます。実機と中継しながら試験を回すと、応答が実機由来なのか CommSim 由来なのか分からなくなるためです。
時間の見積り
タイムアウト境界の確認のように待ち時間の長い試験では、1 ランが長くなり全数実行が現実的でなくなることがあります。相手のあるテストなので再生速度を上げて短縮することはできません。刻みを粗くする・ランダム探索にする・「最初の失敗で打ち切る」を使う、のいずれかで調整してください。
結果一覧の表示件数
一覧に表示するのは 1000 ランまでです。それを超えてもレポートには全件が出力されます。
この機能でやらないこと
振れるのはタイミング・障害・順序だけです。機器の内部状態(状態遷移そのもの)を再現する仕組みは持ちません。応答内容の作り込みは、これまで通りオートメーション・バイナリ構造応答・スクリプト応答で行ってください。
次に読む
- 多機器タイミング試験でタイミング競合を捕まえる — 同梱サンプルで手順を通す
- オートメーション — タイムラインから呼ぶ送信内容の作り方
- リプレイ/障害注入 — 単一セッションでの録画再生と障害注入
- ログビュワー — 失敗したランの通信内容を追う