2010-03-18 2 views
12

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

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

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

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

ответ

6

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

it should behave like emptyList

См Sharing Tests в FlatSpec документации

4

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

+0

Отлично! Эта техника работает также с Scalatest? – paradigmatic

+0

Извините, нет подсказки :) – abyx

+0

Я просто пробовал с помощью scalatest и, похоже, сработал. Благодарю. – paradigmatic

8

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

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

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

0

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

Смежные вопросы