Модульные тесты Java, макет каталога


при создании набора модульных тестов для кода Java существует ли соглашение о том, где разместить тестовый код по отношению к исходному коду?

например, если у меня есть каталог /java который содержит кучу .java исходные файлы, лучше поставить тестовые случаи в или использовать что-то вроде /java/test.

если последнее предпочтительнее, как вы тестируете внутренние части кода, когда private/protected члены класса недоступны снаружи посылка?

6 64

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].iml file, вы найдете этот путь, а также путь для тестов, которые вы можете использовать. Ниже приводится резюме:

<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 и ваши файлы внизу будут включены в модуль.

Я предполагаю, что эта структура является рекомендуемым макетом для кода и тестов.