taiPyのお悩み解決ブログ

日々の発見をまとめます!

Spring Frameworkのテスト環境ではH2データベースを使いたいときにどうするといいか。

はじめに

ソフトウェア開発をする上でテストを実施します。テストは大きく分かれて2種類あり、1つ目が人の手で実行する方法、2つ目が自動テストをする方法とがあります。

自動テストをするときに、本番環境と開発やテスト環境を切り替えたいときがあります。今回の私の例を申し上げれば、今、Spring Frameworkを使い、webアプリを作成しています。本番環境ではデータベースにpostgresを使っていたのですが、この環境だとテストがしにくいことが判明しました。逆に、H2データベースと呼ばれるデータベースがあるんですが、そちらを使ったほうがテストが容易であることが調べていくうちにわかったんですよね。でも本番環境はpostgresを使っていきたい。

じゃあ、どうやって本番環境ではpostgresを使ってテスト環境では平日データベースを使うように切り替えていくのか。

これについて本日は解説して行きたいと思います!

目次

前提事項

解説して行くにあたりまずは前提事項を押さえていきましょう。私が開発に使っていた環境は次のようになります。

  • Windows 11
  • eclipse
  • Spring Framework 3.x
  • gradle
  • テスト用にH2データベースを使用

結論

テスト用に設定を用意する! 具体的に言えば、次の2つのステップ。

①テスト用のapplication.properties

②テスト実行時にH2データベースを使用するようにbuild.gradleに書く!

①テスト用のapplication.properties

次のフォルダ構成になります。画面下部の位置に、テスト用のapplication.propertiesがあるかと思います。こちらを作成。(src/test/resourcesを右クリック → 新規 をクリック → ファイル をクリック)

中身は下記の通り。こちらを記述する。

# =の右にはアプリの名前を記載
spring.application.name=yourAppName

# DataSource
# SQLスクリプトの初期化モードを設定
spring.sql.init.mode=always
# Log表示設定 DEBUG=詳細なログ
logging.level.com.example.webapp.repository=DEBUG

# H2 Databaseの設定
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=yourname
spring.datasource.password=yourpass

# H2 Consoleの有効化
# webブラウザで操作可能になる
spring.h2.console.enabled=true

メリット このファイルを作成することで、テスト実行時にこの設定が読み込まれます。つまり、テスト環境と本番環境を分けることが出来ます!

注意点

H2データベースを使用するためにいろいろ設定しないといけないので、うまくいかなかった人はH2データベースの設定を見直してほしい。

  • そもそも設定しているのか。
  • H2データベースの設定とapplication.propertiesの記載内容があっているのか。

②テスト実行時にH2データベースを使用するようにbuild.gradleに書く

testImplementation 'com.h2database:h2'dependenciesに追加する!下のような見た目になるかと思います。一番下です。

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.postgresql:postgresql'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'


    testImplementation 'com.h2database:h2'
}

下記は、ChatGPTさんの解答になります。ご参考までに。

testImplementation 'com.h2database:h2'という記述は、Gradleプロジェクトの build.gradle ファイル内で見られるもので、テストコードの実行時にH2データベースを使用するための依存関係を指定しています。

具体的には、'com.h2database:h2'は、H2データベースの依存関係を示しています。つまり、プロジェクトのテストを実行する際に、H2データベースを使用するために必要なライブラリがプロジェクトに含まれることを意味します。

参考文献