Что сделать, когда новая возможность заставляет существующие модульные тесты становиться недопустимыми?

Существует два подхода, которые я использовал для инструментов ARM/Linux. Самое легкое должно загрузить предварительно созданный набор инструментальных средств непосредственно.
Pro: Это просто работает, и можно продолжить интересную часть проекта
Con : Вы застреваете с тем, какой бы ни версия gcc/binutils/libc, который они выбрали

, Если более поздние вопросы Вам, проверьте crosstool-ng. Этот проект является инструментом конфигурирования, подобным приложению конфигурирования ядра Linux. Набор, какие версии gcc, binutils, libc (GNU или uCLibc), поточная обработка и ядро Linux для создания и crosstool-ng делают остальных (т.е. загружает шары tar, настраивает инструменты и создает их).
Pro: Вы получаете точно, что Вы выбрали во время конфигурации
Con: Вы получаете точно, что Вы выбрали во время конфигурации

значение, что Вы берете полную ответственность за выбор compiler/binutil/libc и их связанных функций/недостатков/ошибок. Кроме того, как упомянуто в комментариях, существует некоторая "боль", вовлеченная в выбор версий binutils, библиотека C и т.д. как не, все комбинации обязательно сотрудничают или даже создают.

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

Обновление : ответ первоначально использовал инструменты CodeSourcery как пример предварительно созданного набора инструментальных средств. Инструменты CodeSourcery для ARM были бесплатными к загрузка с Mentor Graphics , но их теперь называют Sourcery CodeBench и нужно купить у Mentor Graphics. Другие опции теперь включают Linaro, а также распределение определенные инструменты от Android, Ubuntu и других.

11
задан Kurt Schindler 18 August 2009 в 18:29
поделиться

6 ответов

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

8
ответ дан 3 December 2019 в 07:13
поделиться

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

4
ответ дан 3 December 2019 в 07:13
поделиться

Я думаю, здесь следует учесть две вещи. И я не знаю, думаете ли вы только об одном или обоих.

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

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

0
ответ дан 3 December 2019 в 07:13
поделиться

Реализация функции включает в себя запись / обновление модульных тестов; это фундаментально для разработки через тестирование. Итак, ваши вторые два варианта также являются TDD, а не только вашим первым. На практике я подозреваю, что вам понадобится третий вариант с некоторыми модами:

  1. Напишите тесты для функции (так как это поможет вам проверить свой API / UI для нее)
  2. Напишите функцию
  3. Просмотрите модульные тесты в этой общей области, чтобы увидеть те, которые должны сломаться.
  4. Запустить тесты
  5. Исправьте те, которые ломаются, и если в вашем списке из № 3 есть какие-то, которые не сломались, исправьте их (они должны были сломаться). Если какая-то поломка, которую вы не определили, исследуйте, чтобы убедиться, что она действительно верна - исправьте тест или функцию соответствующим образом.
  6. Прибыль; -)
4
ответ дан 3 December 2019 в 07:13
поделиться

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

чтобы поддерживать то, чего вы пытаетесь достичь, и не должны работать против вас.

0
ответ дан 3 December 2019 в 07:13
поделиться

Я думаю, что все подходы разумны. Вы получите тот же результат.

Некоторым людям нравятся более мелкие шаги и больше работать в исходном замысле TDD: написать строку теста, написать строку кода, чтобы исправить это, повторить. Если это вы, то сначала постепенно поработайте над своими старыми тестами, развивая или удаляя их в новую систему.

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

Может действительно зависеть от вашего уровня комфорта и уверенности.

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

1
ответ дан 3 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: