пятница, 26 августа 2011 г.

Unit tests: DRY vs Clarity

Который раз сталкиваюсь с одной и той же проблемой, когда пишу юнит-тесты: накопипастить кучу (почти) одинаковых тестов, или "сгенерировать" их, сведя количество копипаста к нулю.

Представим ситуацию, когда тесты различаются только входными данными. Классический пример: тупой калькулятор, который умеет складывать числа.

Прямой, дубовый подход - каждый тест кейс представить в виде отдельной спеки:

Всё просто и понятно. Впрочем есть один недостаток: этот код содержит тонну копипаста, что может послужить источником ошибок и вообще оскорбляет чувство прекрасного.

Это же, но с циклом:

Гораздо короче. Однако этот код мне не нравится: cлишком много закорючек, тяжелее читать. А может я слишком придираюсь?

Не могу решить, что лучше: простая и очевидная простыня копипаста, или код немного посложнее, но компактнее и DRY-ёвее.

Кстати, в этих ваших жавах и сишарпах (NUnit и JUnit) используется подход, который и читаемый, и почти без копипаста:

Вот это мне по нраву. Жалко, в RSpec такого нету.

Кстати, в руби есть такой фреймворк - Cucumber. Он, правда, не для юнит-тестов, а для BDD. Вот в нём тесты выглядят человечнее всего:

Есть один минус и в кукумбере, впрочем. Тесты на нём можно сравнить с идеально чистой комнатой, где срач заметён под ковёр и закинут в шкаф, чтоб видно не было (см. "бэкграунд" этого теста здесь). Там регекспы, блоки, доллары и прочий шрот. Не так много, правда, чтоб его бояться.

Весь код - на гитхабе.

5 комментариев:

  1. В жабах и сишарпах тоже используют BDD. Вот реальный пример с гитхабу

    https://github.com/TargetProcess/Tp.Integration.Plugin.TaskCreator/blob/master/Tp.Integration.Plugin.TaskCreator.Tests/CreateTasksForNewUserStoryHandlerTests.cs

    Мне однозначно понравился, дает отличное представление о том, что конкретно тест проверяет. Получается практически человеческим языком описаный.

    Так что BDD скажем дружно да!
    А под ковром можно немного зарефакторить и т.п. тоже, чтобы прилично смотрелось, без копипасты

    ОтветитьУдалить
  2. Так BDD - это не замена юнит тестам.

    А та ссылка, что ты привёл - это ахтунг. Тесты в строковых литералах - это жопа, ящитаю :)

    ОтветитьУдалить
  3. И ещё радует то, что там местами по полсотни+ (!) пробелов в отступах. И радостное форматирование как в строчках 158-159 доставляет.

    ОтветитьУдалить
  4. > Так BDD - это не замена юнит тестам.
    Так я такого и не говорил, BDD - это способ сделать тесты понятными/читаемыми.

    > А та ссылка, что ты привёл - это ахтунг. Тесты в строковых литералах - это жопа, ящитаю :)
    Обоснуй :) Ты че в текстовые квесты в детстве не играл? :)

    ОтветитьУдалить