Как инициировать данные в тестах JUnit - PullRequest
4 голосов
/ 01 апреля 2011

Моя задача - написать стресс-нагрузочные тесты для Service Layer.В основном это операции CRUD.Мы используем JUnit в качестве каркаса тестирования, JUnitPerf для построения нагрузочных тестов, Spring для внедрения служебных бинов и спящий режим для доступа к базе данных.

Стресс-тест выглядит примерно так: читать сущность - обновлять сущность - сохранять - читать снова и сравнивать.Но для построения теста мне нужны тестовые данные в базе данных, поэтому мне нужно создать эти данные перед тестом и удалить их после.Требуемый поток процесса: создать тестовые данные - запустить тестирование в нескольких потоках - сбросить тестовые данные после завершения всех потоков.Существует много тестовых данных, поэтому будет намного лучше использовать какой-нибудь тестовый дамп файл sql для его получения.Так что мне нужно: загрузить данные из файла в базу данных - выполнить стресс-тест - удалить все загруженные данные.

Я использую SchemaExport для загрузки данных.Я столкнулся со следующим исключением:

org.hibernate.HibernateException: No local DataSource found for configuration - 'dataSource' property must be set on LocalSessionFactoryBean
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.configure(LocalDataSourceConnectionProvider.java:49)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
at org.hibernate.tool.hbm2ddl.ManagedProviderConnectionHelper.prepare(ManagedProviderConnectionHelper.java:27)
at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:180)
at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:133)
    .................

Вот определение моего компонента SessionFactory:

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=${hibernate.dialect}
            hibernate.show.sql=${hibernate.show.sql}
        </value>
    </property>
    <property name="annotatedClasses">
        <list>
            ...
            my classes
            ...
        </list>
    </property>
</bean>

И я запускаю тест следующим образом:

 @BeforeClass
public static void createTestData() throws AccessDeniedException, AccountException, SQLException {
    ClassPathXmlApplicationContext appCtx = new ClassPathXmlApplicationContext("classpath:/applicationContext_test.xml");
    AnnotationSessionFactoryBean sessionFactoryBean = (AnnotationSessionFactoryBean) appCtx.getBean("sessionFactory");
    org.hibernate.cfg.Configuration configuration = sessionFactoryBean.getConfiguration();
    SchemaExport schemaExport = new SchemaExport(configuration);
    schemaExport.drop(false, true);
    schemaExport.create(false, true);
    if (schemaExport.getExceptions().size() > 0) {
        for (Object exception : schemaExport.getExceptions()) {
            if (exception instanceof Throwable) {
                ((Throwable) exception).printStackTrace();
            }
        }
        throw new IllegalStateException();
    }
}

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

У меня есть два вопроса: 1) Как я могу инициализировать данные перед нагрузочным тестом и удалить их после?2) Я на правильном пути?А может, мне стоит перейти на другую технологию для стресс-тестирования?

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Вы можете использовать DBUnit для загрузки данных. Или используйте Unitils , который интегрирует DBUnit с Spring и Hibernate.

С уважением,

0 голосов
/ 01 апреля 2011

Если вы используете Spring для тестирования, вам следует не использовать Spring Testing Support вместо того, чтобы загружать контекст приложения для себя и искать компоненты.

Вы можете сделать что-то подобное в своем тестовом классе и автоматически вводить бины.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"applicationContext_test.xml"})

Что касается "очистки" после теста, я всегда думал об использовании управления транзакциями Spring *1009* для области тестирования. Должна быть возможность объявить начало теста как @Transactional и программно откатить транзакцию после теста. Таким образом, нет необходимости удалять данные явно.

Пока это просто идея. Должен попробовать сам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...