14

私は主に scala と java でプログラミングし、scala で scalatest を使用し、単体テストには junit を使用します。同じインターフェイス/特性のいくつかの実装にまったく同じテストを適用したいと思います。アイデアは、インターフェイス コントラクトが適用されていることを確認し、Liskov 置換原則を確認することです。

たとえば、リストの実装をテストする場合、テストには次のものが含まれます。

  • サイズがゼロの場合に限り、インスタンスは空であるべきです。
  • clear を呼び出した後、サイズはゼロになるはずです。
  • リストの途中に要素を追加すると、rhs 要素のインデックスが 1 つ増えます。

ベストプラクティスは何ですか?

4

4 に答える 4

8

Java/JUnit では、一般に、特定のテスト クラスのテストがすべてのテストを継承する抽象的なテストケースを用意し、実装をインスタンス化する setup メソッドを用意することでこれを処理します。現在 abyx が投稿したビデオを見ることはできませんが、この一般的な考えだと思います。

さらに別のテスト フレームワークを導入することを気にしない場合、もう 1 つの興味深い可能性は、JDave仕様クラスを使用することです。

これらのいずれかを Scalatest または Scala の特性と実装で使用しようとしたことはありませんが、同様のことができるはずです。

于 2010-03-18T11:09:44.120 に答える
7

これは、共有テストの仕事のように思えます。共有テストは、異なるフィクスチャ オブジェクトによって共有されるテストです。つまり、同じテスト コードが異なるデータに対して実行されます。ScalaTest はそれをサポートしています。テストを関数として表すお気に入りのスタイル特性 (Spec、WordSpec、FunSuite、FlatSpec など) のドキュメントで「共有テスト」を検索します。例は、FlatSpec の構文です。

it should behave like emptyList

ドキュメントの「テストの共有」を参照してくださいFlatSpec

于 2010-08-05T01:30:54.730 に答える
4

コントラクト テストは JUnit 4 で簡単に実行できます。Ben Rady によるビデオ はこちらです。

于 2010-03-18T09:53:03.573 に答える
0

Scala の場合は、ScalaCheck を強く検討してください。これらのコントラクトはすべて、ScalaCheck で 1 行の仕様として表現できます。実行すると、ScalaCheck は構成可能な数のサンプル入力をランダムに生成し、すべての仕様が成り立つことを確認します。これは、単体テストを作成するための可能な限り最も意味密度の高い方法に関するものです。

于 2010-08-05T01:47:10.627 に答える