Единичное тестирование нескольких реализаций одного и того же признака/интерфейса
Я программирую в основном в scala и java, используя scalatest в scala и junit для модульного тестирования. Я хотел бы применить те же самые тесты к нескольким реализациям одного и того же интерфейса/признака. Идея состоит в том, чтобы проверить, что контракт интерфейса заключен в действие, и проверить принцип замещения Лискова.
Например, при тестировании реализаций списков тесты могут включать:
- Экземпляр должен быть пустым, если и только тогда и только тогда, когда он имеет нулевой размер.
- После вызова clear, размер должен быть равен нулю.
- Добавление элемента в середине списка будет увеличивать на единицу индекс элементов rhs.
- и др.
Каковы наилучшие методы?
Ответы
Ответ 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 генерирует настраиваемое количество выборок в случайном порядке и проверяет, соблюдены ли все спецификации. Это о наиболее семантически плотном способе создания модульных тестов.