Unitils使用マニュアル[翻訳]-データベーステスト



1.1.1データベーステスト
データベース・レイヤのユニット・テストは、エンタープライズ・アプリケーションの構築に価値がありますが、複雑すぎるため、彼を放棄せざるを得ません.Unitilsはデータベーステストの複雑さを低減し、データベーステストを簡単かつメンテナンスしやすくします.次の章では、DatabaseModule anddbUnitModuleがデータベーステストをどのようにサポートするかについて説明します.
1.1.1.1 Dbunitによるテストデータの保守
データベーステストでは、ユニットを使用してデータベースをテストする必要があります.これにより、使用するテストデータを完全に細かく制御できます.DbUnitModuleはDbunitに基づいて構築され、テストデータセットのサポートを提供します.
1.1.1.1.1テストデータセットのマウント
例を見てみましょう.UserDaoには、ユーザーのfirstとlast nameでユーザーを取り戻すための簡単な方法があります.一般的なユニットテストは次のとおりです.
@DataSet
public class UserDAOTest extends UnitilsJUnit4 {
 
    @Test
    public void testFindByName() {
        User result = userDao.findByName("doe", "john");
        assertPropertyLenientEquals("userName", "jdoe", result);
    }
 
    @Test
    public void testFindByMinimalAge() {
        List<User> result = userDao.findByMinimalAge(18);        
        assertPropertyLenientEquals("firstName", Arrays.asList("jack"), result);
    }
}
 
