Как вернуть базу данных в исходное состояние с помощью dbUnit? - PullRequest
8 голосов
/ 28 сентября 2010

Я новичок в автоматизированном тестировании и dbUnit. Поэтому я буду признателен за ваш совет.

Я собираюсь создать набор тестов, который будет работать следующим образом:

  • создать базу данных H2 в памяти
  • запускать сценарии DDL для создания таблиц
  • запустите dbUnit для вставки исходных данных (назовем их STATE0 ), которые будут использоваться всеми тестами.
  • запуск тестов

Пока это выглядит хорошо для меня, но я не понимаю, как мне вернуть базу данных в STATE0 после пробного запуска и изменить данные?

Могу ли я сделать это с помощью dbUnit?
Или с чем-то еще?
Должен ли я воссоздавать базу данных перед каждым тестом?

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

Ответы [ 2 ]

7 голосов
/ 28 сентября 2010

DBUnit может выполнять работу в четыре раза автоматически, если вы правильно напишите свои методы @BeforeClass, @Before и @After.Например, в нашем проекте с использованием Derby один такой тестовый пример выглядит как

public class MyTest {
    protected static IDataSet getDataSet() throws Exception {
        URL url = MyTest.class.getClassLoader().getResource("MyDataSet.xml");
        return new XmlDataSet(new FileInputStream(url.getPath()));
    }

    private static JdbcDatabaseTester databaseTester;

    @BeforeClass
    public static void setUpClass() throws Exception {
        // Init test environment, session etc.
        databaseTester = new JdbcDatabaseTester(
                "org.apache.derby.jdbc.ClientDriver",
                "jdbc:derby://localhost:1527/myschema", 
                "username", "password");
        databaseTester.setDataSet(getDataSet());
    }

    @AfterClass
    public static void tearDownClass() {
        // Close session etc.
    }

    @Before
    public void setUp() throws Exception {
        databaseTester.onSetup();
    }

    @After
    public void tearDown() throws Exception {
        databaseTester.onTearDown();
    }

    @Test
    public void test() throws Exception { ... }
}

. Этот код возвращает (подмножество) схему БД в состояние, определенное MyDataSet.xml после каждого теста.(Обратите внимание, что, как прокомментировал @Pascal, сброс не всегда может быть полным - если тест изменяет таблицу, отсутствующую в наборе данных, то на методы @Before / @After это не повлияет.)

6 голосов
/ 25 февраля 2011

Чтобы инициализировать базу данных начальным набором данных, просто реализуйте эти методы в своем тестовом примере:

@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
    return DatabaseOperation.CLEAN_INSERT; // by default (will do DELETE_ALL + INSERT)
}

@Override
protected DatabaseOperation getTearDownOperation() throws Exception
{
    return DatabaseOperation.NONE; // by default
}

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

Просто добавьте эту пустую таблицу в ваш набор данных без какой-либо строки:

<mydb_mypopulatedtable id="1" name="toto" alias="funky"/>
<mydb_mypopulatedtable id="2" name="titi" alias="groovy"/>
<mydb_mypopulatedtable id="3" name="tutu" alias="creepy"/>

<mydb_myemptytable />

Здесь myemptytable имеет внешний ключ для mypopulatedtable. Если myemptytable не был определен, DBUnit попытается удалить mypopulatedtable, но потерпит неудачу из-за ограничения. Если определено, DBUnit удалит мои пустые строки раньше.

...