サイトアイコン TestRail Blog

データベースを単体テストする方法

この記事は2021年4月7日にNishi Groverによって更新されました。

これまでの常として、もし単体テストとは何かと尋ねたなら、おそらくみごとなまでにバラバラの定義が返ってきたでしょう。

定義のなかには、たとえば「単体テストとはシステムの動作と機能をテストするためにコードを記述するプロセスである」といった非常に具体的なものから、「作ったばかりのものをテストすることだ」といった極端にあいまいなものまであります。 

しかし、単体テストが何であれ、もっと単体テストを行わなければならないという点には、誰もが同意するでしょう。単体テストは、技術の世界では、デンタルフロスを使用するようなものです。まだやっていなければ、始めるべきです。もうやっているとしても、十分ということはありません。

単体テストの基本

単体テストは自動化されたテストであり、たいていは開発者によって作成され、小さなコードコンポーネントを分離し、個別にテストします。

簡単なサンプルを考えてみましょう。2つの整数を加算する Add(int x, int y) というメソッドを作成するとします。

このメソッドの単体テストの1つとして、Add(2, 2)を呼び出した後、結果が4になることを検証します。それから別の単体テストとして、Add(2、 -2) を作成し、結果がゼロであることを検証します。

さまざまな単体テスト技法についてはこちらで詳しく学べます。

単体テストの特徴

単体テストは特定のガイドラインに従う必要があり、保守が容易でなければなりません。こちらでは、保守が容易な優れた単体テストの5つの要素について説明しています。

データベースの単体テストを行う理由

データベースはアプリケーション全体にとって重要なパーツです。データベースがテストの死角になってはいけません。 

アプリケーションのコードがファイルを開いたりデータベースに接続したりする場合、単体テストの細分化、分離、確定的の原則に反します。そこで、ファイルやデータベースをモック化して単体テストスイートから排除します。

では、データベースはどうやってテストしましょうか?そのために統合テストがあります。アプリケーションコードの隅々まで細心の注意を払ったうえで、データベースに関するすべてのテスト上の懸念を統合テストという大きなくくりの中に投げ入れます。

ところで、データベースは重要ではないのでしょうか?データベースは技術的製品の一部ではないのでしょうか?データベースを単体テストする価値はないのでしょうか?

データベースの単体テストはアプリケーションコードの単体テストほどには一般的ではありませんが、完全に実現可能です。これからその方法を説明します。

データベースを単体テストする方法

データベースのさまざまなテーブル、ビュー、トリガー等の作成スクリプトをソース管理します。すると、理論的には、データベースの空のインスタンスを取得し、テーブル等の要素の最小限のサブセットを独立して作成できることになります。これを出発点として、その後のあらゆる種類の動作をテストできます。

こちらでは採用するとよい習慣をいくつか紹介しています。

本来の性質として、データベースとアプリケーションコードにはいくつか重要な違いがあります。たとえば、データベースを既知の状態に設定すること、また開発者ごとにデータベースサーバーのコピーを持つことにいっそう注意を払うなど、いくつか新たにやるべきことがあります。しかし、隔たりは思うほどには大きくありません。

使用するツール

アプリケーションの単体テストフレームワークは豊富に存在し、自作する必要はありません。データベースの単体テストフレームワークはそれほど知られていませんが、やはり同じことが言えます。

検討を始めるにあたってチェックするべきツールがいくつかあります。

DbUnit
DbUnitはテストとテストの間にデータベースを既知の状態に設定します。DbUnitはデータベース駆動型プロジェクトに役立つJUnit拡張です。データベースのデータをインポート/エクスポートしたり、データが特定のセットと一致するかどうかを検証できます。
SQL Server
SQL Serverは機能スイートの一部としてデータベースの単体テストをサポートしています。テストプロジェクトを作成してSQL Serverの単体テストを直接追加し、操作できます。

SQL Test

SQL Testでは、トランザクション内でデータベース単体テストが実行されます。後で変更がロールバックされるため、クリーンアップコードは必要ありません。SQL TestはオープンソースのtSQLtフレームワークを使用します。 
DbFit
DbFitを利用すると、テスト駆動型データベース開発を実践できます。可読性と保守性の高いデータベースの単体テストコードを作成できます。
DB Test Driven
DBTDはデータベーステスト駆動型開発のためのツールです。管理が容易なデータベース単体テストを作成するのに役立つほか、コードカバレッジも計測できます。また、ビルドサーバーと統合して継続的インテグレーション機能を利用できます。

データベースの単体テストの特徴

アプリケーションの単体テストの前提条件は、すべてデータベースの単体テストでも満たすことができます。

データベースの単体テストは可能なだけではなく、有意義です。データベースをテストの死角にしてはいけません。単体テストについてもっと知りたい方は、記事「The 7 Sins of Unit Testing」を参照してください。

この記事はErik Dietrichによるゲスト投稿です。Erik DietrichはDaedTech LLCの創業者であり、プログラマー、アーキテクト、ITマネジメントコンサルタント、著作者、科学技術者です。

(この記事は、開発元Gurock社の Blog 「How to Unit Test Your Database」2021年4月7日の翻訳記事です。)

モバイルバージョンを終了