Какова хорошая практика для тестирования динамической интеграции Java DAO -> базы данных? - PullRequest
3 голосов
/ 23 сентября 2010

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

(Под «гибким» я подразумеваю наиболее простое, автоматизированное и простое решение этой проблемы).

Я надеюсь добиться автоматизации тестов, доказывающих, что уровень доступа к данным легко интегрируется с реально работающими экземплярами базы данных.Важно, чтобы мы тестировали наш пользовательский SQL на базе данных конкретных поставщиков.То есть, если мы пишем T-SQL, мы хотим провести тестирование на SQL Server.

Должна ли отдельная база данных выделяться для всех запущенных тестов, но без коммитов?Или в каждой тестовой среде должна быть выделенная база данных?

Как люди справляются с настройкой и демонтажем?DBUnit все еще широко используется?Как может помочь весна?

Ответы [ 4 ]

3 голосов
/ 23 сентября 2010

Я бы сказал, что ваш интеграционный тест DAO должен касаться только того, чтобы действительный QL ORM, например, HQL или JDBC SQL, был действительным.Я думаю, что разумно предположить, что сами языки запросов были тщательно протестированы на нескольких драйверах / базах данных.В этом случае целесообразно использовать базу данных «в памяти», такую ​​как HSQLDB.

«Spring Test» нацелен на интеграционное тестирование и отлично подходит для настройки контекста IoC, предоставления транзакций, настройки базы данных.сеанс, создание схемы, а затем отбрасывание ее после теста, откат транзакций после теста ... настолько, что я сижу на пределе в отношении маркировки некоторых моих тестов базы данных как интеграционных тестов (лично я думаю, что такдо тех пор, пока модульное тестирование не пересекает границы процесса и его установка не требует трения, они представляют собой разумный модульный тест).

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

3 голосов
/ 23 сентября 2010

Важно, что мы тестируем наш пользовательский SQL с БД конкретных поставщиков

Поэтому вы должны создать набор тестов для БД каждого поставщика

@RunWith(Suite.class)
@Suite.SuiteClasses({})
public class SQLServerTestSuite {

    @BeforeClass
    public static void setUpClass() throws Exception {

    }

    @AfterClass
    public static void tearDownClass() throws Exception {
        // clean database
    }

}

Следует ли выделять одну базу данных для всех запущенных тестов, но без фиксации?

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

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

Как люди справляются с настройкой и разбором?

public class PersonTest {

    @Before
    public void setUp() {
        // set up state to run the test
    }

    @After
    public void teardown() {
       // Transaction rollback
    }

}

Приятная вещь в Шаблон отката транзакции в том, что оставляет базу данных точно в том же состоянии, что и примы начали тест независимо от того, какие изменения мы внесли в содержимое базы данных

Является ли DBUnit все еще популярным?

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

Как может помочь Spring?

Spring имеет встроенную поддержку транзакциишаблон отката и поддерживает именованный параметр ( SqlParameterSource ), который позволяет вам выводить простые запросы jdbc в многострочном и читаемом xml-файле для каждой базы данных поставщиков, например

<?xml version="1.0" encoding="UTF-8"?>
<queries>
    <query name="PERSON_BY_ID">
        <![CDATA[
            select 
                *
            from 
                PERSON
            where
                PERSON.ID = :integerId
        ]]>
    </query>
</queries>

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

public class SQLServerQuery {

    public static final String PERSON_BY_ID = "PERSON_BY_ID";

}

Для динамических запросов обычно важно обнаруживать ошибки в логике запроса, такие как использование <вместо <= </em>.Чтобы выявить ошибки такого рода, нам нужно написать тесты, которые заполняют базу данных тестовыми данными, выполняют запрос и проверяют, возвращает ли он ожидаемые объекты.К сожалению, тесты такого типа требуют много времени как для написания, так и для выполнения.

1 голос
/ 23 сентября 2010

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

Иногда вы зависите от некоторого начального набора данных не для всех тестов, а для нескольких тестов, в основном для запросов на выборку.Если вы зависите от некоторого набора данных, это становится сложно.Вы все еще можете управлять с помощью Dbunit, запуская начальные данные перед началом каждого теста и завершая их в конце, но это заставляет тесты работать дольше.

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

0 голосов
/ 23 сентября 2010

Может быть, я не понимаю цели того, что вы пытаетесь сделать, или почему был выбран этот подход, но рассматривали ли вы возможность использования фиктивных объектов? Вы можете написать тесты Junits, используя фиктивные объекты, и интегрировать его с Hudson для автоматизации. Вы можете издеваться над DAO, подготовленными заявлениями, соединениями, наборами результатов и т. Д.

DAO - это проверенная модель. И JDBC, и все остальное, что вы могли бы использовать для взаимодействия. Вы пытаетесь доказать, что это работает? или вы действительно хотите протестировать запросы или SQL в методах DAO?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...