Подтвердить что ты не робот

Как я могу стереть данные из моего HSQLDB после каждого теста?

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

4b9b3361

Ответ 1

  • Вы можете очистить данные, отбросив схему. Схема по умолчанию называется PUBLIC. Если вы выполните SQL-заявку ниже, он очистит все данные и удалит все таблицы.

    DROP SCHEMA PUBLIC CASCADE

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

    files_read_only = true

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

    ОБРАТНАЯ СВЯЗЬ TRUNCATE SCHEMA

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

Ответ 2

Следуя советам fredt, ИДЕНТИФИКАЦИЯ ПУБЛИЧНОЙ ОТСТАВКИ 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 в схеме reset к их начальным значениям

Ответ 3

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

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

Ответ 5

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

TRUNCATE SCHEMA public AND COMMIT;

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

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