Подтвердить что ты не робот

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

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

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

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

Каковы наилучшие методы?

4b9b3361

Ответ 1

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

it should behave like emptyList

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

Ответ 2

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

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

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

Ответ 3

Контрактные тесты легко сделать с JUnit 4, здесь видео Ben Rady.

Ответ 4

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