Подтвердить что ты не робот

Как вы организовываете свои модульные тесты в TDD?

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

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

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

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

4b9b3361

Ответ 1

Разделите свои тесты на 2 набора:

  • функциональные тесты
  • тесты единиц

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

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

Ответ 2

Я пишу класс unit test для каждого класса в приложении и сохраняю тестовые классы в той же структуре пакета, что и тестируемые классы.

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

Ответ 3

Менее важной частью является организация тестов.

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

Более важная часть - рефакторинг тестов.

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

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

Тесты - это код.

Ответ 4

Для каждого класса программного обеспечения я поддерживаю класс unit test. Классы unit test следуют той же иерархии пакетов, что и тестируемые классы.

Я сохраняю свой unit test код в отдельном проекте. Некоторые люди также предпочитают сохранять свой тестовый код в одном проекте в отдельном исходном каталоге под названием "тест". Вы можете следить за тем, что вам удобно.

Ответ 5

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

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

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