同じ特性/インターフェイスの複数の実装の単体テスト
-
20-09-2019 - |
質問
私は主に scala と java でプログラミングし、単体テストには scala の scalatest と junit を使用します。同じインターフェイス/特性のいくつかの実装にまったく同じテストを適用したいと考えています。その目的は、インターフェース契約が強制されていることを検証し、リスコフ置換原則をチェックすることです。
たとえば、リストの実装をテストする場合、テストには次のものが含まれる可能性があります。
- インスタンスは、サイズがゼロの場合に限り、空である必要があります。
- clear を呼び出した後、サイズはゼロになるはずです。
- リストの途中に要素を追加すると、rhs 要素のインデックスが 1 つ増加します。
- 等
ベストプラクティスは何ですか?
解決
この音が鳴ります。共用試験は、異なる固定具オブジェクトによって共有されている試験です。すなわち、同じテストコードは異なるデータ上で実行されます。 ScalaTestは、そのためのサポートを持っています。機能としてテストを表してお好みのスタイルの形質のドキュメントの「共有のテスト」を検索する(スペック、WordSpec、FunSuite、FlatSpec、など)。例はFlatSpecの構文は次のとおりです。
it should behave like emptyList
を参照してください。テストはFlatSpec
のドキュメントでを共有
他のヒント
のJava / JUnitのでは、私は一般的に、特定のテストクラスのテストは、すべてのテストを継承して実装をインスタンス化する設定方法を持って、そこから抽象的なテストケースを持っていることによって、これを処理します。私は今、投稿ビデオabyxを見ることはできませんが、私はそれがこの一般的なアイデアだと思う。
あなたはまだ別のテストフレームワークを導入する気にしない場合は、別の興味深い可能性は JDave 仕様クラスます。
私はScalatestまたはScalaの特徴と実装とこれらのいずれかを使用して試していないが、似た何かをすることは可能なはずである。
JUnit 4 を使用するとコントラクト テストが簡単に実行できます。 ここBen Rady によるビデオです。
スカラの場合、強力ScalaCheckを検討してください。それらの契約のすべてがScalaCheckの1行の仕様として表現されています。実行すると、ScalaCheckはランダムにサンプル入力の設定可能な数を生成し、仕様の全てを保有することを確認します。これは、ユニットテストを作成するために、可能な限り最も意味的に密な方法についてです。