Модульное тестирование нескольких реализаций одной и той же черты / интерфейса - PullRequest
13 голосов
/ 18 марта 2010

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 18 марта 2010

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

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

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

6 голосов
/ 05 августа 2010

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

it should behave like emptyList

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

4 голосов
/ 18 марта 2010

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

0 голосов
/ 05 августа 2010

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

...