2010-09-28 3 views
8

Я новичок в автоматическом тестировании и dbUnit. Поэтому я буду благодарен за ваш совет.Как вернуть базу данных в исходное состояние с помощью dbUnit?

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

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

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

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

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

ответ

7

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

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 методов.)

+1

Действительно ли это «перезагрузка» БД? Я имею в виду, если мой тест вставляет некоторые данные в таблицу 'FOO', и если' MyDataSet.xml' не включает 'FOO',' FOO' не будет «сброшен», правильно? –

+0

@ Паскаль, вы, вероятно, правы. Будучи человеком, всегда желательно дважды проверить, что если я запускаю тесты, которые включают таблицу 'FOO', эта таблица фактически включена в набор данных. –

+0

éter Я согласен с этим. Просто вокалистка во мне не была полностью убеждена в формулировке последнего предложения :) +1 в любом случае. –

5

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

@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 будет удалять недопустимые строки раньше.

+0

Ищет это с навсегда! – suguspnk

Смежные вопросы