Points & Lines

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

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


PHPUnitでデータベース連携機能のユニットテストを行う方法を紹介します。

本記事で利用するプログラム、テストケースのサンプルは下記よりダウンロード出来ます。
Download

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

拡張機能 DBUnit


PHPUnitでDBのテストを行うためには、拡張機能であるDBUnitを用意する必要があります。
PHPUnit本体と同様、Composerを使用してDBUnitをプロジェクト内にインストールします。

(注意)PHPUnit本体のバージョンがDBUnit拡張をサポートしている必要があります。
詳細は下記参照

【PHPUnit 9.5】PHP Fatal error: Trait ‘PHPUnitDbUnitTestCaseTrait’ not found

既存のcomposer.jsonにdbunitを追記。

{
    "require-dev": {
        "phpunit/phpunit": "^5.7|^6.0",
        "phpunit/dbunit": ">=1.2"
    }
}

コマンド composer updateを実行してライブラリを追加でインストールします。

composer update

これにより、テストケース内からDBをテストするための様々な拡張機能が利用できるようになります。

(SAMPLE)

テスト用DBを作成


今回はMySQLを使用していますが、基本的にどのDB(RDBMS)でもテストの実行方法は同じかと思います。

テスト対象として一つのテーブルbooksを作成する。
(DB作成のSQLはダウンロードサンプル内、database.sqlに用意しています)

+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int          | NO   | PRI | NULL    | auto_increment |
| title  | varchar(100) | YES  |     | NULL    |                |
| author | varchar(50)  | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+

(注意)
ユニットテストで使用するDBは都度データを書き換えるため、開発用で使用しているDBとは別にコピーを用意する必要があります。

テスト対象プログラム

Book.php

<?php

namespace app\src;

class Book
{
    protected $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function insert($title, $author)
    {
        $sql = "INSERT INTO books (title, author) VALUES (:title, :author)";
        $prepare = $this->db->prepare($sql);
        $prepare->bindValue(':title', $title, \PDO::PARAM_STR);
        $prepare->bindValue(':author', $author, \PDO::PARAM_STR);
        $prepare->execute();
    }

    public function findTitleById($id)
    {
        $sql = "SELECT title FROM books WHERE id = (:id)";
        $prepare = $this->db->prepare($sql);
        $prepare->bindValue(':id', $id, \PDO::PARAM_INT);
        $prepare->execute();
        $result = $prepare->fetch(\PDO::FETCH_ASSOC);
        return $result['title'];
    }

    public function update($title, $author, $id)
    {
        $sql = "UPDATE books SET title = (:title), author = (:author) WHERE id = (:id)";
        $prepare = $this->db->prepare($sql);
        $prepare->bindValue(':title', $title, \PDO::PARAM_STR);
        $prepare->bindValue(':author', $author, \PDO::PARAM_STR);
        $prepare->bindValue(':id', $id, \PDO::PARAM_INT);
        $prepare->execute();
    }
}

次回の記事でテストを作成、実行していきます。

Follow me!

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