2014-09-03 2 views
2

На этапе re-factorTDD это нормально, чтобы разбить несколько существующих тестов как один раз. Например, чтобы изменить конструктор класса и внести поправки в те тесты, которые потребляют этот класс.Испытание TDD/Unit - ОК, чтобы нарушить существующие тесты

Тест-тест проверяет код behaviour, однако реализация теста arrange/act фактически тестирует сам код.

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

ответ

4

В идеале вам следует попытаться сохранить код установки для тестов в обычном месте, чтобы все тесты могли запрашивать экземпляр какого-либо типа для проверки из «авторитетного источника». Таким образом, первым шагом будет рефакторинг тестов, чтобы получить экземпляр из общего вспомогательного метода вместо вызова new.

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

Я часто называю это помощником TestDataFactory. Он немного знает об объектной модели, поэтому вы можете запросить у нее экземпляр Foo и он вернет экземпляр с большим количеством полезных тестовых данных в большинстве полей.

+0

Хотя я в основном согласен с @Aaron, я бы не стал беспокоиться о том, чтобы сразу разбить несколько тестов. Самое главное, чтобы вы тщательно проверили свой код. В самом деле, рекомендуется, и я должен иметь одно место для изменения разрыва кода, но иногда он добавляет излишнюю сложность. –

0

Это происходит со мной все время, с конструкторами или чем-либо еще, что называется в нескольких местах. Я не вижу в этом ничего общего, я обычно просто исправляю любые тесты, которые случайно потерпели неудачу, а затем продолжил испытание, в котором я был.

Некоторые люди думали о методах, чтобы избежать этого, особенно, работая с рефакторингом, где вы не хотите тратить часы в состоянии не компиляции. См., Например, концепцию "Limited Red", придуманную Джошуа Кериевским.

0

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

например.

var sut = CreateSUT(); 
var result = sut.MethodUderTest(); 
Assert.IsTrue(result); 

Для более сложных объектов вы можете рассмотреть возможность использования шаблона, такого как шаблон построителя тестовых данных. Это хорошо описывает рисунок blog.

0

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

Итак, что я обычно делаю, так это то, что я добавляю новый код с новым поведением, сохраняя старый в течение короткого периода времени (осуждаю его), достаточно долго, чтобы стабилизировать новые функции. Затем я решаю ВСЕ другие тесты в одной развертке, все в то же время, убедившись, что вы ТОЛЬКО исправить это.

В C# (в качестве примера) необязательные параметры со значениями по умолчанию действительно могут мне помочь, но в остальном я просто перегружаю или создаю новые методы ctor /.

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

Один главный i ДЕЙСТВИТЕЛЬНО не применим к модульному тестированию DRY. Я бы не рекомендовал никому принести это мышление в тестовый мир. DRY имеет тенденцию создавать тестовые тесты, которые трудно поддаются наблюдению. У меня довольно много кода в тестах, но легко следовать, чем DRY.

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