Который раз сталкиваюсь с одной и той же проблемой, когда пишу юнит-тесты: накопипастить кучу (почти) одинаковых тестов, или "сгенерировать" их, сведя количество копипаста к нулю.
Представим ситуацию, когда тесты различаются только входными данными. Классический пример: тупой калькулятор, который умеет складывать числа.
Прямой, дубовый подход - каждый тест кейс представить в виде отдельной спеки:
Всё просто и понятно. Впрочем есть один недостаток: этот код содержит тонну копипаста, что может послужить источником ошибок и вообще оскорбляет чувство прекрасного.
Это же, но с циклом:
Гораздо короче. Однако этот код мне не нравится: cлишком много закорючек, тяжелее читать. А может я слишком придираюсь?
Не могу решить, что лучше: простая и очевидная простыня копипаста, или код немного посложнее, но компактнее и DRY-ёвее.
Кстати, в этих ваших жавах и сишарпах (NUnit и JUnit) используется подход, который и читаемый, и почти без копипаста:
Вот это мне по нраву. Жалко, в RSpec такого нету.
Кстати, в руби есть такой фреймворк - Cucumber. Он, правда, не для юнит-тестов, а для BDD. Вот в нём тесты выглядят человечнее всего:
Есть один минус и в кукумбере, впрочем. Тесты на нём можно сравнить с идеально чистой комнатой, где срач заметён под ковёр и закинут в шкаф, чтоб видно не было (см. "бэкграунд" этого теста здесь). Там регекспы, блоки, доллары и прочий шрот. Не так много, правда, чтоб его бояться.
Весь код - на гитхабе.
В жабах и сишарпах тоже используют BDD. Вот реальный пример с гитхабу
ОтветитьУдалитьhttps://github.com/TargetProcess/Tp.Integration.Plugin.TaskCreator/blob/master/Tp.Integration.Plugin.TaskCreator.Tests/CreateTasksForNewUserStoryHandlerTests.cs
Мне однозначно понравился, дает отличное представление о том, что конкретно тест проверяет. Получается практически человеческим языком описаный.
Так что BDD скажем дружно да!
А под ковром можно немного зарефакторить и т.п. тоже, чтобы прилично смотрелось, без копипасты
Так BDD - это не замена юнит тестам.
ОтветитьУдалитьА та ссылка, что ты привёл - это ахтунг. Тесты в строковых литералах - это жопа, ящитаю :)
И ещё радует то, что там местами по полсотни+ (!) пробелов в отступах. И радостное форматирование как в строчках 158-159 доставляет.
ОтветитьУдалить> Так BDD - это не замена юнит тестам.
ОтветитьУдалитьТак я такого и не говорил, BDD - это способ сделать тесты понятными/читаемыми.
> А та ссылка, что ты привёл - это ахтунг. Тесты в строковых литералах - это жопа, ящитаю :)
Обоснуй :) Ты че в текстовые квесты в детстве не играл? :)
Их дебажить тяжело.
ОтветитьУдалить