8

自動テストと dbUnit は初めてです。アドバイスをいただければ幸いです。

次の方法で実行されるテスト スイートを作成します。

  • インメモリ H2 データベースを作成する
  • DDL スクリプトを実行してテーブルを作成する
  • dbUnit を実行して、すべてのテストで使用される初期データ ( STATE0と呼びましょう) を挿入します。
  • テストを実行する

そこまでは良さそうに見えますが、理解できないのは、テスト実行後にデータベースをSTATE0に戻し、データを変更するにはどうすればよいですか?

dbUnitでできますか?
それとも何か他のもので?
各テストの前にデータベースを再作成する必要がありますか?

テストでトランザクションを単純にコミットしないことは、私には適切ではありません。テストは最終的に複数のデータベース接続で複数のトランザクションを実行する可能性があるためです。

4

2 に答える 2

7

@BeforeClass@Beforeおよび@Afterメソッドを適切に記述すれば、DBUnit は自動的に 4 つの作業を行うことができます。たとえば、Derby を使用する私たちのプロジェクトでは、そのようなテスト ケースの 1 つが次のようになります。

public class MyTest {
    protected static IDataSet getDataSet() throws Exception {
        URL url = MyTest.class.getClassLoader().getResource("MyDataSet.xml");
        return new XmlDataSet(new FileInputStream(url.getPath()));
    }

    private static JdbcDatabaseTester databaseTester;

    @BeforeClass
    public static void setUpClass() throws Exception {
        // Init test environment, session etc.
        databaseTester = new JdbcDatabaseTester(
                "org.apache.derby.jdbc.ClientDriver",
                "jdbc:derby://localhost:1527/myschema", 
                "username", "password");
        databaseTester.setDataSet(getDataSet());
    }

    @AfterClass
    public static void tearDownClass() {
        // Close session etc.
    }

    @Before
    public void setUp() throws Exception {
        databaseTester.onSetup();
    }

    @After
    public void tearDown() throws Exception {
        databaseTester.onTearDown();
    }

    @Test
    public void test() throws Exception { ... }
}

このコードは、DB スキーマ (のサブセット)MyDataSet.xmlを各テスト後に定義された状態に戻します。(@Pascal がコメントしたように、リセットが常に完全であるとは限らないことに注意してください。テストでデータセットにないテーブルが変更された場合、@Before/@Afterメソッドの影響を受けません。)

于 2010-09-28T14:21:00.980 に答える
5

データベースを初期データセットに初期化するには、次のメソッドをテスト ケースに実装するだけです。

@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
    return DatabaseOperation.CLEAN_INSERT; // by default (will do DELETE_ALL + INSERT)
}

@Override
protected DatabaseOperation getTearDownOperation() throws Exception
{
    return DatabaseOperation.NONE; // by default
}

一部のテストで空のテーブルに行が挿入される場合 (たとえば、初期データセットで定義されていない場合)、外部キー制約が存在する可能性があります。

この空のテーブルを行なしでデータセットに追加するだけです:

<mydb_mypopulatedtable id="1" name="toto" alias="funky"/>
<mydb_mypopulatedtable id="2" name="titi" alias="groovy"/>
<mydb_mypopulatedtable id="3" name="tutu" alias="creepy"/>

<mydb_myemptytable />

ここで、myemptytable には mypopulatedtable への外部キーがあります。myemptytable が定義されていない場合、DBUnit は mypopulatedtable を削除しようとしますが、制約のために失敗します。定義されている場合、DBUnit は前に myemptytable 行を削除します。

于 2011-02-25T10:51:29.403 に答える