Разделение классов JUnit на специальный тестовый пакет?

Я изучаю концепции Test-Driven Development, прочитав Статьи мастеров (нажмите "Ремесленник по теме" ), рекомендованный в ответ на мой предыдущий вопрос, Пример проекта для обучения JUnit и правильной разработки программного обеспечения. Мне это очень нравится!

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

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

Вы помещаете тестовые классы в org.myname.project.test. * и обычный код в org.myname.project. *? Вы ставите тестовые классы рядом с обычными классами? Вы предпочитаете префикс имен классов Test, а не суффикс?

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

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


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

Ответ 1

Я предпочитаю помещать тестовые классы в тот же пакет, что и тестируемые классы проектов, но в другом физическом каталоге, например:

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

В проекте Maven это будет выглядеть так:

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

Главное в этом состоит в том, что мои тестовые классы могут получать доступ (и тестировать!) классы и элементы класса пакета.

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

Обновить, вдохновленный комментарием @Ricket: таким образом, тестовые классы (как правило) появляются сразу после их тестируемого приятеля в проектном алфавитном списке имен классов. (Забавно, что я получаю пользу от этого дня и дня, не осознавая, насколько...)

Update2: Множество разработчиков (включая меня), таких как Maven, но, похоже, по крайней мере так много, кто этого не делает. IMHO очень полезно для "основных" Java-проектов (я бы поставил около 90% проектов в эту категорию... но остальные 10% все еще являются значительным меньшинством). Он прост в использовании, если можно принять соглашения Maven; однако если нет, это делает жизнь несчастной борьбой. Кажется, что Maven трудно понять для многих людей, социализированных на Ant, поскольку это, по-видимому, требует совершенно иного способа мышления. (Я никогда не использовал Ant, не могу сравнить эти два.) Одно можно сказать наверняка: это делает тестирование единицы (и интеграции) естественным, первоклассным шагом в этом процессе, что помогает разработчикам принять эту важную практику.

Ответ 2

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

Ответ 3

Я использую Maven. Структура, которую продвигает Maven: -

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

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

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