LoginSignup
3
1

More than 3 years have passed since last update.

PHPUnitでテストデータを使用する際の準備

Last updated at Posted at 2020-09-15

はじめに

日々学習していて、最近はアプリケーション開発を行っています。しかし、恥ずかしながら今までテストコードを書いたことがありませんでした。

学習用の小さなアプリケーションのため、後回しにしてしまい今に至ります。
実務で基本的に使われると思うので、この小さなアプリケーションの開発だからこそなれるために書いていこうと思います!

とはいっても、この記事では具体的に書いたコードを説明するわけではなくテストコードを書く前段階の準備等についてまとめていきます。

対象者:テストコード書いたことがない初心者

バージョン

・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について記載する

phpunit.xml
<server name="DB_CONNECTION" value="mysql"/> //今回はMySQLを使用するため追加
<server name="DB_DATABASE" value="テスト用DB名"/> 

3.テスト実行時に、テスト用のDBを使用するようにテスト用の.envファイル(.env.testing)を作成する
.env.exampleの内容をコピー

変更点

env.testing
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系公式ドキュメント

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使用にあたって必要なことをまとめました。
引き続きテストコードも書いていきたいと思います!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1