Очистить базу данных в памяти после каждого теста - PullRequest
3 голосов
/ 04 августа 2011

Я использую hsqldb для тестирования некоторых уровней доступа к данным в Java.У меня есть определенные тестовые случаи, как около 100.Я создаю базу данных в памяти и затем вставляю некоторые значения в таблицу, чтобы в моем тестовом примере я мог ее загрузить, но проблема заключается в том, что для каждого тестового примера мне нужно очищать базу данных в памяти, только значения, а не таблицы.1001 *

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 04 августа 2011

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

@Before
public void setUp() throws Exception
{
    logger.info("Performing the setup of test {}", testName.getMethodName());
    IDatabaseConnection connection = null;
    try
    {
        connection = getConnection();
        IDataSet dataSet = getDataSet();
        //The following line cleans up all DbUnit recognized tables and inserts and test data before every test.
        DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
    }
    finally
    {
        // Closes the connection as the persistence layer gets it's connection from elsewhere
        connection.close();
    }
}

Обратите внимание, что всегда рекомендуется выполнять любые действия по настройке в методе установки @Before, а не в методе @After teardown. Последнее указывает на то, что вы создаете новые объекты базы данных в тестируемом методе, который IMHO не совсем легко поддается тестируемому поведению. Кроме того, если вы выполняете очистку после теста, чтобы убедиться, что второй тест выполняется правильно, то любая такая очистка фактически является частью настройки второго теста, а не разбором первого.

Альтернативой использованию DbUnit является запуск новой транзакции в вашем методе установки @Before и откат ее в методе @After teardown. Это будет зависеть от того, как написан ваш слой доступа к данным.

Если ваш уровень доступа к данным принимает Connection объекты, тогда ваша подпрограмма установки должна их создать и отключить автоматическую фиксацию. Также существует предположение, что ваш уровень доступа к данным не будет вызывать Connection.commit. Предполагая предыдущее, вы можете откатить транзакцию, используя Connection.rollback() в вашем методе разрыва.

Что касается управления транзакциями, приведенный ниже фрагмент демонстрирует, как можно это сделать, используя, например, JPA:

@Before
public void setUp() throws Exception
{
    logger.info("Performing the setup of test {}", testName.getMethodName());
    em = emf.createEntityManager();
    // Starts the transaction before every test
    em.getTransaction.begin();
}

@After
public void tearDown() throws Exception
{
    logger.info("Performing the teardown of test {}", testName.getMethodName());
    if (em != null)
    {
        // Rolls back the transaction after every test
        em.getTransaction().rollback();
        em.close();
    }
}

Аналогичные подходы должны быть применены для других сред ORM или даже для вашего пользовательского уровня персистентности, если вы его написали.

2 голосов
/ 04 августа 2011

Не могли бы вы использовать транзакции HSQLDB ?

Перед каждым тестом начинать новую транзакцию:

START TRANSACTION;

После каждого теста откатывать его обратно:

ROLLBACK;

Это также позволит вам иметь некоторые постоянные данные.

0 голосов
/ 04 августа 2011

Вы должны использовать Truncate Query для уничтожения памяти базы данных, или эта ссылка может быть вам полезна.

http://wiki.apache.org/db-derby/InMemoryBackEndPrimer

0 голосов
/ 04 августа 2011

В зависимости от вашей тестовой среды, можно выполнить вызов удаления после каждого теста. В Junit аннотация - @ После , и метод с этой аннотацией будет запускаться после каждого метода [@Test].

...