Test modelとDevelopment modelの違い
今日はいろんな参照とかはせずに、自分の考えをまとめる記事です。ほぼポエムです。
Test modelとは
Test modelとは、モデルベースドテストの入力になるモデルのことで、テスト対象をテストの視点から捉えた一側面のことです。うーん、側面よりももう少し狭いかもしれません。ある視点からテスト対象にスポットライトを当てた箇所、かもしれません。
Test modelが満たすべき条件は
・あるルールに従って形式的に書かれている
・形式度合いは、(カバレッジ基準が定まれば)一意にテストケースが生成できるレベル
・atomicityが保たれており、複数の特定のテスト技法が適用できることが明示(もしくは自明)されている
といったところでしょうか。つまり、test modelがすべて書かれて、かつ、カバレッジ基準が決まればテストケースが一意に生成できる、ということです。
Development modelとは
ソフトウェア設計工程で描かれるモデルのことです。代表的なものにUMLがあります。状態遷移図やデシジョンテーブル、アクティビティ図などが該当します。先ほどと対比すると、Development modelとは、ソフトウェア設計の視点からシステムにスポットライトを当てた箇所、のことになります。
言い換えると、ソフトウェア設計の関心事を表現したものです。つまり、必然的にTest modelとDevelopment modelは同じ場合もあれば別のものになる場合もある、ということになります。モデルとは、ある対象を特定の視点から表現したものなので、関心毎によって別のモデルができることはとても自然です。
Test modelとDevelopment modelのかかわり
上にも少し書きましたが、Test modelとDevelopment modelが同じものになるケースは結構あります。それは、設計したモデルがそのまま正しく実現されているかを確認したい、というテスト側の関心事があるからです。
具体的に言うと、例えばソフトウェア設計で作られた状態遷移図はそのままテスト設計に使われますよね。(本当はテストだからこそNスイッチとか考えたりするんですけど、そこは置いておきましょう)
一方、ソフトウェア設計とテストで関心事が異なる場合は、Development modelとは別のTest modelが作られることになります。
例えば、状態遷移図の無効遷移が本当に無効かを確認するテストを考える場合、ソフトウェア設計で使われた状態遷移図を使いはするのですが、無効遷移の矢印を点線で追加したりします。これはDevelopment modelを改変しTest modelを作り出していることになります。
また、もともと書いていたシーケンス図のハッピーパスに対して、想定していないようなイベント(たとえば製品の電源断など)を割り込ませるようなテストも、当初のシーケンス図に対してイベントを割り込ませて正常動作に復帰できるシーケンスを新たに書き、それをテストしていると言えます。
上記2つはもともとDevelopment modelがあるものに対して追加・修正を入れるものでしたが、完全に新規でTest modelを描くケースもあります。
そういうものです。
まとめ
Test modelとDevelopment modelの違いはこんな感じですが、実際のテスト設計の現場は過度にDevelopment modelに依存しているのが現状ではないでしょうか。それってもうテストの価値がないって言っているようなものなので、必要なTest modelは自分で考えるようにした方がいいと思います。自戒をこめて。