tubo28's blog
つぼの 140 文字より長い文章置き場
About me

DBを使うユニットテストの方法いろいろ

Last Modified:
Tags: tech

POST /api/users のような REST API でリレーショナルデータベース上に新しいユーザー(例)を作るとします。 そのユニットテストの方法として、下記のようなものがあると思います。

  1. テストケース間で共通のデータベースを使用し、テストの記述に使う ID などは作成した結果から動的に取得するようにする
  2. テスト時は SQLite や H2 のような軽量なデータベースを利用し、テストケース毎にクリーンなデータベースを作成、削除する
  3. テスト対象のメソッドをデータベースクエリのトランザクションを取る設計とし、テストケース毎にロールバックする

それぞれの長所と短所を ChatGPT 4 先生に聞いてみましょう。


POST /api/usersのようなREST APIでリレーショナルデータベースに新しいユーザを作成するAPIのユニットテスト方法に関して、ご指摘の3つのアプローチそれぞれの長所と短所を説明します。

1. 共通データベースを使用し、動的にID取得

長所

短所

2. 軽量データベースを使用し、テストケース毎にクリーンな環境

長所

短所

3. トランザクションを用いてテストケース毎にロールバック

長所

短所

各アプローチは特定の状況や要件によって適切さが異なるため、実際のプロジェクトの環境や目的に応じて最適な方法を選択することが重要です。


引用終わり。

私が思うところを追記すると、2 と 3 は最初からその方法でのユニットテストを必須とする体制で開発していないと導入は厳しいです。それで困ったことがあるので、ヒントを得るために GPT 4 先生に聞いてみたらよくまとまった答えがもらえ感動したので、そのまま記事にしてしまいました。

もっと聞いてみましょう。

他の方法はありますか?


APIのユニットテストに関して、他にもいくつかのアプローチが考えられます。これらの方法は、データベースの扱いやテストの実行方法によって異なります。

4. モックオブジェクトを使用

長所

短所

5. インメモリデータベース

長所

短所

6. サンドボックス環境での統合テスト

長所

短所

これらの方法は、プロジェクトの要件、利用可能なリソース、チームのスキルセットなどに基づいて選択することが重要です。また、異なるアプローチを組み合わせることで、より包括的なテスト戦略を構築することも可能です。例えば、単体レベルではモックを使用し、統合レベルではサンドボックス環境を使用するなどです。


引用終わり。

4 はせやな、5 は 2 とあまり変わらん、6 はもはやユニットテストではないよね、という感じなので一般的な方法は出尽くしたようです。