PHPUnitでユニットテスト⑤ データベースをテストする 後編

PHPUnitでデータベースのテスト


前回の記事でテスト対象DBとプログラムの作成を行いましたので、今回はテストケースを作成して実際にユニットテストを実行していきます。

PHPUnitでユニットテスト⑤ データベースをテストする 前編

環境: PHPUnit 6.5.14, PHP 7.4.8, mysql Ver 8.0.19

(SAMPLE)

テストケースクラス、及びテストケースクラスから利用する設定ファイルを用意します。

テストデータの用意

テスト実行前の状態と実行後の期待値の整合性を保つため、ひとつのテストを実行する度に、DB内のデータを決まった値で初期化する必要があります。

この初期化する動作、または初期化データのことをフィクスチャーと呼びます。

フィクスチャー用のデータは様々な形式で用意することが出来ますが、今回はYAMLというデータ形式で作成する方法を紹介します。

BooksTest_fixture.yml

上記のように、.ymlという拡張子形式のファイルをプロジェクト内に作成します。

最初のbooks:がDB内のデータを保存するテーブル名を指し、次の行以降からはテーブルに挿入する1レコード毎のデータを-(ハイフン)区切りで記述し、

id:
title:
author:

と1レコード毎にそれぞれカラム(列)の値を指定していきます。

フィクスチャーのデータが、テスト実行毎にbooksテーブルのデータとして上書きされるようになります。

同じ階層にBooksTest_after_insert.ymlという異なるデータも作成しておきます。(後述)

DBの接続設定

DBの接続情報は設定ファイルphpunit.xmlに記述でき、
パラメータをconstで設定することでテストケースクラス内から定数として利用することが出来ます。

phpunit.xml

テストケースクラスの作成

公式ドキュメント推奨のテストケース作成方法

テストをより汎用的にするため、DB接続機能であるgetConnectionメソッドを下記のように抽象クラスに定義し、テストケースクラスから継承しています。
これにより子クラスとして作成するテストケースは毎回同じDBに接続することが出来、操作対象のテーブルやフィクスチャーはテストケース毎に変えられます。

(抽象クラス)Generic_Tests_DatabaseTestCase.php

テストケースクラス BookTest

テスト対象プログラム、BookのテストケースクラスとしてBookTestを作成します。

BookTest.php

用意したテストの中からtestInsertメソッドについて解説します。

まず、bookクラスのinsertメソッドで1件のレコードを挿入後、getRowCount機能でテーブルに存在するデータ(レコード)の件数を取得しています。

フィクスチャーとして用意したBooksTest_fixture.yml内のデータは4件のため、insert実行後の全件数の期待値を5件として、assertEqualsで検証しています。

次に、insert実行後のデータの状態を記述したBooksTest_after_insert.ymlから、getTable機能を使って期待される値を保持したDBテーブルを作成します。
(YAMLファイルからDBテーブルを組み立てるイメージ)

最後はcreateQueryTable機能を使って実際のDBからinsert実行後のbooksテーブルを取得し、そちらと先ほどgetTableで作成した期待値のテーブルデータをassertTablesEqualで比較しています。

テストを実行する

テストケースの作成、準備が出来たらユニットテストを実行します。

実行結果

上記結果より、insertによるデータ挿入機能自体は正常に動作していますが、assertTablesEqualのアサーションが失敗していることがわかります。

結果に表示されている2つのテーブルの値を参照すると、insert実行時にパラメータで指定しているデータと、期待値として用意しているデータが異なっていますので、どちらかを修正してテストを成功させます。

今回は解説を省きますが、同テストケース内、testUpdateによるデータ更新のテストも専用の結果ファイルを用意して同様にアサーションします。


このようにDBUnitの機能を利用してユニットテストを行うことで、アプリケーションで利用するDBやSQLの正しい動作を担保していくことが出来るようになります。

Follow me!

PHPUnitでユニットテスト⑤ データベースをテストする 後編” に対して1件のコメントがあります。

コメントは受け付けていません。