Моя задача - написать стресс-нагрузочные тесты для 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) Я на правильном пути?А может, мне стоит перейти на другую технологию для стресс-тестирования?