Одна из проверенных и проверенных моделей - это то, что используется стандартной планировкой проекта Maven и многими другими структурами сборки.
У нас есть отдельные каталоги src/main
и src/test
, но они оба находятся в одном проекте.
src/main
содержит весь производственный код и ничего больше.
src/test
содержит модульные тесты.
Конфигурация сборки определяет зависимости и знает разницу между классами тестов и производственными классами.
Для тестирования требуются некоторые зависимости. Наиболее принципиально, jUnit себя.Также думает, как насмешливые библиотеки (JMock, Mockito), такие утилиты, как Hamcrest, такие инструменты, как WireMock или RestClientDriver, собственные тестовые библиотеки и т. Д.
Эти библиотеки не нужны для запуска вашего производственного кода, поэтому вы должны 't связывает их в сборке, а также не объявляет их как зависимости.
В тестовом проекте вы обычно ожидаете, что у вас будет больше строк тестового кода, чем производственного кода. Таким образом, в том числе тестовый код серьезно увеличит размер вашего дистрибутива.
Maven ставит тестовые зависимости в пути к классам при компиляции и запуске тестов, но не помещает их в путь класса при компиляции производственного кода. Это означает, что если вы попытаетесь использовать jUnit, Mockito и т. Д. В производственном классе, вы получите ошибку компиляции - это то, что вы хотите.
Итак:
- производства кода и соответствующий тест в отдельных каталогах, в рамках того же проекта
- построение распределения включает в себя составление и запуск тестов
- встроенный артефакт не больше, чем нужно , так как он не содержит контрольного кода
Все это также имеет то преимущество, что программисты Java, как правило, знакомы с этим макетом. Программистам нравится не удивляться.
Ваши замечания:
- «JUnit тест как самодокументирования прямо возле кода метода»
Это верное наблюдение, и есть некоторый прецедент для написания тестов рядный по этой причине. Однако он, как правило, был в средах, где размер распределенного кода не имел значения, или где было средство для извлечения или игнорирования тестового кода как части сборки. Например, в C тесты могут быть в директиве препроцессора #IFDEF TEST
. Это связано с тем, что при удалении «тестового» кода вы удаляете что-то, что действительно необходимо для работы программного обеспечения, то есть код, который работает только при наличии тестового кода!
Поскольку макет Maven настолько знаком с Java-программистами, они знают, где найти модульные тесты. Многие IDE (или плагины) позволяют вам переключаться между классом и его модульным тестом с помощью нажатия клавиши - до тех пор, пока вы выполняете соглашения об именах.
- «Будет легко перенести этот код в другой класс или пакет»
На практике это редко является проблемой, но некоторые Иды (или плагинов) автоматизировать это в любом случае. Например, я считаю, что в IntelliJ IDEA, если вы переименуете класс или переместите его в другой пакет, его соответствующий тестовый класс также будет переименован или перемещен - опять же, если вы будете следовать соглашениям об именах.
-
Моя рекомендация состоит в том, что вы принимаете эти устоявшиеся практики, будь то с помощью Maven, Gradle или какой-либо другой системы сборки.
u не требуется тест для запуска производственного кода, так почему же должен быть в том же классе? – nafas