はじめに
日々学習していて、最近はアプリケーション開発を行っています。しかし、恥ずかしながら今までテストコードを書いたことがありませんでした。
学習用の小さなアプリケーションのため、後回しにしてしまい今に至ります。
実務で基本的に使われると思うので、この小さなアプリケーションの開発だからこそなれるために書いていこうと思います!
とはいっても、この記事では具体的に書いたコードを説明するわけではなくテストコードを書く前段階の準備等についてまとめていきます。
対象者:テストコード書いたことがない初心者
バージョン
・PHP:7.3.19
・Laravel:7.20.0
PHPUnitについて
PHPUnitとは、PHPのテスト用ツールである。
今回使用するLaravel7.20.0には標準でPHPUnitが使えるためこちらを使用していく!
テストコードを書くメリットは?
テストコードを書くことでいろいろなメリットがあると思います。いくつか挙げてみると
- 仕様変更等を行ったときに、その変更によって想定外のエラーが発生した際などに早く気付くことが出来る
- 挙動が仕様と合致しているか確認できる
- 繰り返しテストを行うことが出来る
- テストである程度の品質は確認できるため安心して開発に取り組める
などなど。
やってみよう
まずは、Artisanコマンドでスケルトンの作成
php artisan make:test PracticeTest
なにも指定しないとtests/Feature配下に作成される。
Unitテスト用のファイル(tests/Unit配下)を作成したい場合は
php artisan make:test PracticeTest --unit
と記載することでできる。
FeatureとUnitの違いとしては、
Unit:関数やメソッド単位でテストを行う
Feature:コントローラやルーティングでのテストを行う
というイメージ?(間違っていたらご指摘ください)
※テストファイルの命名規則は、アッパーキャメルケース(単語の最初の文字が大文字)であること。あとは、テストしたいクラス名+Testが基本。
テスト用のデータベースを準備しよう!
テストする際、本番環境のデータベースを使用するのは非常に危険!!!
そのため、テスト用のデータベースを準備する必要があります。
1. まずはテスト用のDBを作成
2.phpunit.xmlでテスト用DBについて記載する
<server name="DB_CONNECTION" value="mysql"/> //今回はMySQLを使用するため追加
<server name="DB_DATABASE" value="テスト用DB名"/>
3.テスト実行時に、テスト用のDBを使用するようにテスト用の.envファイル(.env.testing)を作成する
.env.exampleの内容をコピー
変更点
APP_ENV=testing #localからtestingに変更
APP_KEY= 空で #のちに新しく作成する
DB_DATABASE=テスト用DB
APP_KEYを新規で作成しないと、.envファイルのAPP_KEYを参照してしまうらしい。
php artisan key:generate --env=testing
アプリケーションキーを作った後は、下記コマンドを実行しておこう。
php artisan config:clear
あとは、テストコードを書いていけばいける!と思いテストを行ってみましたがいくつか躓いたので記載します。
〇テストデータの削除
テスト用のデータベースを扱う場合、テスト実行後にそのテストデータを削除する必要があります。というのも、テストデータが残っていると、これが原因でエラーが起こる可能性があるためである。
Laravel7系では、RefreshDatabaseを使用することでDBをリセットできる。
RefreshDatabaseとは、各テストの後にDBをリセットしてくれるトレイト。
使用方法は、下記の通りに記載する。
[PracticeTest]
use Illuminate\Foundation\Testing\RefreshDatabase;
class PracticeTest extends TestCase
{
use RefreshDatabase;
}
〇Error: Call to a member function connection() on null
調べてみると、Unitテストクラスのひな形のTestCaseが別のクラスを指していることが原因とのこと。Featureテストの場合は、下記のように修正する必要がある。
[PracticeTest]
use Tests\TestCase; // PHPUnit\Framework\TestCaseでは×
まとめ
ざっくりにはなりますが、PHPUnit使用にあたって必要なことをまとめました。
引き続きテストコードも書いていきたいと思います!