Как относиться к будущим требованиям с точки зрения TDD - PullRequest
4 голосов
/ 21 октября 2011

В последнее время, пытаясь внедрить больше практик TDD для проекта, я столкнулся с ситуацией, касающейся тестов, которые охватывают будущие требования, и мне интересно, как другие решают эту проблему.

Скажем, к примеру, я занимаюсь разработкой приложения SuperUberReporting, текущая версия 1.4. Поскольку я разрабатываю функции, которые должны быть включены в SuperUberReporting 1.5, я пишу тест для новой функции экспорта файлов, которая позволит экспортировать результаты отчетов в файл CSV. Во время написания этого теста мне пришло в голову, что функция поддержки экспорта в некоторые другие форматы намечена для более поздних версий 1.6, 1.7 и 1.9, которые задокументированы в программном обеспечении для отслеживания проблем. Теперь вопрос, с которым я сталкиваюсь, заключается в том, должен ли я писать тесты для этих других форматов или мне следует подождать, пока я действительно не реализую эти функции? Этот вопрос затрагивает нечто более фундаментальное в отношении TDD, которое я хотел бы задать более широко.

Могут ли / должны ли тесты быть написаны заранее, как только требования станут известны, или степень стабильности требований как-то определит, следует ли писать тест или нет?

В целом, как далеко должны быть написаны тесты? Можно ли написать тест, который потерпит неудачу в течение двух лет, пока не планируется реализовать эту функцию? Если это так, то как можно организовать свои тесты, чтобы разделить тесты, которые необходимо пройти, и тесты, которые не пока не требуются для прохождения? В настоящее время я использую NUnit для проекта .NET, поэтому я не возражаю против специфики, поскольку они могут лучше продемонстрировать, как добиться такой организации.

Ответы [ 3 ]

5 голосов
/ 21 октября 2011

Если вы правильно работаете с TDD, у вас будет сервер непрерывной интеграции (что-то вроде Cruise Control, TeamCity или TFS), который создает ваш код и запускает все ваши тесты каждый раз, когда вы регистрируетесь. терпит неудачу.

Так что нет, ты не пишешь тесты заранее. Вы пишете тесты для того, над чем вы работаете сегодня, и проверяете, когда они проходят.

Неудачные испытания - это шум. Если у вас есть неудачные тесты, которые, как вы знаете, провалились, вам будет гораздо труднее заметить, что произошел другой (законный) сбой. Если вы стремитесь всегда проходить все свои тесты, то даже один не пройден Тест - это большой предупредительный знак - он говорит, что пришло время отбросить все и исправить эту ошибку. Но если вы всегда говорите: «О, хорошо, у нас всегда есть несколько сотен неудачных тестов», то, когда появляются настоящие ошибки, вы не замечаете. Вы сводите на нет основное преимущество тестирования.

Кроме того, сейчас глупо писать тесты для того, над чем вы не будете работать годами. Вы откладываете то, над чем вы должны сейчас работать, и теряете работу, если эти будущие функции будут урезаны.

2 голосов
/ 21 октября 2011

У меня нет большого опыта работы с TDD (только недавно начатой), но я думаю, что во время практики TDD тесты и реальный код идут вместе. Помните Красный-Зеленый-Рефакторинг. Поэтому я бы написал достаточно тестов, чтобы охватить мою текущую функциональность. Написание тестов заранее для будущих требований не может быть хорошей идеей.

Может быть, кто-то с большим опытом может дать лучшую перспективу.

0 голосов
/ 21 октября 2011

Тесты на будущие функциональные возможности могут существовать (у меня есть спецификации BDD для вещей, которые я буду реализовывать позже), но должен либо (а) не запускаться, либо (б) запускаться как без ошибок »"тесты.

От системы не ожидается, что они их пройдут (пока): они не являются допустимыми тестами и не должны служить действительным указанием функциональности системы.

...