data driven parameterized testing with spock framework
Spockフレームワークを使用してデータ駆動型またはパラメーター化されたテストを作成する方法を探ります。
これで 無料スポックトレーニングチュートリアルシリーズ 、私たちはすべてを探索しました Spockでのユニットテスト 前のチュートリアルのフィクスチャ、アサーション、レポートをテストします。
このチュートリアルでは、パラメーター化されたテストとは何か、およびSpockの組み込み機能を活用してデータ駆動型テストを実現する方法を理解しようとします。
はじめましょう!!
ビデオチュートリアルを見る
学習内容:
パラメータ化されたテストとは何ですか?
自動化/単体テストを使用したことがある人にとって、データ駆動型テストは新しい用語ではありません。
パラメータ化されたテストは、同じ実行ロジックを共有し、場合によっては入力データと結果のみが異なるあらゆる種類のテストです。
例: 電卓アプリケーションがあるとします。機能を完全にテストするために、さまざまな入力セットに対してテストを実行することをお勧めします。
例: 負の値、小数、通常の整数、最大許容範囲に近い整数など。入力値に関係なく、同じ実行ロジックを実行する必要があります。
パラメータ化されたテストを作成するもう1つの理由は、ハッピーパスをテストするだけでなく、エラーパスやネガティブシナリオもテストすることです。
例: 指定されたファイル拡張子が有効かどうかを返すアプリケーションがあるとします。データ駆動型テストにより、開発者はサポートされているファイル拡張子のテストやエラーシナリオまたは否定的な入力テストをすばやく実行できます。
今では伝統的に、複数の入力値のテストを書き込んだりコピーしたりすることを考えることができますが、それはこの種のテスト実行を達成するための正しいまたは賢い方法ではありません。さらに、アプリでテストの数が増え始めると、これらのテストの保守が難しくなります。
Spockを使用したパラメーター化されたテストの作成
場所:ブロック
スポックテストのwhereブロックは、パラメーター化されたテストのデータを保持するブロックです。オプションで、入力値と期待される出力値の両方を含めることができます。このブロックについて注意すべき重要な点は、これがスポックテストの最後のブロックである必要があるということです。
そうは言っても、それは与えられたように他のすべてのブロックと組み合わせることができますが、最後のブロックでなければなりません。
例を見て理解を深めましょう
2つの入力パラメーターを受け取り、指定された入力の合計を返す計算機アプリケーションを使用します。複数の入力とexpectedOutput値を提供するパラメーター化されたテストを作成します。
def 'sample parameterized test'() input2
上記のコードサンプルでは、次のことがわかります。
- テストを実行するためのデータを含む「where」ブロック。
- 「where」ブロックは、テストの最後のブロックです。
- 「where」は他のブロックと組み合わされます。つまり、いつ、いつ与えられますか。
- データ表現は、データテーブルと呼ばれる特別な形式であり、このチュートリアルの次のセクションで詳しく説明します。
- データのヘッダー行は、基本的に、テストで直接使用できるプロパティ/入力変数です。 例えば。 直接使用した「when」ブロックのステートメントを参照してください input1 そして input2 明示的に定義せずに入力パラメータとして。
Datatablesの使用
それでは、データテーブルについて詳しく理解してみましょう。データテーブルの各行は、個々のシナリオ(テスト実行)のデータを表します。
慣例により、入力値の前にはシングルパイプ(「|」)が付き、出力値の前にはダブルパイプ(「||」)が付きます。これには論理的な意味はありませんが、慣例であり、読みやすさが向上します。したがって、以下の両方の例が当てはまります。
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
上に示したように、ヘッダー行には、テストするデータとして提供された各パラメーターの名前があります。ここで重要なのは、これらのパラメータ名がテスト内の既存のローカル/グローバル変数と衝突してはならないということです。衝突しないと、 コンパイル時エラー 変数名を解決します。
データテーブルを使用する際に注意すべき重要な点は、最低2列が必要であるということです。 1つの列が必要な場合は、値がアンダースコア文字である空白の列が次のような回避策になります。
input1 ||_ 10 ||_ -4 ||_
この形式の利点は、単純さ、読みやすさ、および拡張性です。新しいデータ入力の追加は、データ値を含む新しい行を追加するのと同じくらい簡単です。
ここで注意すべきもう1つのポイントは、データテーブルを使用して、あらゆるタイプの変数、クラス、オブジェクト、列挙型などを保持できることです。これにより、データテーブルがさらに強力になります。 groovyはオプションで型指定された言語であるため、明示的な型が指定されていない場合、データテーブルの変数は、提供されたデータの型に依存することを意味します。
別のものを見てみましょう 例 文字列のリストを入力として使用し、文字列内の要素の数として出力するデータテーブルを使用します。
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
上記の例では、入力を文字列の配列リストとして提供しており、出力はこの配列リストのサイズであることがわかります。したがって、さまざまなタイプの入力データを持つことで多くの柔軟性が得られます。
また、それぞれの入力タイプのデータを返し、データテーブルで直接使用する式についても簡単に言及できます。
「where」ブロックのライフサイクル
whereブロックとデータサンプルをデータテーブルの形式で含むテストの場合、データの各行はテストメソッドの1回の実行を表します。
例えば、 5行のデータがあり、テストに「given」ブロックと「when」ブロックが含まれている場合、そのようなデータ行に対して、テストブロックは1回実行されます。したがって、全体として、テストメソッドの実行は合計5回になります。
ヒントとコツ
これらのデータテーブルを操作しながら、パラメータ化されたテストのヒントとコツを見てみましょう。
#1)個々の行の実行結果を個別に表示します。ライフサイクルのセクションで見たように、データの各行に対して、テストコードの実行が1回あります。これらの行または結果をそのような行ごとに個別に表示するために、「@ Unroll」アノテーションをそのようなテストに使用できます。
例を挙げてこれを理解してみましょう。
同じ計算機アプリケーションを使用し、3セットの入力データをテスト対象のメソッドに提供します。
Windows10に最適なシステムオプティマイザー
def 'sample parameterized test'() -20
「@Unroll」アノテーションなしで、結果がターミナルでどのように表示されるかを見てみましょう(およびhtmlベースのレポート)。この種の出力では、どの入力セットがテストの失敗の原因であるかを見つけることが困難になります。
次に、テストメソッド(データ入力としてデータテーブルがある)に「@Unroll」アノテーションを追加した後、テスト出力が行ごとに個別にレポートされる方法を見てみましょう。
#二) ここで、これらのデータ駆動型テストに意味のある情報を追加する方法を理解しましょう(上のスクリーンショットのように自動追加されたインデックスの代わりに)。
(データテーブルに従って)入力プロパティと出力プロパティにプレースホルダーを使用すると、テスト名にデータテーブルのデータが入力された値を確認できます。
同じ例を使用してテスト名を更新し、データテーブルに記載されている入力と期待される出力からデータを取得しましょう。
@Unroll def 'result of adding #input1 & #input2 should be #expectedResult'() given: def app = new CalculatorApp() when: def resultSum = app.add(input1, input1) then: resultSum == 2 * input1 where: input1
次に、端末とHTMLベースのレポートで出力がどのように表示されるかを見てみましょう。
したがって、ここでわかるように、入力と出力からのデータは、実行時にテスト名とともに表示されます。このようにすると、テストが失敗または誤動作した原因となった入力が明確に示されるため、トラブルシューティングとデバッグがはるかに簡単になります。
結論
このチュートリアルでは、Spockフレームワークを使用してパラメーター化されたテストを作成する方法について学習しました。また、データテーブルのさまざまな機能とその使用方法についても説明しました。
スポックでモックとスタブを使用する方法を知るために、今後のチュートリアルをチェックしてください!