JUnit + DbUnit: переключение соединения с базой данных между средами разработки и тестирования.

Я устанавливаю тестовые леса вокруг существующего проекта. Сюда входят некоторые интеграционные тесты с использованием JUnit и DbUnit. Я также установил установку Jenkins для непрерывной интеграции.

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

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

Есть ли лучшая практика / стратегия / технология / и т. Д. Для изменения соединений с базой данных для тестирования без изменения кода? Бонусные баллы, если решение позволяет Jenkins запускать одни и те же тесты для нескольких БД (это должно быть возможно, поскольку DbUnit не зависит).


Правки для получения дополнительной информации:

Продукт большой, с десятками различных взаимодействующих компонентов (обычно в отдельных vms / процессах). В действующей системе различные процессы обычно обмениваются данными через базу данных. IE, процесс пользовательского интерфейса записывает изменения в таблицу, а внутренний процесс опрашивает эту таблицу на предмет изменений. Да, это ужасно. Для интеграционного тестирования я настраиваю систему с помощью пользовательского интерфейса и фиксирую это состояние с помощью DbUnit. Затем я могу запустить тесты для этого «входа».

Мой компонент и все новые компоненты управляются maven. Подключения к БД в настоящее время жестко запрограммированы в тестовой настройке. Система DbUnit работает; Я просто хотел бы иметь возможность переключать, на какую базу данных ссылаются мои тесты, в зависимости от того, запущены ли они мной в моей среде разработки или запущены Дженкинсом в среде тестирования.


person Eric Grunzke    schedule 22.05.2012    source источник


Ответы (3)


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

Например, предположим, что во время тестирования вам удалось перенести параметры подключения к базе данных в файл с именем datasource.properties в src/test/resources, который выглядит следующим образом:

datasource.driverClassName = ${test.datasource.driverClassName}
datasource.url = ${test.datasource.url}
datasource.username = ${test.datasource.username}
datasource.password = ${test.datasource.password}

И у вас есть это в вашем POM:

<build>
  <testResources>
    <testResource>
      <directory>src/test/resources</directory>
      <filtering>true</filtering>
    </testResource>
  </testResources>
</build>

Затем вы можете определить test.datasource.driverClassName и т. Д. Свойства различными способами, чтобы Maven использовал разные базы данных:

  • Вы можете определить значения по умолчанию в разделе <properties> вашего POM;
  • Вы можете определить пользовательские базы данных в разделе <properties> каждого разработчика (и Jenkins) settings.xml;
  • Вы можете определить несколько профилей в своем POM для разных сред (например, development, jenkins, anotherDB) и запустить сборку с разными профилями.

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

person Kkkev    schedule 23.05.2012

Необходимо узнать больше о вашем инструменте сборки. Вы используете Maven? Где хранится информация о подключении к базе данных? Вы используете пружину?

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

Поскольку я использую Spring, внутри тестовых ресурсов maven у меня есть файл applicationContext, который содержит мой компонент источника данных и ссылается на свойства теста.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-    method="close">
    <property name="driverClassName" value="${test.jdbc.driverClassName}"/>
    <property name="url" value="${test.jdbc.url}"/>
    <property name="username" value="${test.jdbc.username}"/>
    <property name="password" value="${test.jdbc.password}"/>
    <property name="maxActive" value="100"/>
    <property name="maxWait" value="1000"/>
    <property name="poolPreparedStatements" value="true"/>
    <property name="defaultAutoCommit" value="true"/>
</bean>
person BenSchro10    schedule 22.05.2012
comment
Когда дело доходит до Spring, мне неловко, но то немногое, что я знаю, заставляет меня думать, что это может быть полезным решением. У меня сложилось впечатление, что вы настроили источники данных в xml и аннотировали свои классы для внедрения зависимостей во время выполнения. Сможет ли Spring изменить, какая БД вводится, в зависимости от среды (разработчик или тест)? - person Eric Grunzke; 22.05.2012
comment
Вы правы насчет конфигурации подключения к базе данных в XML. Но для того, что вы пытаетесь выполнить, я думаю, вам действительно следует сосредоточиться на том, что Maven собирается делать для вас и как свойства и профили Maven для вашей сборки могут быть использованы для настройки вашей сборки и запуска тестов. Maven может запускать ваши модульные тесты, и у него есть ресурсы, которые используются только на этапе тестирования, а затем он может использовать другой набор ресурсов для вашей основной сборки, которая будет работать в любой среде. Дженкинс запускает сборки maven, поэтому вы можете моделировать на своей машине то же самое, что и Дженкинс. - person BenSchro10; 22.05.2012

Многое зависит от вашей среды развертывания. Если вы развертываете в контейнере (tomcat, jboss и т. Д.), То использование JNDI-соединения изолирует вас от среды БД. Если вы создаете автономную Java-программу, вам придется самостоятельно определять среду и выбирать, какой профиль подключения к базе данных использовать.

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

Другой способ - передать среду вашей программе и позволить вашему коду определить, какую конфигурацию использовать.

person Jim Barrows    schedule 22.05.2012
comment
Я отредактировал свой пост, чтобы добавить больше информации. Мне любопытно, какой формат отдельной конфигурации базы данных вы упомянули. Это файл .properties (с использованием ResourceBundle), или XML (с использованием другого инструмента), или что-то совсем другое? Я мог бы поместить строки подключения jdbc в файл и прочитать этот файл, но это выглядит хакерским. Я предполагаю, что существует инструмент / практика / формат, позволяющий сделать это более стандартным способом. Я просто не знаю, что такое стандарт. - person Eric Grunzke; 22.05.2012
comment
файлы .propreties или XML. Я бы сам использовал файлы .properties, я очень презираю XML. - person Jim Barrows; 22.05.2012