Группировка тестовых случаев или" общие примеры для " эквивалента в specs2
Я пытаюсь написать кучу тестовых кодов для библиотеки классов Java, и я использую specs2 на Scala.
У меня есть группа тестовых случаев, которые должны выполняться для всех подклассов класса T, но никак не мог придумать, как лучше всего это осуществить.
Исходя из Ruby, я, естественно, искал что-то вроде *shared_examples_for* macro, как в Rspec, но, похоже, в specs2 такого нет.
Затем я подумал, подкласс моей собственной спецификации подкласса с тестовые случаи могут быть одним из способов пойти.
Есть ли более аккуратное решение для этого?
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)
, чтобы создать совершенно новый экземпляр для каждого примера