Как я могу стирать данные с моего HSQLDB после каждого теста? - PullRequest
45 голосов
/ 14 февраля 2011

В моем проекте уже было написано несколько тестов JUnit, которые использовались для заполнения данных в методе установки. Теперь я добавил maven в свой проект и хочу выполнить все тестовые примеры из maven, то есть с помощью mvn test. Проблема сейчас в том, что моя база данных не очищается после выполнения каждого тестового класса. Мне нужно очистить HSQLDB после выполнения тестов каждого класса.

Ответы [ 5 ]

79 голосов
/ 14 февраля 2011
  1. Вы можете очистить данные, сбросив схему. Схема по умолчанию называется PUBLIC. Если вы выполните SQL-запрос ниже, он очистит все данные и удалит все таблицы.

    СНИЖЕНИЕ СХЕМЫ ОБЩЕСТВЕННОГО КАСКАДА

  2. В качестве альтернативы, если вам нужны определения объектов таблицы и схемы, вы можете создать файл: базу данных, содержащую объекты, но без данных, и добавить следующее свойство в файл .properties. При использовании базы данных этого типа для изменений изменения в данных не сохраняются

    files_read_only = true

  3. Последняя альтернатива, доступная в HSQLDB 2.2.6 и более поздних версиях, позволяет очистить все данные в схеме при сохранении таблиц. В приведенном ниже примере схема PUBLIC очищена.

    TRUNCATE SCHEMA public & COMMIT

    Это утверждение было улучшено в последних версиях HSQLDB. См. http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement в разделе Сокращенное заявление

19 голосов
/ 29 марта 2012

Следуя совету Фредта , TRUNCATE SCHEMA ПУБЛИЧНЫЙ ПЕРЕЗАПУСК ИДЕНТИФИКАЦИЯ И ОБЯЗАТЕЛЬСТВО НЕ ПРОВЕРИТЬ работал для меня.Соответствующая часть кода в тесте JUnit для DAO.

@After
public void tearDown() {
    try {
        clearDatabase();
    } catch (Exception e) {
        fail(e.getMessage());
    }
}


public void clearDatabase() throws Exception {
  DataSource ds = (DataSource) SpringApplicationContext.getBean("mydataSource");
  Connection connection = null;
  try {
    connection = ds.getConnection();
    try {
      Statement stmt = connection.createStatement();
      try {
        stmt.execute("TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK");
        connection.commit();
      } finally {
        stmt.close();
      }
    } catch (SQLException e) {
        connection.rollback();
        throw new Exception(e);
    }
    } catch (SQLException e) {
        throw new Exception(e);
    } finally {
        if (connection != null) {
            connection.close();
        }
    }
}

Согласно документации на http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

Если указано RESTART IDENTITY, все последовательности таблицы IDENTITY и все последовательности SEQUENCEобъекты в схеме сбрасываются до начальных значений

9 голосов
/ 14 февраля 2011

Во всех наших тестах мы выполняем откат транзакции в самом конце выполнения (после того, как все утверждения выполнены). Мы используем Spring, и по умолчанию тесты не фиксируются в самом конце. Это гарантирует, что вы всегда возвращаетесь в исходное состояние базы данных (после первоначального создания таблиц сущностей и запуска import.sql).

Даже если вы не используете Spring, вы, вероятно, можете свернуть свой собственный блок try {} finally {} для отката запущенной транзакции для каждого теста.

3 голосов
/ 27 августа 2011

Другое решение указано в разделе «Очистка базы данных между тестами» http://www.objectpartners.com/2010/11/09/unit-testing-your-persistence-tier-code/

2 голосов
/ 14 августа 2013

У меня был простой сценарий SQL, который запускался перед каждым тестом со следующим утверждением в начале:

TRUNCATE SCHEMA public AND COMMIT;

, но я столкнулся с проблемами блокировки между тестами, и добавление этого работало для меня как чудо:

@After
public void after() throws Exception {
    if (entityManager.getTransaction().isActive()) {
        entityManager.getTransaction().rollback();
    }
}
...