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

StackOverflow https://stackoverflow.com/questions/2468697

Вопрос

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

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

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

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

Это было полезно?

Решение

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

it should behave like emptyList

Видеть Обмен тестами в FlatSpec документация

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top