はじめに
プロジェクトを作成するたびにPHPUnitの設定方法忘れて都度調べてるので、忘備録として残して忘れないようにしておきたいと思います。
PHPUnitの設定方法は何通りかあるかと思いますが、この記事では SQLiteのインメモリ機能
を用いて開発用のDBを汚さない設定方法を使用します。
実行環境
今回PHPUnitの設定は下記のバージョンで行います。厳密に同じ環境でなくてもメジャーバージョンがあっていれば同様の設定で動くかと思います。
言語・ツール | バージョン |
---|---|
Laravel | 7.10.3 |
PHP | 7.2.26 |
PHPUnit | 8.5.4 |
設定方法
PHPerからするとMySQLと比較してあまり馴染みがないかもしれませんが、本記事ではテスト用DBにSQLiteを使用します。
SQLiteとは?
SQLite
はオープンソースのリレーショナルデータベースです。主に以下の特徴を持っています。
・サーバ側に設置する必要がなく、アプリケーションに組み込みこんで使用することができる
・動作が軽量
・データ量の少ないデータを扱うのに適している
・ローカルのファイルを直接データベースとして扱うので、複数のサーバとネットワーク越しに同時接続するのには不向き
インメモリ機能とは?
インメモリ機能(インメモリデータベース)
とはデータストレージを主にメインメモリ上で管理する、データベースシステムです。今回の場合ですと、PHPUnitでテスト実行時にメモリにデータベースが作成されて、テスト終了時にデータベースは存在しなくなります。そのため開発用のデータベースを汚さずにテストを実行することができます。
設定
それでは実際に、設定をしていきましょう。
まずはデータベースの接続設定をconfig/datbase.php
に追加します。database
の項目に:memory:
を指定している点がポイントです。こうすることによりデータベースのメインメモリ機能を使用することができます。
'connections' => [
....
....
'testing' => [
'driver' => 'sqlite',
'database' => ':memory:', // SQLiteのインメモリ機能を使用
'prefix' => '',
'options' => [
PDO::ATTR_PERSISTENT => false,
],
],
],
次にPHPUnitの設定を行います。<server>
にて環境変数が指定されるので、DB_CONECTION
を追加して、値を上記のconfig/database.php
で設定したキーtesting
を使用します。
<php>
<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
<server name="DB_CONNECTION" value="testing"/> // この行を追加
</php>
テストの実行
Laravelのプロジェクトを作成した際にデフォルトで用意されているExampleTest.php
を実行してテストが通るか確認します。テスト結果が下記のようにOK
となれば正しくPHPUnitの設定ができているかと思います。
$ vendor/bin/phpunit tests/Feature/ExampleTest.php
PHPUnit 8.5.4 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 1.85 seconds, Memory: 18.00 MB
OK (1 test, 1 assertion)
おまけ
テスト実行時にvendor/bin/phpunit
と毎回入力するのは煩わしいかと思うので、その際は下記のように、コマンドをエイリアスを設定してあげるといいかと思います。こうすることで、pu
とコマンドを叩いてあげることで、画面がリフレッシュされた後でテストを実行することができます。
$ alias="clear && vendor/bin/phpunit"