@DataSet は、テストでロードする があるDbunitデータファイルの をUnitilsに します.ファイル が されていない 、Unitilsは のフォルダでクラスファイル と じデータセットファイル(className.xml.
データセットファイルは、DbunitのFlatXMLDataSet を し、すべてのテストデータを む があります.すべてのテーブルの が に になり、すべてのテストデータが されます.データファイルにないテーブルは、コンテンツを にすることはありません. のテーブルを にする がある は、、null を するには、 の を することもできます.
UserDaoTestには、UserDaoTestというデータセットファイル を する があります.xmlは、UserDaoTestクラスファイルがあるディレクトリに されます.
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
 
    <usergroup name="admin" />  
    <user userName="jdoe"  name="doe"   firstname="john"   userGroup="admin" />
    
    <usergroup name="sales" />    
    <user userName="smith" name="smith" userGroup="sales" />
    
</dataset>
 
これにより、userテーブルとusergroupテーブルが になり、smithのユーザー のfirst nameがnull に される しいレコードが されます.
testFindByMinimalAge()メソッドをサポートするには、クラスレベルのデータセットではなく なデータセットが です.では、ファイルを する があります.testFindByMinimalAge.xmlはテストクラスと じフォルダに けばいいです
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <user userName="jack" age="18" />
    <user userName="jim"  age="17" />
</dataset>
 
このデータセットファイルでは、このメソッドに@DataSet を けることで、クラスのデータセットファイルを きできます.
public class UserDAOTest extends UnitilsJUnit4 {
 
    @Test
    @DataSet("UserDAOTest.testFindByMinimalAge.xml")
    public void testFindByMinimalAge() {
        List<User> result = userDao.findByMinimalAge(18);        
        assertPropertyLenientEquals("firstName", Arrays.asList("jack"), result);
    }
}
 
メソッド・レベルのデータセット・ファイルは に されるべきではありません.データ・ファイルが すぎると、より くのメンテナンス を するため、クラス・レベルのデータセットをできるだけ らす があります. くの 、 さなデータセットで のユニットに のテストを うことができます.しかし、 データがデータ の と をもたらす 、メソッドレベルのデータセット、またはサブディビジョンユニットでクラスをテストし、 クラスは のデータセットを します.
クラスまたはその に@DataSetで したデータセットを えることは、クラス の テストメソッドに です.1つのデータセットがいくつかのテストメソッドでのみ されている は、クラスレベルの に かず、 するテストメソッドに を ける があります. に したようにデータセットファイルに を けていない は、 で を けることもできます.もちろん@dataset に するだけでいいです. の では、 のデータセットファイルを することもできます.
 
@DataSet({"UserDAOTest_general.xml", "ConfigSettings.xml"})
public class UserDAOTest extends UnitilsJUnit4 {
 
    @Test
    public void testFindByName() {
        User result = userDao.findByName("doe", "john");
        assertPropertyLenientEquals("userName", "jdoe", result);
    }
 
    @Test 
    @DataSet("UserDAOTest_ages.xml")
    public void testFindByMinimalAge() {
        List<User> result = userDao.findByMinimalAge(18);
        assertPropertyLenientEquals("firstName", Arrays.asList("jack"), result);
    }
}
 
1.1.1.1.2データセットのロードポリシーの
デフォルトでは、データセット・ロードは、パージ に されるポリシーです.これは、 するすべてのテーブルのデータが され、テストデータが されることを します.この は できますが、DbUnitModuleは のような で できます.DataSet.loadStrategy.もし たちがユニットにいたらpropertiesファイルでは、 のように されます.
DbUnitModule.DataSet.loadStrategy.default=org.unitils.dbunit.datasetloadstrategy.InsertLoadStrategy
 
このように すると、 のデータを に するのではなく、データを するだけです.
ロードポリシーは、 のテストクラスに して することもできます.@DataSet にこのように する があります.
@DataSet(loadStrategy = InsertLoadStrategy.class)
 
Dbunitに しい は、ロードポリシーの は なるデータベースの と ています. に、デフォルトでサポートされているロードポリシーを します.
CleanInsertLoadStrategy:パージ ポリシーInsertLoadStrategy:データのみ
RefreshLoadStrategy:データベースの をリフレッシュし、データベースがすでにある はデータセットのデータを して し、データベースがない はデータセットの を します.データベースにはありますが、データセットにないデータは を けません.
UpdateLoadStrategy:データベースに するデータは されますが、データセットがあるのにデータベースに しない はデータの はありません.
1.1.1.1.3データセット の
Unitilsのデータセットファイルはmultischema xml を します.これはDbUnits FlatXmlDataSet の バージョンです.データセットファクトリは、ファイルフォーマットの とファイル を します.
Unitilsは 、1つのデータセットフォーマットしかサポートされていませんが、カスタムデータセットファクトリの により、 なるファイルフォーマットをサポートできます.ユニットを ってもいいです.propertisファイルのDbUnitModule.DataSet.factory.default または@DataSet に します.たとえば、DbUnitのXlsDataSetを し、DataSet Factoryを することで、Excelファイルをデータセットファイルとして できます.
1.1.1.1.4 テスト
テスト 、データセットのデータを してデータベースの を すると です.たとえば、 のデータ やストレージ・プロシージャが した を したい .
の では、1 アクティブでないすべてのユーザーのアカウントを にする をテストします.
public class UserDAOTest extends UnitilsJUnit4 {
 
    @Test @ExpectedDataSet
    public void testInactivateOldAccounts() {
        userDao.inactivateOldAccounts();
    }
}
 
この で@ExpectedDataSet を したことに してください.これにより、Unitilsはデータセットファイルを します.testInactivateOldAccounts-result.xmlで、データベースの とデータセットのデータを します.
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <user userName="jack" active="true" />
    <user userName="jim"  active="false" />
</dataset>
 
このデータセットに して、Unitilsは2つの なるユーザーがユーザーテーブルに されているかどうかをチェックします. のレコードまたは のテーブルは しません.@DataSet を すると、ファイル を できます. が されていない は、 じ のファイル のファイルが されます.className.methodName-result.xml データセットはできるだけ さくする があります.データが いということは、メンテナンス が きくなることを します.また、できるだけ じ をテストコードに したほうがいいです.
 
1.1.1.1.5マルチデータベーステスト
いくつかのアプリケーションでは、 のデータベースが されています.この を するために、UnitilsのデータセットXMLファイルでは、マルチデータベースをサポートできます. の では、2つのデータベースのデータテーブルにデータをロードする を します.
<?xml version='1.0' encoding='UTF-8'?>
<dataset xmlns="SCHEMA_A" xmlns:b="SCHEMA_B">
    <user id="1" userName="jack" />    
    <b:role id="1" roleName="admin" />
</dataset>
 
この では、2つのスキームを し、AおよびB、schema−AおよびデフォルトのXMLネーミングスペース け、schema B ネーミングスペースb.テーブルの に がある 、どのネーミングスペースが されるかを し、そうでない 、デフォルトのschema Aを します.
デフォルトのネーミングスペースがない 、databaseにデフォルト されます.schemaNamesプロパティの のschema.システムは の をサポートしています
database.schemaNames=SCHEMA_A, SCHEMA_B

これにより、システムのデフォルトschema-Aがデフォルトschemaとなり、デフォルトschemaを する がなくなります.
<?xml version='1.0' encoding='UTF-8'?>
<dataset xmlns:b="SCHEMA_B">
    <user id="1" userName="jack" />    
    <b:role id="1" roleName="admin" />
</dataset>
 
1.1.1.1.6テストデータベースへの
の では、テストデータベースに するデータソースがどこにあるのか、そしてどのようにしてUseDaoにこのデータソースを させるのか、 なことについては していません.
のデータベース・テストがテスト・コンポーネントで されると、Unitilsは されたプロパティを してデータ・ソース・インスタンスを し、テスト・データベースに します. のデータベース・テストでは、このデータ・ソースが されます. の なプロパティは のとおりです.
database.driverClassName=oracle.jdbc.driver.OracleDriver
database.url=jdbc:oracle:thin:@yourmachine:1521:YOUR_DB
database.userName=john
database.password=secret
database.schemaNames=test_john
 
とurl はUnitilsに する.propertiesファイルはプロジェクトとして され、ユーザーパスワードはUnitils-localに くことができる.propertiesは ごとに の として されます.これにより, が のテストデータを し, を することができる.
テストが されると、データ・ソースの がテスト・インスタンスに されます. またはsetterメソッドが @TestDataSourceで されている 、システムは したデータ・ソースを します.このデータソースを するために、プロジェクト のコードを する があります. 、これらの はプロジェクトの クラスで1 されます. な は のとおりです.
public abstract class BaseDAOTest extends UnitilsJUnit4 {
 
    @TestDataSource
    private DataSource dataSource;
    
    @Before    
    public void initializeDao() {
        BaseDAO dao = getDaoUnderTest();
        dao.setDataSource(dataSource);
    }
    
    protected abstract BaseDAO getDaoUnderTest();
}
 
The above example uses annotations to get a reference to the datasource. Another way of making your code use the Unitils DataSource is by callingDatabaseUnitils.getDataSource().
の では、 を して したデータソースを します.もう1つのUnitilsDataSourceを する はDatabaseUnitilsを することである.getDataSource().
1.1.1.1.7.1
くの 、 のようなトランザクションでデータにアクセスします.
データベース は、SELECT FOR UPDATEを する やコミット にトリガ がある にのみ する.
くのプロジェクトでテストを する に、general-purposeデータを する があります. テスト のデータには または があります. テストの にデータベースに の なステータスがあることを するには、 テストの にトランザクションが され、 が した にトランザクションがロールバックされます.
hibernateまたはJPAを すると、システムの な を するためにトランザクションを するように する があります.
By default every test is executed in a transaction, which is committed at the end of the test.
デフォルトでは、トランザクションで されるテストごとに、 するとデータがコミットされます.
デフォルトのアクションは、 のような で できます.
DatabaseModule.Transactional.value.default=disabled
 
オプションの は、commit、rollback and disabledです.
トランザクションの は、@Transactionalを するテストクラスで できます. :
@Transactional(TransactionMode.ROLLBACK)
public class UserDaoTest extends UnitilsJUnit4 {
 
これにより、このテストクラスの テストが されると、データがロールバックされます.@Transactional は できます. に じて、クラスをテストする クラスで できます.
は、UnitilsはSpringのトランザクション に していますが、これはSpringをアプリケーションコードに しなければならないという ではありません. にはユーザーにとってそれは です.
UnitilsとSpringを し、beanのタイプPlatformTransactionManagerをSpring に している .Unitilsはこのトランザクションマネージャを します.