ユニットテストにDBUnitを使用する休止状態のアプリケーションがあります。 XMLテストデータベースがあり、各テストのsetUp()にダミーデータがロードされ、tearDown()の間に削除されます。問題は、スイート全体(この場合はIntellij)をもう実行できないことです。約300回のテストの後、ヒープメモリがすべて使い果たされるためです。テストは、最終的にJVMがあきらめて終了するまで、実行には0.3秒から30秒以上かかります。私のDBUnitテストは、なぜメモリを消費していますか?
antのjunitタスクでテストスイートを実行すると問題はなく、個々のクラスのテストスイートも実行されません。しかし、CIサーバ上のビルドを破るよりも、コードベースに対する大きなリファクタリングの変更をチェックインする前に、スイート全体をローカルで実行できるのが好きです。
私はJVMの唯一の引数として-Xmx512mを使ってテストスイートを実行しています。これは、CIサーバー上でタスクを実行するときにantに渡すのと同じ量です。
package com.mycompany.test;
// imports omitted for brevity
public abstract class DBTestCase extends TestCase {
private final String XML_DATA_SET = "test/resources/mytestdata.xml";
private Session _session;
private Configuration _config;
public DBTestCase(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
_config = new Configuration().configure();
SessionFactory sf = _config.buildSessionFactory();
// This is a singleton which is used the DAO's to acquire a session.
// The session must be manually set from the test's setup so that any
// calls to the singleton return this session factory, otherwise NPE
// will result, since the session factory is normally built during
// webapp initialization.
HibernateUtil.setSessionFactory(sf);
_session = sf.openSession();
_session.beginTransaction();
IDataSet dataSet = new FlatXmlDataSet(new File(XML_DATA_SET));
DatabaseOperation.CLEAN_INSERT.execute(getConnection(), dataSet);
}
protected void tearDown() throws Exception {
super.tearDown();
_session.close();
}
protected IDatabaseConnection getConnection() throws Exception {
ConnectionProvider connProvider = ConnectionProviderFactory
.newConnectionProvider(_config.getProperties());
Connection jdbcConnection = connProvider.getConnection();
DatabaseConnection dbConnection = new DatabaseConnection(jdbcConnection);
DatabaseConfig dbConfig = dbConnection.getConfig();
dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
return dbConnection;
}
}
それは明らかです。このようになりますされ、我々はテストクラスの全てから延びているため、クラスを書かれている
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:mem:mydatabase</property>
<property name="connection.username">sa</property>
<property name="connection.password"/>
<!-- Other configuration properties -->
<property name="connection.pool_size">1</property>
<property name="jdbc.batch_size">20</property>
<property name="connection.autocommit">true</property>
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<property name="bytecode.use_reflection_optimizer">false</property>
<property name="show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<!-- Mappings (omitted for brevity) -->
<mapping resource="hbm/blah.hbm.xml"/>
</session-factory>
</hibernate-configuration>
:私の休止状態-test.cfg.xmlは、次のようになりますここでメモリリークが起こっているのですが、どこが分からないのでしょうか。これを診断するにはどうすればいいですか?