2009-05-01 9 views
44

У меня есть 2 вопроса об организации модульных тестов.Где я должен поместить свои тесты JUnit?

  1. Должен ли я поставить тест на тот же пакет, что и проверенный класс, или я могу организовать тесты в разных пакетах?

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

  2. Что относительно насмешек и классов-заглушек? Должен ли я отделить их от пакетов, содержащих только тесты, или собрать их вместе?

ответ

56

Способ, которым мы выполняем наши тестовые примеры JUnit, состоит в том, чтобы поместить их в один и тот же пакет, но в другом корневом каталоге. Поскольку мы используем Maven, мы просто используем стандартные расположения, которые делают структуру похожей на следующую.

src/main/java/com/foo/Bar.java 
src/test/java/com/foo/BarTest.java 

Очевидно, что больше к структуре, но это позволяет нам строить тесты отдельно от кода магистрального, но до сих пор доступ к защищенным классам и тому подобные. Что касается различных типов тестов, это очень субъективно. Когда мы начали тестирование (которое, к сожалению, началось после разработки), я старался держать вещи довольно изолированными. К сожалению, это быстро стало кошмаром, когда мы добрались до 500 + контрольных точек. С тех пор я попытался сделать больше консолидации. Это привело к уменьшению количества кода для поддержания. Как я уже сказал, это очень субъективно.

Что касается тестового кода, мы храним его в отдельном пакете com.foo.test, который находится только в дереве src/test/java.

+13

Подобные вещи здесь, за исключением того, что мы используем «src/com/foo/...» и «test/com/foo/...». –

+0

Лично я нахожу ответ Боба еще лучше. Даже если JUnit test _is_ исходный код. – guerda

+3

Честно говоря, единственная причина, по которой я пошел с src/main/java и src/test/java, - это то, что мне не нужно было бы делать никакой дополнительной настройки Maven. –

3

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

2

Сохранение этого же пакета позволяет использовать видимость пакета для кода, предназначенного для доступа только через тест.

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

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

TestNG гораздо более дружелюбен к этой парадигме, чем JUnit.

3

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

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

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

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