Модульные тесты Java, макет каталога
при создании набора модульных тестов для кода Java существует ли соглашение о том, где разместить тестовый код по отношению к исходному коду?
например, если у меня есть каталог /java который содержит кучу .java исходные файлы, лучше поставить тестовые случаи в или использовать что-то вроде /java/test.
если последнее предпочтительнее, как вы тестируете внутренние части кода, когда private/protected члены класса недоступны снаружи посылка?
6 ответов:
вы можете поместить тесты в тот же пакет, что и исходные классы, даже если исходный код находится в собственном корневом каталоге:
PROJECT_ROOT +--- src/ +----test/вы можете объявить класс
com.foo.MyClassподsrcи его тестcom.foo.MyClassTestподtest.что касается доступа к закрытым членам, вы можете использовать отражение для вызова методов (изменение их доступности через
Class.getDeclaredMethod.setAccessible), или вы могли бы использовать что-то вроде testng / junit5, чтобы поставить некоторые аннотации-управляемые тесты на сам исходный код (я лично думаю, что это плохая идея).почему бы не проверить некоторые проекты
java.netчтобы увидеть, как они организовали вещей, например swinglabs (репозиторий SVN довольно медленный, я боюсь)?
рекомендую после стандартная структура каталогов Apache Software Foundation, что дает следующее:
module/ src/ main/ java/ test/ java/это сохраняет тесты отдельно от источника, но на том же уровне в структуре каталогов. Если вы прочитаете, как Apache определяет их структуру, вы увидите, что это помогает разделять другие проблемы, включая ресурсы, файлы конфигурации, другие языки и т. д.
эта структура также позволяет модульным тестам тестировать пакет и методы защищенного уровня тестируемых объектов, предполагающие размещение тестовых случаев в том же пакете, что и тестируемые объекты. Что касается тестирования частных методов - я бы не стал заморачиваться. Что-то еще, либо общедоступное, пакетное, либо защищенное, вызывает их, и вы должны иметь возможность получить полное тестовое покрытие, проверяющее эти вещи.
кстати, ссылка выше - это Maven, стандартный инструмент сборки Apache. Каждый проект Java, который у них есть, соответствует этому стандарту, а также каждый проект, который у меня есть столкнулся с тем, что построен с помощью Maven.
в большинстве случаев делается так:
<SOME_DIR>/project/src/com/foo/Application.java <SOME_DIR>/project/test/com/foo/ApplicationTest.javaтаким образом, вы держите их разделенными, и вы все еще можете протестировать пакет/защищенную функциональность, потому что тест находится в том же пакете.
вы не можете тестировать личные вещи, если они не объявлены внутри класса IT self.
на поставке, вы как раз пакуете
.classгенерируется src, а не тестами
на самом деле имеет смысл разделить ваши производственные и тестовые проекты на 2 отдельных объекта, но иметь одинаковую структуру пакетов в обоих проектах.
Итак, если у меня есть проект "Мой-проект", я также создаю "мой-проект-Тест", поэтому у меня есть следующая структура каталогов:
my-project +--- src/com/foo my-project-test +---test/com/fooэтот подход гарантирует, что зависимости тестового кода не загрязняют производственный код.
по моему личному мнению, должен быть пакет Private и protected методы проверенные, а также публичные методы. Поэтому я хочу, чтобы мои тестовые классы были в том же пакете, что и производственные классы.
вот как мы его настроили, и нам это нравится.
build/ src/ test/build/ test/src/весь тестовый код компилируется в свой собственный каталог сборки. Это потому, что мы не хотим, чтобы производство содержало тестовые классы по ошибке.
при создании Java-библиотека модуль Android Studio он создает класс по умолчанию:
[module] + src/main/java/[com/foo/bar]если вы посмотрите на
[module].imlfile, вы найдете этот путь, а также путь для тестов, которые вы можете использовать. Ниже приводится резюме:<module> <component> <content> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> </content> </component> </module>что вы можете сделать, в частности, это создать каталог для тестов, чтобы иметь следующую структуру:
[module] + src/main/java/[com/foo/bar] + src/test/java/[com/foo/bar]вышеуказанная структура будет узнана мимо Android Studio и ваши файлы внизу будут включены в модуль.
Я предполагаю, что эта структура является рекомендуемым макетом для кода и тестов.