如何在JUnit测试中初始化数据

时间:2011-04-01 18:25:50

标签: java hibernate spring junit stress-testing

我的任务是为服务层编写压力(负载)测试。主要是CRUD操作。我们使用JUnit作为测试框架,使用JUnitPerf构建负载测试,使用Spring注入服务bean,使用hibernate访问数据库。

压力测试类似于:读取实体 - 更新实体 - 保存 - 再次读取并进行比较。但是为了构建测试,我需要在数据库中使用一些测试数据,因此我需要在测试之前创建这些数据并在之后删除它。所需的流程:创建测试数据 - 在多个线程中运行测试 - 在所有线程完成执行后删除测试数据。有很多测试数据,所以使用一些测试转储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的定义:

  <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 个答案:

答案 0 :(得分:1)

您可以使用DBUnit为您执行数据加载。或者使用Unitils将DBUnit与Spring和Hibernate集成。

此致

答案 1 :(得分:0)

如果您使用Spring进行测试,则应考虑不使用Spring Testing Support而不是自己加载应用程序上下文并查找bean。

您可以在测试类上执行类似的操作并自动注入bean。

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

关于测试后的“清理”,我总是考虑将Spring transaction management用于测试范围。应该可以将测试开始声明为@Transactional并在测试后以编程方式回滚事务。无需以这种方式显式删除数据。

到目前为止,这只是一个想法。必须尝试自己......