3

Java でデータ アクセス層の一部をテストするために hsqldb を使用しています。私は約100のような特定のテストケースを持っています。インメモリデータベースを作成し、テーブルにいくつかの値を挿入して、テストケースでロードできるようにしますが、問題は、テーブルではなく値のみをメモリ内データベースをクリアする必要があるすべてのテストケースです。

可能ですか、テーブルから行を手動で削除する必要があり、他に使用できるものはありますか。

ありがとう

4

4 に答える 4

4

単体テストでDbUnitを使用する場合は、すべてのテストの前にDbUnitがクリーンアンドインサート操作を実行して、データベースの内容がすべてのテストの前に有効な状態にあることを確認するように指定できます。これは、以下のような方法で実行できます。

@Before
public void setUp() throws Exception
{
    logger.info("Performing the setup of test {}", testName.getMethodName());
    IDatabaseConnection connection = null;
    try
    {
        connection = getConnection();
        IDataSet dataSet = getDataSet();
        //The following line cleans up all DbUnit recognized tables and inserts and test data before every test.
        DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
    }
    finally
    {
        // Closes the connection as the persistence layer gets it's connection from elsewhere
        connection.close();
    }
}

分解方法@Beforeではなく、セットアップ方法でセットアップアクティビティを実行することを常にお勧めします。@After後者は、テスト対象のメソッドで新しいデータベースオブジェクトを作成していることを示していますが、IMHOはテスト可能な動作に正確に適しているわけではありません。さらに、テスト後にクリーンアップする場合、2番目のテストが正しく実行されることを確認するために、そのようなクリーンアップは実際には2番目のテストのセットアップの一部であり、最初のテストの分解ではありません。

DbUnitを使用する代わりに、セットアップメソッドで新しいトランザクションを開始し、ティアダウンメソッド@Beforeでロールバックすることもできます。@Afterこれは、データアクセス層の記述方法によって異なります。

データアクセス層がオブジェクトを受け入れるConnection場合は、セットアップルーチンでオブジェクトを作成し、自動コミットをオフにする必要があります。また、データアクセス層がを呼び出さないという前提がありますConnection.commit。前のものを想定すると、Connection.rollback()ティアダウンメソッドでを使用してトランザクションをロールバックできます。

トランザクション制御に関して、以下のスニペットは、たとえばJPAを使用してそれを行う方法を示しています。

@Before
public void setUp() throws Exception
{
    logger.info("Performing the setup of test {}", testName.getMethodName());
    em = emf.createEntityManager();
    // Starts the transaction before every test
    em.getTransaction.begin();
}

@After
public void tearDown() throws Exception
{
    logger.info("Performing the teardown of test {}", testName.getMethodName());
    if (em != null)
    {
        // Rolls back the transaction after every test
        em.getTransaction().rollback();
        em.close();
    }
}

同様のアプローチは、他のORMフレームワーク、またはカスタム永続化レイヤー(作成している場合)でも実行する必要があります。

于 2011-08-04T06:17:42.770 に答える
2

HSQLDB トランザクションを使用できますか?

すべてのテストの前に、新しいトランザクションを開始します。

START TRANSACTION;

すべてのテストの後、ロールバックします。

ROLLBACK;

これにより、永続的なデータを保持することもできます。

于 2011-08-04T06:09:37.307 に答える
0

テスト フレームワークによっては、各テストの後に削除呼び出しを実行できます。Junit では、アノテーションは@Afterであり、このアノテーションを持つメソッドは各 [ @Test] メソッドの後に実行されます。

于 2011-08-04T06:05:44.740 に答える
0

Destroy Database Memory には Truncate Query を使用する必要があります。そうしないと、このリンクが役に立ちます。

http://wiki.apache.org/db-derby/InMemoryBackEndPrimer

于 2011-08-04T06:11:26.657 に答える