Который раз сталкиваюсь с одной и той же проблемой, когда пишу юнит-тесты: накопипастить кучу (почти) одинаковых тестов, или "сгенерировать" их, сведя количество копипаста к нулю.
Представим ситуацию, когда тесты различаются только входными данными. Классический пример: тупой калькулятор, который умеет складывать числа.
Прямой, дубовый подход - каждый тест кейс представить в виде отдельной спеки:
Всё просто и понятно. Впрочем есть один недостаток: этот код содержит тонну копипаста, что может послужить источником ошибок и вообще оскорбляет чувство прекрасного.
Это же, но с циклом:
Гораздо короче. Однако этот код мне не нравится: cлишком много закорючек, тяжелее читать. А может я слишком придираюсь?
Не могу решить, что лучше: простая и очевидная простыня копипаста, или код немного посложнее, но компактнее и DRY-ёвее.
Кстати, в этих ваших жавах и сишарпах (NUnit и JUnit) используется подход, который и читаемый, и почти без копипаста:
Вот это мне по нраву. Жалко, в RSpec такого нету.
Кстати, в руби есть такой фреймворк - Cucumber. Он, правда, не для юнит-тестов, а для BDD. Вот в нём тесты выглядят человечнее всего:
Есть один минус и в кукумбере, впрочем. Тесты на нём можно сравнить с идеально чистой комнатой, где срач заметён под ковёр и закинут в шкаф, чтоб видно не было (см. "бэкграунд" этого теста здесь). Там регекспы, блоки, доллары и прочий шрот. Не так много, правда, чтоб его бояться.
Весь код - на гитхабе.