Модульное тестирование нескольких реализаций одного и того же типажа/интерфейса

Я программирую в основном на scala и java, используя scalatest в scala и junit для модульного тестирования. Я хотел бы применить одни и те же тесты к нескольким реализациям одного и того же интерфейса/признака. Идея состоит в том, чтобы убедиться, что контракт интерфейса соблюдается, и проверить принцип подстановки Лискова.

Например, при тестировании реализации списков тесты могут включать:

  • Экземпляр должен быть пустым тогда и только тогда и только тогда, когда он имеет нулевой размер.
  • После вызова очистки размер должен быть равен нулю.
  • Добавление элемента в середину списка увеличивает на единицу индекс правых элементов.
  • и т.п.

Каковы лучшие практики?


person paradigmatic    schedule 18.03.2010    source источник


Ответы (4)


Похоже, это может быть работа для общих тестов. Общие тесты — это тесты, которые совместно используются разными объектами фикстур. То есть один и тот же тестовый код запускается на разных данных. ScalaTest поддерживает это. Найдите «общие тесты» в документации вашей любимой черты стиля, которая представляет тесты как функции (Spec, WordSpec, FunSuite, FlatSpec и т. д.). Примером может служить синтаксис FlatSpec:

it should behave like emptyList

См. раздел Общие тесты в FlatSpec документации.

person Bill Venners    schedule 05.08.2010

В Java/JUnit я обычно справляюсь с этим, имея абстрактный тестовый пример, из которого тесты для конкретного тестового класса наследуют все тесты и имеют метод установки, создающий экземпляр реализации. Я не могу смотреть видео, выложенное abyx прямо сейчас, но я подозреваю, что это общая идея.

Еще одна интересная возможность, если вы не возражаете против введения еще одной среды тестирования, заключается в использовании классов спецификаций JDave. .

Я не пробовал использовать ни один из них со Scalatest или с чертами и реализациями Scala, но должно быть возможно сделать что-то подобное.

person Don Roby    schedule 18.03.2010

Контрактные тесты легко выполнить с помощью JUnit 4, здесь это видео Бена Рэди.

person abyx    schedule 18.03.2010

Для Scala настоятельно рекомендуется использовать ScalaCheck. Все эти контракты выражаются в виде однострочных спецификаций в ScalaCheck. При запуске ScalaCheck будет случайным образом генерировать настраиваемое количество выборочных входных данных и проверять выполнение всех спецификаций. Это наиболее семантически плотный способ создания модульных тестов.

person Dave Griffith    schedule 05.08.2010