このブログは「Model-Based Testing in Practice with the Squish IDE」を翻訳・一部加筆したものです。
以前に紹介したモデルベーステスト(MBT)のフォローアップとして、この記事ではMBTの原則とベストプラクティスをより深く掘り下げ、近日リリースされた Squish GUI Tester 8.0におけるMBTの実践的な使い方を紹介します。
モデルベーステストは、ソフトウェアテストの設計と実行に対する体系的なアプローチであり、被テストシステム(SUT)の抽象化としてモデルを活用します。従来のテストとは異なり、モデルベーステストはシステムの複雑な細部を精査する代わりに、抽象的で部分的なモデルがSUTの望ましい振る舞いを表現することを目的とし、テストプロセスをより一般的にガイドします。
SUTのモデルは、状態および状態遷移を表すボックスと矢印を持つ状態図として表現することができます(他にもアクティビティ図、BPMN、UML図など、システムの抽象化を表現するために使用できる図があります)。モデルベースアプローチの主な考え方は、テストケースを作成または生成する際に、このようなシステムの抽象化を活用することにあります。
ソフトウェア開発やテストに使用されるモデルには、さまざまな抽象化レベルが存在します。適切なレベルのモデルを選択することは重要です。なぜなら、正確に必要なものをカバーする意味のあるテストケースだけを選択し、テスト作業を効率化することができるからです。
最も抽象度の高いレベルでは、ケース図や振る舞いモデルはシステムの大まかな振る舞いの概要を提供します。システムのより具体的な側面を把握したい場合、状態や状態遷移を表す状態図や、相互作用を表すシーケンス図が非常に適しています。
最も抽象度の低いレベルでは、個々の状態や相互作用がより詳細に分解された非常に特殊なモデルや、個々のコンポーネントが2つ以上のアトミックなサブコンポーネントの複合体となる複雑なマルチレベルモデルが存在します。
近日リリースされたSquish GUI Tester 8.0は、Squish IDEでモデルベーステストのための包括的なツールセットを提供する最初のステップです。このバージョンでは、使いやすいグラフィカルMBTモデルエディタとMBTテストケース(パス)エディタを提供します。
MBTモデルとMBTテストケースは、既存のテストプロジェクトに完全に統合されます。これにより、他のリソースやスクリプト化されたテストケース、またはビヘイビア駆動型(BDD)テストケースと共にテストスイートの中で共存することができます。MBTステップの実装には共有テストスクリプトを活用することが可能であり、ステップのスケルトン生成、コード補完、およびサポートされているすべてのスクリプト言語用のスクリプトAPIも提供されています。
モデルベーステストの実践的なデモンストレーションにおいて、SUTモデルは簡略化されたアクティビティ図として表現されます。この図は、システムに対してどのようなアクションやステップ(ボックス)をどの順序で実行できるかを定義します。ステップ間の接続(矢印)は、どのステップが先行し、どのステップが後続するかを示します。図内の各パスは、可能なテストシナリオとして考えられます。
通常、テスト対象のアプリケーション(AUT)はコーヒーマシンの画面上で動作し、ユーザーにカフェイン入りの飲み物を選んでもらい、砂糖とミルクの量を調整させ、抽出プロセスを終了させます。AUTのウェルカムスクリーンと、その振る舞いを表現するモデルは、次のようになります:
デモでは、1つのアクティビティ図のパスに基づいて、2つのシンプルなテストケースを紹介します。最初のテストケースでは、エスプレッソを抽出します。
2つ目のテストケースでは、ミルクと砂糖の量を調整しながら、コーヒーマシンがラテを淹れます。
テストケースを実行すると、Squish GUI TesterはAUT(Application Under Test)を制御し、アクティビティ図のパスで指定された順序で、指定されたステップを再生します。各ステップは、スクリプト言語(この例ではPython)で記述された関数であり、テストケースが特定のステップに到達したときに実行される実装と関連しています。これらの関数は、ユーザとAUTとのインタラクションを自動化したり、アプリケーションオブジェクトのプロパティを検証したりする役割を果たします。以下は、私たちのサンプルモデルのいくつかのステップの実装例です:
@mbt.step("Click on Macchiato")
def step():
mouseClick(waitForObject(names.macchiato_button))
test.vp("VP_macchiato")
# -------- Setting milk and sugar --------
@mbt.step("Set milk")
def step():
mousePress(waitForObject(names.milk_slider_handle))
slider = waitForObject(names.coffee_sugarSlider_Slider)
x = builtins.int(slider.width * random.random())
y = builtins.int(slider.height * 0.5)
mouseMove(slider, x, y)
mouseRelease()
snooze(0.5)
しかし、私たちのモデルと先ほど取り上げた2つの単純なテストケースには、1つの機能が欠けています。「Brew me a cup」画面から戻って、別の飲み物を選択するシナリオです。このシナリオをテストできるようにするため、Squish IDEのMBTモデルエディタを使用してモデルを次のように拡張します:
ステップ追加モードでは、「戻る」操作を表す新しいステップを導入します
コネクト・ステップ・モードでは、ダイアグラムの残りのステップに接続します
Generate missing steps implementations機能を使用して、新しいステップの後ろに空のテンプレート実装を生成します。
「戻る」ボタンをタップまたはクリックすることで、空の実装を実際の機能に置き換えます:
@mbt.step("Go back")
def step():
mouseClick(waitForObject(names.back_button))
それでは、選択を変更するために戻って別の飲料を抽出する機能を実行する新しいモデルベースのテストケースを作成しましょう。ワークフローは、先ほどモデルに追加したステップを含むアクティビティ図(SUTのモデル)を通るパスで表現されます。
Squish IDEを使用して、他のテストケース(スクリプトまたはビヘイビア駆動型)を実行するのと同様に、MBT(モデルベーステスト)テストケースも実行できます。テスト結果ビューと同様に、MBTテストケースエディタの右側にあるステップのリストは、合格したかどうかを色やアイコンで示します。
モデルベースのテストは、自動テストに戦略的なアプローチを提供します。これにより、欠陥を早期に発見しやすくし、開発チーム内のコミュニケーションを向上させます。Squish GUI Tester 8.0は、体系的で組織的なテスト手法を求めるテストエンジニア向けに、モデルベーステストをソフトウェア開発ライフサイクルに組み込むための強力なツールセットを提供します。
モデル・ベース・テストに興味をお持ちですか?
次に何をすべきか、いくつかのアイデアをご紹介します:
Note: Squish GUI TesterのMBTサポートは技術的なプレビューです(既知の制限事項についてはSquishナレッジベースをご覧ください)。将来的には改良し、最高品質のツールを提供できるよう努めていますので、MBTに関心のあるすべてのユーザーとテスターの皆様からフィードバックをお待ちしています。