2

Java クラス ライブラリに対して一連のテスト コードを記述しようとしており、Scala で specs2 を使用しています。

クラス T のすべてのサブクラスに対して実行する必要があるテスト ケースのグループがありますが、これを実装する最善の方法を見つけることができませんでした。

Ruby から来たので、当然 Rspec のように *shared_examples_for* マクロのようなものを探しましたが、specs2 にはそのようなものはないようです。

次に、テスト ケースを使用して独自のSpecificationサブクラスをサブクラス化することが 1 つの方法であると考えました。

これに対するより適切な解決策はありますか?

4

2 に答える 2

3

共有された例の例は、ユーザー ガイドにあります。基本的に、これは、特定のインスタンスを取るメソッドを定義して、その例をテストおよび宣言できるという事実を利用しています (nonEmptyStackメソッドを参照)。

これが役に立ったら、 mutable を使用した簡単な例から始めましょうSpecification

 import org.specs2._

 class SubclassesSpec extends mutable.Specification {
   "These examples must pass for all subclasses" >> {
     subclasses foreach { subclass => examples(subclass) }
   }

   /** @return instances of subclasses of type T where T is 
    * the supertype of the classes you want to test */
   def subclasses: Seq[T] = ...

   /** @return examples parameterized by a specific instance */
   def examples(t: T) = {
     "this is the first example" >> {
       // use t here
     }
     "this is the second example" >> {
       // use t here
     }
   }
 }

その前に確認する必要があるのは、例間の副作用の可能性だけです。上記の仕様では、すべての例が同時に実行され、同じオブジェクトを共有しています問題が発生した場合は、次のいずれかを実行できます。

  • sequential並行性を避けるために仕様の先頭に追加します

  • subclassesexamplesdef subclasses: Seq[() => T]とに変更してdef examples(t: () => T)、例ごとに新しいインスタンスを作成します

于 2012-06-01T23:44:51.343 に答える
0

It's not specs2, but ScalaTest has such syntax:

http://www.scalatest.org/user_guide/sharing_tests

于 2012-06-01T21:10:12.737 に答える