DB Tester仕様 - テストフレームワーク統合
JUnit統合
モジュール
db-tester-junit
拡張クラス
パッケージ: io.github.seijikohara.dbtester.junit.jupiter.extension.DatabaseTestExtension
実装インターフェース:
BeforeEachCallback- 準備フェーズの実行AfterEachCallback- 期待フェーズの検証ParameterResolver-ExtensionContextのインジェクション
登録
@ExtendWith(DatabaseTestExtension.class)
class UserRepositoryTest {
// ...
}DataSource登録
@BeforeAllでデータソースを登録します:
@ExtendWith(DatabaseTestExtension.class)
class UserRepositoryTest {
@BeforeAll
static void setup(ExtensionContext context) {
var registry = DatabaseTestExtension.getRegistry(context);
registry.registerDefault(dataSource);
}
@Test
@DataSet
@ExpectedDataSet
void testCreateUser() {
// テスト実装
}
}設定のカスタマイズ
@BeforeAll
static void setup(ExtensionContext context) {
var registry = DatabaseTestExtension.getRegistry(context);
registry.registerDefault(dataSource);
var config = Configuration.builder()
.conventions(ConventionSettings.builder()
.dataFormat(DataFormat.TSV)
.build())
.build();
DatabaseTestExtension.setConfiguration(context, config);
}静的メソッド
| メソッド | 説明 |
|---|---|
getRegistry(ExtensionContext) | DataSourceRegistryを返すか作成 |
setConfiguration(ExtensionContext, Configuration) | カスタム設定を設定 |
ネストされたテストクラス
拡張機能はネストされたテストクラス間で状態を共有します:
@ExtendWith(DatabaseTestExtension.class)
class UserRepositoryTest {
@BeforeAll
static void setup(ExtensionContext context) {
var registry = DatabaseTestExtension.getRegistry(context);
registry.registerDefault(dataSource);
}
@Nested
class CreateTests {
@Test
@DataSet
@ExpectedDataSet
void testCreateUser() { } // 親のレジストリを使用
}
@Nested
class UpdateTests {
@Test
@DataSet
@ExpectedDataSet
void testUpdateUser() { } // 親のレジストリを使用
}
}アノテーション優先順位
メソッドレベルのアノテーションがクラスレベルをオーバーライドします:
@DataSet(operation = Operation.CLEAN_INSERT) // クラスデフォルト
class UserRepositoryTest {
@Test
@DataSet(operation = Operation.INSERT) // クラスをオーバーライド
void testWithInsert() { }
@Test
@DataSet // クラスデフォルトを使用
void testWithDefault() { }
}Spock統合
モジュール
db-tester-spock
拡張クラス
パッケージ: io.github.seijikohara.dbtester.spock.extension.DatabaseTestExtension
タイプ: アノテーション駆動型拡張(IAnnotationDrivenExtension<DatabaseTest>)
登録
拡張機能は、Specificationクラスに@DatabaseTestを追加し、DatabaseTestSupportトレイトを実装することで有効化されます:
@DatabaseTest
class UserRepositorySpec extends Specification implements DatabaseTestSupport {
DataSourceRegistry dbTesterRegistry = new DataSourceRegistry()
def setupSpec() {
dbTesterRegistry.registerDefault(dataSource)
}
@DataSet
@ExpectedDataSet
def 'should create user'() {
// テスト実装
}
}DatabaseTestSupportトレイト
DatabaseTestSupportトレイトはデータベーステストのコントラクトを提供します:
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
dbTesterRegistry | DataSourceRegistry | Yes | データソース登録 |
dbTesterConfiguration | Configuration | No | カスタム設定(デフォルトはConfiguration.defaults()) |
設定のカスタマイズ
SpecificationでgetDbTesterConfiguration()をオーバーライドします:
@DatabaseTest
class UserRepositorySpec extends Specification implements DatabaseTestSupport {
DataSourceRegistry dbTesterRegistry = new DataSourceRegistry()
Configuration dbTesterConfiguration = Configuration.builder()
.conventions(ConventionSettings.builder()
.dataFormat(DataFormat.TSV)
.build())
.build()
def setupSpec() {
dbTesterRegistry.registerDefault(dataSource)
}
@DataSet
@ExpectedDataSet
def 'should create user'() { }
}
### フィーチャーメソッド命名
シナリオ名はフィーチャーメソッドから導出されます:
```groovy
@DataSet
def 'should create user with email'() {
// シナリオ名: "should create user with email"
}データ駆動テスト
where:ブロックを使用したパラメータ化テストの場合、Spockはイテレーション名を使用します:
@DataSet
def 'should process #status order'() {
expect:
// テスト実装
where:
status << ['PENDING', 'COMPLETED']
}シナリオ名: "should process PENDING order", "should process COMPLETED order"
Kotest統合
モジュール
db-tester-kotest
拡張クラス
パッケージ: io.github.seijikohara.dbtester.kotest.extension.DatabaseTestExtension
タイプ: TestCaseExtension - 準備フェーズと期待フェーズのためにテストケース実行をインターセプトします。
登録
@DatabaseTestを使用した簡素化アプローチ(推奨):
@DatabaseTestアノテーションは自動的にDatabaseTestExtensionを登録します。SpecificationクラスはDatabaseTestSupportインターフェースを実装する必要があります:
@DatabaseTest
class UserRepositorySpec : AnnotationSpec(), DatabaseTestSupport {
override val dbTesterRegistry = DataSourceRegistry()
private lateinit var dataSource: DataSource
@BeforeAll
fun setupSpec() {
dataSource = createDataSource()
dbTesterRegistry.registerDefault(dataSource)
}
@Test
@DataSet
@ExpectedDataSet
fun `should create user`() {
// テスト実装
}
}明示的な拡張機能登録:
initブロックで拡張機能を登録します。Kotest 6ではextensions()メソッドがfinalになり、オーバーライドできません:
class UserRepositorySpec : AnnotationSpec(), DatabaseTestSupport {
override val dbTesterRegistry = DataSourceRegistry()
init {
extensions(DatabaseTestExtension())
}
@BeforeAll
fun setupSpec() {
dbTesterRegistry.registerDefault(dataSource)
}
@Test
@DataSet
@ExpectedDataSet
fun `should create user`() {
// テスト実装
}
}DatabaseTestSupportインターフェース
DatabaseTestSupportインターフェースはデータベーステストのコントラクトを提供します:
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
dbTesterRegistry | DataSourceRegistry | Yes | データソース登録 |
dbTesterConfiguration | Configuration | No | カスタム設定(デフォルトはConfiguration.defaults()) |
DataSource登録
DatabaseTestSupportインターフェースを実装し、dbTesterRegistryをオーバーライドします:
@DatabaseTest
class UserRepositorySpec : AnnotationSpec(), DatabaseTestSupport {
override val dbTesterRegistry = DataSourceRegistry()
@BeforeAll
fun setupSpec() {
dbTesterRegistry.registerDefault(dataSource)
dbTesterRegistry.register("secondary", secondaryDataSource)
}
}設定のカスタマイズ
インターフェース実装でdbTesterConfigurationをオーバーライドします:
@DatabaseTest
class UserRepositorySpec : AnnotationSpec(), DatabaseTestSupport {
override val dbTesterRegistry = DataSourceRegistry()
override val dbTesterConfiguration = Configuration.builder()
.conventions(ConventionSettings.builder()
.dataFormat(DataFormat.TSV)
.build())
.build()
}テストメソッド命名
説明的なテスト名にはバッククォートメソッド名を使用します:
@Test
@DataSet
fun `should create user with email`() {
// シナリオ名: "should create user with email"
}AnnotationSpec要件
DB TesterはKotest統合にAnnotationSpecスタイルを必要とします:
- アノテーション(
@DataSet、@ExpectedDataSet)をテストメソッドに適用可能 - リフレクションによるメソッド解決が信頼性が高い
- Java開発者にとって馴染みのあるJUnit風の構造
Spring Boot統合
JUnit Spring Boot Starter
モジュール: db-tester-junit-spring-boot-starter
拡張機能: SpringBootDatabaseTestExtension
自動DataSource検出
Spring Boot拡張機能は自動的に以下を実行します:
- Spring
ApplicationContextを検出 DataSourceBeanを検索DataSourceRegistryに登録
@SpringBootTest
@ExtendWith(SpringBootDatabaseTestExtension.class)
class UserRepositoryTest {
@Test
@DataSet
@ExpectedDataSet
void testCreateUser() {
// DataSourceはSpringコンテキストから自動登録
}
}複数DataSource
複数のデータソースには@Qualifierを使用します:
@Configuration
class DataSourceConfig {
@Bean
@Primary
DataSource primaryDataSource() { }
@Bean
@Qualifier("secondary")
DataSource secondaryDataSource() { }
}@SpringBootTest
@ExtendWith(SpringBootDatabaseTestExtension.class)
class MultiDatabaseTest {
@Test
@DataSet(sources = {
@DataSetSource(dataSourceName = ""), // Primary(デフォルト)
@DataSetSource(dataSourceName = "secondary") // Secondary
})
void testMultipleDatabases() { }
}設定プロパティ
application.propertiesまたはapplication.ymlで設定します:
# DB Testerの有効化/無効化(デフォルト: true)
db-tester.enabled=true
# DataSource Beanの自動登録(デフォルト: true)
db-tester.auto-register-data-sources=true
# データフォーマット(CSVまたはTSV)
db-tester.convention.data-format=CSV
# 期待ディレクトリサフィックス
db-tester.convention.expectation-suffix=/expected
# シナリオマーカーカラム名
db-tester.convention.scenario-marker=[Scenario]
# テーブルマージ戦略(FIRST, LAST, UNION, UNION_ALL)
db-tester.convention.table-merge-strategy=UNION_ALL
# デフォルト準備操作
db-tester.operation.preparation=CLEAN_INSERT
# デフォルト期待操作(通常は検証のみのためNONE)
db-tester.operation.expectation=NONE注意: プロパティ名は複数形ではなく単数形(convention, operation)を使用します。
Spock Spring Boot Starter
モジュール: db-tester-spock-spring-boot-starter
拡張機能: SpringBootDatabaseTestExtension(Groovy)
タイプ: アノテーション駆動型拡張(IAnnotationDrivenExtension<SpringBootDatabaseTest>)
@SpringBootTest
@SpringBootDatabaseTest
class UserRepositorySpec extends Specification {
@DataSet
@ExpectedDataSet
def 'should create user'() {
// DataSourceはSpringコンテキストから自動登録
}
}Kotest Spring Boot Starter
モジュール: db-tester-kotest-spring-boot-starter
拡張機能: SpringBootDatabaseTestExtension(Kotlin)
タイプ: 自動Spring ApplicationContext統合を持つTestCaseExtension。
@SpringBootTest
class UserRepositorySpec : AnnotationSpec() {
@Autowired
private lateinit var userRepository: UserRepository
init {
extensions(SpringBootDatabaseTestExtension())
}
@Test
@DataSet
@ExpectedDataSet
fun `should create user`() {
// DataSourceはSpringコンテキストから自動登録
}
}自動設定
自動設定クラス:
| モジュール | 自動設定クラス |
|---|---|
| JUnit Starter | DbTesterJUnitAutoConfiguration |
| Spock Starter | DbTesterSpockAutoConfiguration |
| Kotest Starter | DbTesterKotestAutoConfiguration |
ライフサイクルフック
JUnitライフサイクル
Spockライフサイクル
Kotestライフサイクル
ライフサイクル実行クラス
| フレームワーク | 準備 | 期待 |
|---|---|---|
| JUnit | PreparationExecutor | ExpectationVerifier |
| Spock | SpockPreparationExecutor | SpockExpectationVerifier |
| Kotest | KotestPreparationExecutor | KotestExpectationVerifier |
エラーハンドリング
| フェーズ | エラー型 | 動作 |
|---|---|---|
| 準備 | DatabaseOperationException | 実行前にテスト失敗 |
| テスト | 任意の例外 | ExpectedDataSetは引き続き実行 |
| 期待 | ValidationException | 比較詳細付きでテスト失敗 |