多機器タイミング試験でタイミング競合を捕まえる
「たまに動かない」「客先でだけ起きる」——機器が複数あるシステムの不具合は、どの機器がどの順で返ってきたかで結果が変わることが少なくありません。このチュートリアルは、わざとタイミング競合を仕込んだテスト対象アプリに対して掃引を実行し、失敗する条件を特定 → 何度でも再現 → レポート化するまでを実機なしで通します。
TCP機器 2 台掃引 6 ランアサーション実機不要
このページでできること
- 複数機器を共有時計で協調させて動かし、機器間の相対タイミングを機械的に振る(掃引する)。
- アサーションで合否を自動判定し、「どのタイミング条件で壊れるか」を一覧で見る。
- 失敗したランを同じシード・同じパラメータで何度でも再現する。
- 失敗条件・根拠・再現手順を含むレポート(HTML/JSON)を出力し、そのまま不具合票に添付する。
登場人物(役割)
実機は要りません。CommSim 本体=2 台の機器役(在席センサ TCP 9710/ゲート制御装置 TCP 9711 で待受け)と、CommSim.Sample=テスト対象アプリ役(入退室ゲート管理アプリ)で完結します。アプリは機器ごとに 1 本ずつ、合計 2 本の接続を張ります(① が在席センサ、② がゲート制御装置)。
やりとりは 3 通だけです。
- →
SENSOR:VACANT在席センサ → アプリ①(フロアは無人) - →
GATE:READYゲート制御装置 → アプリ②(開閉準備ができた) - ←
GATE:CLOSEまたはGATE:OPENアプリ② → ゲート制御装置(開けるかどうかの指示)
仕込んである不具合
テスト対象アプリ(CommSim.Sample 側)には、次の実装ミスを意図的に入れてあります。
手で疎通確認する限り、機器はすぐ応答するので必ず正しい順序になり、この不具合は表に出ません。センサ側の応答が遅れる条件(回線が混む・機器の処理が重い・再送が挟まる)でだけ壊れます。掃引はこの「特定のタイミング条件」を機械的に探します。
用意するもの
| ファイル/ツール | 内容 |
|---|---|
timing-race/timing-race.commsim | 機器役 2 セッション(在席センサ=TCP サーバ 9710/ゲート制御装置=TCP サーバ 9711)+試験定義 1 件 |
| CommSim.Sample | テスト対象アプリ役。「動かすサンプル」で「多機器タイミング試験(入退室ゲートの競合)」を選ぶと、① が 9710・② が 9711 へ接続するクライアントになり、競合バグ入りの判定ロジックが有効になる |
timing-race.commsim は CommSim.Sample の実行フォルダ内 samples/timing-race/ に同梱されています。実機・追加インストールは不要です。
ステップA:テスト対象アプリをつなぐ
- CommSim.Sample を起動し、上部の「動かすサンプル」で「多機器タイミング試験(入退室ゲートの競合)」を選ぶ。
- 両ペインの表題が「① テスト対象アプリ役(在席センサとの接続)」「② テスト対象アプリ役(ゲート制御装置との接続)」に変わり、①=
9710・②=9711、どちらも役割=Client・「自動応答」が ON になっていることを確認する。 - ①② の「接続」をそれぞれクリックする。相手(機器役)はまだ起動していないので、状態は「再接続待ち…」のままになります。これで正常です(このあとは試験側が全部動かすので、Sample 側の操作は不要)。
ステップB:試験の中身を確認する
- CommSim 本体で
samples/timing-race/timing-race.commsimを開く(「ファイル」→「ファイルから開く…」/Ctrl+O)。 - メニュー「ツール」→「多機器タイミング試験」を開く。左の一覧の「入退室ゲート:在室判定のタイミング競合」が選ばれている。
- タブを順に見る。ここが試験定義の全体像です。
| タブ | この試験での設定 |
|---|---|
| 参加機器 | 在席センサ/ゲート制御装置の 2 台(呼び名は結果一覧・レポートにそのまま出る) |
| タイムライン | 0 ms に両機器を起動 → 1500 ms にセンサ報告 → 1700 ms にゲート準備完了 |
| 掃引軸 | 在席センサの応答遅延を 0〜400 ms・刻み 80(=6 通り) |
| アサーション | ゲート制御装置が「CLOSE」を 1 回以上受信すること(=無人のフロアでゲートを開けない) |
ステップC:掃引を実行して失敗条件を特定する
- 下部の「実行」をクリックする。ランごとに機器の起動 → 送信 → 停止が自動で回り、進捗が更新される。
- 20 秒ほどで 6 ラン終わる。「結果」タブに合否が並ぶ。
期待: ゲート制御装置 が「CLOSE」(Contains) を 1 回以上 / 実際: 0 回)が出る。試験全体を何度回しても同じ内訳になる。これが「掃引で失敗条件を特定する」ということです。不具合の再現条件が「センサ応答が 200 ms 以上遅れたとき」だと数字で言い切れるようになり、報告も修正の確認も一気に楽になります。
GATE:READY が届いた時点でアプリが GATE:OPEN を返してしまっており、① に SENSOR:VACANT が届くのはその後です(=間に合っていない)。
GATE:READY → GATE:OPEN のあとに ① の SENSOR:VACANT が届いている。センサ報告が間に合わず、初期値のまま判定してしまった瞬間。ラン間の「切断 → 再接続しました。」も残る。ステップD:再現・ログ確認・レポート出力
- 失敗した行(例:遅延 400 ms)を選び、「このランを再現」をクリックする。同じシード・同じパラメータでそのランだけを実行し直す。何度実行しても同じ FAIL になる(=修正後に「直った」と言い切れる)。
- 「このランのログを開く」で、そのランの時間帯の採取ログをログビュワーで確認できる。
- 「レポート出力」で HTML を保存する。同じ場所に同名の JSON も同時出力される(HTML=人が読む用・JSON=CI や集計用)。
.commsimlog)に記録されるので、ラン 6 回ぶんの接続(機器 2 台 × 6 ラン=12 コネクション)を左のコネクション一覧から追える。ランごとに Tcp Server 0.0.0.0:9710 / :9711 が起動し直しているのも見える。レポートには、掃引空間の要約・PASS/FAIL 集計・失敗したランのパラメータと判定の根拠・再現手順が含まれます。不具合票にそのまま添付できます。
.commsimlog)をエクスポートして添えてください。自分のケースへの当てはめ方
| 問い | はい | いいえ |
|---|---|---|
| 不具合が機器の応答順序で変わりそうか? | この試験と同じく、片方の機器の応答遅延を掃引して境界を探す | 単体の応答内容の問題なら、まずオートメーションで再現できないか試す |
| 不具合が再送・欠落でだけ出るか? | 掃引軸を「送信ロス率」や「N 回送信後に切断」に変える(軸は同じ手順で追加できる) | 遅延だけで十分 |
| 合否を時間で判定したいか? | アサーション種別を「タイミング」にし、タイムラインイベントから受信までの上限・下限を指定する | 「受信あり/なし」「順序」で足りる |
| 機器がアプリへ接続しにくる構成か?(機器がセンタへダイヤルアウトする現場) | セッションをクライアントで作る(接続先=アプリの待受ポート)。試験の手順はこのサンプルと同じ | このサンプルと同じくセッションをサーバにし、アプリから接続させる |
| テスト対象アプリは機器の再起動に追随できるか? | そのまま試験を回せる | まずそこが実装の穴。試験はランごとに機器を停止・起動するため、再接続できないアプリは 1 ラン目しか通らない(これ自体が有用な発見) |
次に読む
- 多機器タイミング試験 — 画面・アサーション種別・掃引パラメータの詳細
- リプレイ/障害注入 — 1 台の機器に遅延・ロス・切断を与える基本
- ログビュワー — ランの通信内容を時系列で追う
- ← チュートリアル一覧に戻る