Группировка тестовых случаев или" общие примеры для " эквивалента в specs2


Я пытаюсь написать кучу тестовых кодов для библиотеки классов Java, и я использую specs2 на Scala.

У меня есть группа тестовых случаев, которые должны выполняться для всех подклассов класса T, но никак не мог придумать, как лучше всего это осуществить.

Исходя из Ruby, я, естественно, искал что-то вроде *shared_examples_for* macro, как в Rspec, но, похоже, в specs2 такого нет.

Затем я подумал, подкласс моей собственной спецификации подкласса с тестовые случаи могут быть одним из способов пойти.

Есть ли более аккуратное решение для этого?

2 2

2 ответа:

Вы можете найти пример общих примеров в руководстве пользователя . В основном это использует тот факт, что вы можете определить метод, берущий конкретный экземпляр для тестирования и объявить примеры для него (см. Метод nonEmptyStack).

Если это поможет, позвольте мне начать с быстрого примера, используя изменяемый 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 в верхней части спецификации, чтобы избежать параллелизма

  • Измените subclasses и examples на def subclasses: Seq[() => T] и def examples(t: () => T) , чтобы создать совершенно новый экземпляр для каждого примера

Это не specs2, но ScalaTest имеет такой синтаксис:

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