見出し画像

[QCの基本]テストインスタンスについて

これは2013年11月13日にHPのサイトで公開したブログ記事の転載です。

-----

QCを使って行くときに理解しておきたいコンセプトの一つに「テストインスタンス」があります。

オブジェクト指向を学ぶと、クラスとインスタンスの関係についての説明が出てくると思いますが、それと一緒です。クラスとインスタンスの関係はたい焼き器とたい焼きで説明してるこれとかで見てもらえればわかりやすいと思います。

テストケースも、クラスとインスタンスの関係に分けられると言うのがQCの発想です。QCのような管理ツールはこのインスタンスの概念をベースにしたやり方を実現するために必須になります。もし、テストインスタンスについて理解していないとメリットも理解できないでしょう。

簡単に説明して行きます。

---

■テスト設計したテストケースは、クラスです。

■テスト実行の入力値、操作、期待値の比較結果(合格したかどうか)などの実績が入ったテストケースが、インスタンスです。

---

つまり、テスト実行するときに、テスト設計してつくったテストケース(これはクラス)を、インスタンスにして実行していると考えるのです。

このメリットはいくつかあります。

1、目的が理解できるようなテストケースを作りやすくなる

まず、実行時の具体的なテストケースで使う入力や事前条件、これらは、例えば「5」を入力しました。と行った具体的な値を使ってテスト実行するのですが、なぜ「5」なのか?「4」ではいけないのか?と思いますよね。どっちでも良いかもしれないし、もしかしたら5でないとダメかもしれないっていう理由があるかもしれません。

その理由は「同値分割」といった技法として話されることが多いです。5とか4といった具体的な値は、ある理由でグルーピングされたクラスの中から値を選んでいるにすぎないのです。

ですから、テストケースを設計したときにはその理由をちゃんと明記しておき(同値クラスとして明記すると言う意味です)、テスト実行する際に、具体的な値にして実行した方が、意図が分かるテストができるようになります。

そうなるとクラスとインスタンスは別にして管理したほうがよくなります。

QCはテストとしてクラスを登録し、実行用にインスタンスを登録すると言った感じで、テストクラスとテストインスタンスに対して、別の管理が出来るように作られています。QCのルールにあわせて作ると、クラス(理由)と、インスタンス(実行内容)を混乱しないで管理できるようになるのです。

また、最初のテストでは設計した値の組み合わせを全部しておき、次のサイクルで同じテストクラスを使う際は代表的な値の組み合わせだけをテストしておくとか、いままでテスト設計した中には無かった値の組み合わせを追加すると言ったことも混乱せずにできるようになります。このことをQCではテストコンフィグレーション(テスト設定)と呼んでいます。

2、再利用しやすいテストケースが作りやすくなる

もっとシンプルな理由でもクラスとインスタンスを分けるメリットがあります。

QCはテストクラスをバージョン管理します。同じテストを何回か行うときにこのテストインスタンスはどのバージョンのテストクラスをインスタンス化したのか?というのが管理できます。

同じテストを何回か行ったときに、スプレッドシートの同じ行にクラス(テストケース)とインスタンス(実行結果)を列挙していると、仕様変更が入ってテストを修正してしまったときに(つまりクラスが変わる)過去のテスト結果のテストケースと今のテストケースが違ってしまったりします。そうならないように一行に履歴まで含めて管理すると列が膨大になっていくか、備考欄に様々なことが記述されていきます。何十も列が出来て行き、アドホックに追記されていくので、煩雑になり非常に読みづらくなります。(1セルの中に数百文字かかれたテストケースって読みづらいですよね?)

その問題を解決するためにテストケースをコピーをしてモディファイして使うこともあると思いますが、そうなると同じようなテストケースがいろいろなファイルに散在する原因になってしまいます。テストする時期が異なると保存している場所が全然違ったりして、当初考えたテストケースの整理、体系通りに配置できなくなって行きます。

こうなるとテストケースを再利用するときに、似たようなテストケースからどれを持ってきて使い回すのかを調べるのも大変です。どのコピーが最新かも調べるのが難しくなり、最新でないテストをコピーしてしまうと言ったぽかミスを誘発しやすくなります。調べる時間がテスト実行の時間の何倍もかかると言った弊害が出る可能性もあります。

テスト数をカウントする際もコピーしただけのテストを同列に集計することで本当はいくつのテストケースがあるのか?と言ったことを調べるのも同様に時間がかかります。

テストインスタンスはテスト実行時の都合に合わせてテストケースの記述が崩れていくのを防ぐのです。再利用しやすくするためには最初に構造を考えて、体系的にしておくことが重宝になりますが、インスタンスの概念で管理しないと、最初に考えた再利用しやすい構造がいとも簡単に壊れてしまうのです。

---

テストインスタンスと言う概念を理解して、テストケースを管理するのはとても重要であることが理解して、目的を理解できるテストケースを書き、再利用しやすい構造が崩れないように維持できるようにしていくようにしていきましょう。





サポートありがとうございます。これをカテにこれからも頑張ります。