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はこのトランザクションマネージャを します.