2012-06-18 3 views
3

Я искал вокруг, но не смог определить, возможен ли следующий подход/хорошая практика. В основном, я хотел бы сделать следующее:Оберните весь тест DBUnit/JUnit под одной транзакцией

Создать JUnit Тесты, которые используют DBUnit для инициализации данных. Выполните несколько тестовых методов, каждый из которых запускает один и тот же исходный набор данных. Откат после каждого метода тестирования обратно в состояние сразу после начальной функции setUp. После того, как все методы тестирования выполняют откат, любые изменения, которые были сделаны в функции setUp. На данный момент данные в базе данных должны быть точно такими же, как до запуска тестового класса JUnit.

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

Я смог откатить отдельные методы тестирования, но не смог отменить изменения, сделанные в setUp после того, как все методы тестирования запущены.

ПРИМЕЧАНИЕ. Мне известно о различных функциях DBUnit, таких как CLEAN_INSERT, DELETE и т. Д. Я использую среду Spring для ввода моего источника данных.

Пример макет будет выглядеть следующим образом:

public class TestClass { 

    public void setUp() { 
     // Calls a method in a different class which uses DBUnit to initialize the database 
    } 

    public void runTest1() { 
     // Runs a test which may insert/delete data in the database 
     // After running the test the database is in the same state as it was 
     // after running setUp 
    } 

    public void runTest2() { 
     // Runs a test which may insert/delete data in the database 
     // After running the test the database is in the same state as it was 
     // after running setUp 
    } 

    // After runTest1 and runTest2 have finished the database will be rolled back to the 
    // state before any of the methods above had run. 
    // The data will be unchanged as if this class had never even been run 
} 

я бы запускать тесты в базе данных разработки, однако я предпочел бы, чтобы не повлиять на какие-либо данные в настоящее время в базе данных. Я в порядке с запуском CLEAN_INSERT в начале инициализации данных, однако после запуска всех методов тестирования я хотел бы, чтобы данные вернулись к тому, как это было до того, как я запустил свой тест JUnit.

Заранее спасибо

ответ

1

Так же, как «setUp» JUnit предлагает метод «tearDown», выполняемый после каждого метода тестирования. что вы можете использовать для отката. Кроме того, начиная с JUnit 4 вы имеете следующие аннотации:

  • @BeforeClass: запустить один раз перед запуском любой из ваших тестов в тесте
  • @Before: запускать каждый раз перед методом испытания
  • @After : запускать каждый раз после тестового метода
  • @AfterClass: выполняется один раз после выполнения всех ваших тестов в текущем наборе
1


Мы решили подобную проблему в проекте oVirt с открытым исходным кодом. Пожалуйста, взгляните на код, находящийся в каталоге engine \ backend \ manager \ modules \ dal \ src \ test \ java \ org \ ovirt \ engine \ core \ dao \ BaseDAOTestCase.java.
В общем, посмотрим, что мы там делали в методах @BeforeClass и @AfterClass. Вы можете использовать его для каждого метода. Для этого мы использовали Spring-test framework.