Обработка изменений интерфейса TDD - PullRequest
4 голосов
/ 26 сентября 2008

Я начал использовать TDD. Как уже упоминалось в , в предыдущем вопросе самая большая сложность - обработка изменений интерфейса. Как уменьшить влияние на тестовые наборы при изменении требований?

Ответы [ 9 ]

7 голосов
/ 26 сентября 2008

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

Часто при изменении интерфейса вы обнаруживаете, что «слишком много» тестов ломаются, то есть тесты для в значительной степени не связанных функций оказываются зависимыми от этого интерфейса. Это может быть признаком того, что ваши тесты слишком широки и требуют рефакторинга. Есть много возможных способов, которыми это может произойти, но вот пример, который, как мы надеемся, показывает общую идею, а также конкретный случай.

Например, если изменился способ создания объекта Account, и это требует обновления всех или большинства ваших тестов для вашего класса Order, что-то не так. Большинство ваших модульных тестов Order, вероятно, не заботятся о том, как создается учетная запись, поэтому рефакторинговые тесты выглядят так:

def test_add_item_to_order(self):
    acct = Account('Joe', 'Bloggs')
    shipping_addr = Address('123 Elm St', 'etc' 'etc')
    order = Order(acct, shipping_addr)
    item = OrderItem('Purple Widget')
    order.addItem(item)
    self.assertEquals([item], order.items)

к этому:

def make_order(self):
    acct = Account('Joe', 'Bloggs')
    shipping_addr = Address('123 Elm St', 'etc' 'etc')
    return Order(acct, shipping_addr)

def make_order_item(self):
    return OrderItem('Purple Widget')

def test_add_item_to_order(self):
    order = self.make_order()
    item = self.make_order_item()
    order.addItem(item)
    self.assertEquals([item], order.items)

Этот конкретный шаблон является Методом создания .

Преимущество здесь состоит в том, что ваши методы тестирования для Order изолированы от того, как создаются Счета и Адреса; если эти интерфейсы меняются, вам нужно изменить только одно место, а не каждый отдельный тест, в котором используются учетные записи и адреса.

Вкратце: тесты тоже являются кодом, и, как и весь код, иногда они нуждаются в рефакторинге.

6 голосов
/ 26 сентября 2008

I думаю это одна из причин модного аргумента, что интерфейсы используются слишком часто.

Однако я не согласен.

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

Надеюсь, это поможет, но, думаю, я неправильно понял ваш вопрос.

4 голосов
/ 26 сентября 2008

Там будет ударом. Вы просто должны признать, что изменение интерфейса потребует времени для изменения соответствующих тестовых примеров. Обойти это невозможно.

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

1 голос
/ 02 июня 2009

"Что мы должны сделать, чтобы предотвратить зависимость нашего кода и тестов от зависимостей? Кажется, что ничего. Каждый раз, когда изменяются реквизиты, мы должны менять наш код и тесты. Но, может быть, мы можем упростить нашу работу? Ключевой принцип: инкапсуляция кода, который может быть изменен. "

http://dmitry -nikolaev.blogspot.com / 2009/05 / ATCH-ваш-changes.html

1 голос
/ 28 сентября 2008

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

Теперь вдруг становится очевидным: если ваши требования изменятся, тесты должны измениться! Вот и весь смысл TDD!

Если бы вы работали с водопадом, вам пришлось бы изменить документ с техническими условиями. В TDD вы должны сделать то же самое, за исключением того, что ваша спецификация написана не в Word, а в xUnit.

0 голосов
/ 18 марта 2009

Если требования изменяются, то прежде всего следует изменить ваши тесты, а не интерфейс.

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

Нужно обновить оставшиеся неудачные тесты новым дизайном интерфейса, чтобы они снова прошли.

Обновление интерфейса в тестовом режиме гарантирует, что изменения действительно необходимы и доступны для тестирования.

0 голосов
/ 28 сентября 2008

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

Хорошая вещь - иметь разрывы тестов, любое изменение в вашем коде должно нарушать тесты.

0 голосов
/ 26 сентября 2008

Если вы придерживаетесь подхода Test First, теоретически не должно быть изменений интерфейса в вашем тестовом коде. В конце концов, когда вам нужно изменить интерфейс, вы сначала измените тестовые наборы, чтобы они соответствовали требованиям, а затем продолжите и измените свои интерфейсы / реализацию, пока тесты не пройдут.

0 голосов
/ 26 сентября 2008

Вы пишете тесты перед тем, как написать код для нового интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...