コンテンツにスキップ

テスト管理 — ファイルで置いた要件・テストケース・結果を見る

要件、テストケース、実行結果をファイルとしてフォルダに置いておけば、drawtonomy で開いて、どのバージョンがどこで PASS / FAIL するかを確かめ、どの実行でもその場で再生できます。中身はすべて普通のファイルです(Markdown の要件、testcase.yaml、OpenSCENARIO、テストケースごと・バージョンごとの JSON)。コードと同じようにレビューとバージョン管理ができ、drawtonomy はそれを読むだけです。アップロードもサーバーの用意もいりません。

cut-in のテストケースを開いたテスト管理の画面。左に要件の木、中央に図・パラメータ・ヒートマップ付きのテストケース、右に FAIL の実行を再生して衝突の位置に印が付いている

サンプルは、自動緊急ブレーキ(AEB)の見本実装を対象にしたテストスイートです。要件 4 件、テストケース 5 件、具体シナリオ 454 件と、3 つのバージョン(v1.0・v1.1・v1.2)の実行結果が入っています。

AEB テストスイートを drawtonomy で開く

スイートはファイルの入ったフォルダなので、置き場所は選びません。いま対応しているのは次の 2 つです。

  • GitHub の公開リポジトリ — フォルダの URL を ?tests= の後ろに付けます。

    https://www.drawtonomy.com/?tests=https://github.com/<owner>/<repo>/tree/<branch>/<folder>
  • 手元のフォルダ — メニューの Open tests… から開きます。ファイルはブラウザの外に出ません。

ほかの置き場所にも順に対応していきます。

requirements/ REQ-*.md
testcases/ <group>/<variant>/testcase.yaml
+ .xosc, .pvd.xosc, .drawtonomy.svg
results/ <sut>@<version>/<TC-ID>.json + logs/
  • 要件は id・title・任意の parent を持つ Markdown ファイルです。テストケースとは多対多でつながります。
  • テストケースは testcase.yaml を置いたフォルダです。論理シナリオ(.xosc と、パラメータの範囲を書いた .pvd.xosc)、合否基準、説明文、図をまとめます。
  • テスト実行は results/ の下の 1 フォルダで、テスト対象ソフトウェア(SUT)の 1 つのバージョンでスイート全体を回した結果です。runs の 1 件が 1 つの具体シナリオで、判定・KPI と、再生用の走行ログ(任意)を持ちます。

形式の詳細は FORMAT.md に、サンプルの結果を esmini でどう作ったかは README にあります。自分のソフトウェアを試すときは、同じシナリオとパラメータを手元のシミュレータで回し、同じ形式の結果ファイルを書き出してください。

Overview の画面。上端に回帰の集計、テスト実行ごとの PASS / FAIL の積み上げ棒、相手の種類別の PASS 率、要件の表が並ぶ

上端の帯は、表示中のバージョンを 1 つ前のバージョンと比べた結果です。Regressed は PASS から FAIL に落ちた実行、Gap drop は PASS のままでも最小車間がはっきり縮んだ実行、Fixed は FAIL から PASS に直った実行です。件数をクリックすると該当する実行が一覧で出ます。その下に、テスト実行ごとの結果、相手の種類別の PASS 率(By actor)、各要件がテストケースで満たされているかが並びます。

左の Navigator には同じ要件の木が、行ごとの状態の点と PASS 率付きで出ます。上の actor / maneuver のタグで画面全体を絞り込めます。どの要件からも参照されていないテストケースは Unlinked に集まります。

要件のページ。要件の本文、合格したテストケースと実行の集計、テストケースごとのカード (図と小さなヒートマップ付き)

要件をクリックすると、本文と、その要件を検証するテストケースのカードが並びます。カードには図・説明・PASS 率・ヒートマップの縮小版があり、どのテストケースがどこで落ちているかがひと目で分かります。

テストケースのページ。説明、図、パラメータ、合否基準と、割り込み車の減速度で分割したヒートマップ

上半分はテストケースそのものです。Description と図(機能シナリオ)、続いて範囲付きの Parameters と Pass criteria が並びます。要件のチップの横にはバージョンごとの PASS 率の推移があります。

ヒートマップは論理シナリオのパラメータ空間で、1 マスが 1 つの具体シナリオです。X 軸・Y 軸と、横に並べて分割する Split by のパラメータを選べます。

  • Boundary — 判定が異なるマスの間に引かれた細い線。SUT が対処しきれなくなる境目です。
  • Unavoidable(斜線) — 最初から理想的なブレーキをかけても衝突する実行。ここでの FAIL は SUT ではなくシナリオ側の限界です。
  • Color by — Verdict(PASS / FAIL)のほか、Min gap や Min TTC の値で塗り分けて、PASS したマスがどれだけ際どかったかを見られます。

ヒートマップの横で FAIL の実行を再生しているところ。選んだマスが枠で囲まれ、キャンバスに衝突の印、下に実行の要約と再生バー

マスをクリックすると、その実行が右側で再生されます。PASS の実行は最初から、FAIL の実行は失敗の 1 秒前から再生が始まり、衝突した時点で止まってキャンバスに印(Collision · 4.12 s)が付きます。下の要約には判定・理由・パラメータ値が出ます。再生バーにはいつもの Follow・Ghost・Trajectory(ego の計画経路)・Plot があり、キャンバスは隅のボタンでズームできます。Open in editor を押すと、その実行を通常のシナリオエディタで開きます。

v1.1 と v1.2 の比較。直ったマスは上向き矢印付きの緑、落ちたままのマスは灰色、再生では v1.1 の ego がバージョンラベル付きの Ghost で走る

上端バーの Compare をクリックします。表示中のバージョンが 1 つ前のバージョンと比べられます。チップのクリックで表示するバージョンを、Alt+クリックで比較元のバージョンを切り替えられます。ヒートマップは Δ v1.1 → v1.2 の差分表示になり、Regressed・Fixed・Still FAIL・Still PASS で塗り分けられ、横に件数が出ます。マスを再生すると、比較元のバージョンの ego がバージョンラベル付きの Ghost として並んで走り、要約には 2 つの実行が分かれ始めた時点(例: From 4.68 s: harder braking than v1.1)が出ます。

用語は ISO 34501 / 34505 と ISTQB に合わせています。

用語ファイルでは
機能シナリオ(Functional scenario)説明文と図(.drawtonomy.svg)
論理シナリオ(Logical scenario).xosc とパラメータの範囲(.pvd.xosc)
具体シナリオ(Concrete scenario)パラメータ値の 1 組。ヒートマップの 1 マス、1 回の実行
テストケース(Test case)testcase.yaml: 論理シナリオ + 合否基準 + SUT
テストスイート(Test suite)フォルダ全体
テスト実行(Test run)SUT の 1 つのバージョンでスイート全体を回したもの: results/<sut>@<version>/
要件(Requirement)requirements/*.md。テストケースと多対多でつながる

あわせて機能・論理・具体シナリオもご覧ください。

  • GitHub では公開リポジトリだけに対応しています。private リポジトリにはまだ対応していません。
  • サインインなしの GitHub API は 1 時間に 60 リクエストまでです。1 回開くのに数リクエスト使うので、何度も再読み込みすると上限に達することがあります。
  • サンプルの実行数は数百件です。数千件を超える実行や非常に大きなログを持つスイートは、まだ想定していません。