PHPUnit入門①・・・インストールから初めてのテストまで
きっかけ〜PHPUnitって意外と入門〜実務レベルまでの記事なくない?
PHP開発で単体テストをコード書いて自動化していきましょ〜ってなったときにまっさきにあがるものとして「PHPUnit」があると思うんですが...
調べていくとなかなか体系的にステップを踏んだ記事がない。
わりかし「これはこう。これはこう」なさらっとした「すでにある程度テストコードを書くことが何たるかは知っている人の確認用」の記事が多めな印象。
もちろん公式ドキュメントもあるけど……自分みたいな実務経験の乏しい人間にはなんというか、こう、腹にストンと落ちる感じがしない。
「これどうやって勉強したらいいの?」ってなったので、いい機会だからブログ立ち上げて手を動かしつつ学習記録&PHPUnit初学者への共有として書いていきます。
スペック
・いわゆる「駆け出しエンジニア(実務経験3ヶ月未満)」
・Ruby on Rails と Laravelでポートフォリオ作った経験はあり(他にAWS, Docker, CIツール等)
・『Railsチュートリアル』で学習したので、Minitestは書き写した書いた経験あり。
・転職成功&エンジニアとして入社はしたもののまだ本格的な開発経験なし。ただPHP案件に関わる&テストコードを書いていくことは確定なので、本格的な実務にアサインされる前にPHPUnitを習得しておきたい
環境
私自身はmacOSです。 また、お手持ちのPCにPHPがインストール済であることは大前提(Dockerに慣れているなら仮想コンテナ上でも問題なし!)。
参考までに私自身のPHPのバージョンは7.4.18になってます。
そのうえでPHPのパッケージ管理ツールのcomposerもインストール済であること。
Laravel等のモダンなPHPフレームワークには最初からPHPUnitが付いてくると思いますが、 自分が関わるPHP案件はLaravelではないので、生のPHPUnitをインストールします。
一応補足しておくとcomposerなしでもPHPUnitをインストールして走らせることは可能です。
が、おそらく殆どの現場ではcomposerを使用していると思いますので、特別な理由がない限りcomposerを使ってインストールした方がいいと思います。
macOSの方でcomposer未インストールの方はHomebrewの下記コマンド一発でいける(はず)。
$ brew install composer
↑と思ったけどそもそもHomebrew自体準備できていない方はググってください……(初学者は何するにもインストール&セットアップがキツイですね)
インストールから初めてのテストまで
PHPUnitのインストール
先にプロジェクトフォルダを作成しましょう。
$ mkdir PHPUnit(何でもいい)
その上で下記のPHPUnitの公式にあるように
https://phpunit.de/getting-started/phpunit-9.html
$ composer require --dev phpunit/phpunit ^9
上のコマンドを入力し、composerを使って プロジェクトフォルダ上で PHPUnitを落とします。 今回は現時点で最新版のversion9を使用します。
公式のドキュメントにあるように、基本的にPHPUnitはグローバルにインストールするのではなく、プロジェクト単位で管理しましょうとのことです。 ↓
https://phpunit.readthedocs.io/ja/latest/installation.html#installation-global
versionを確認。
$ ./vendor/bin/phpunit --version PHPUnit 9.5.4 by Sebastian Bergmann and contributors.
うまく落とせましたね。
また、プロジェクトフォルダ配下にvendorフォルダやcomposer.jsonやcomposer.lock ファイルなどが自動生成されていると思います。
エイリアスを設定
毎回pathを書くのも面倒なので、エイリアスを設定しておきましよう。
$ alias phpunit='./vendor/bin/phpunit'
これでいちいち「./vendor/bin/phpunit」みたいに打たなくても、「phpunit」でPHPUnitが動いてくれます。
$ phpunit --version PHPUnit 9.5.4 by Sebastian Bergmann and contributors.
以上でPHPUnitがプロジェクトフォルダで使えるようになりました。
testsフォルダの作成
準備の最後として、プロジェクトフォルダ直下にテストをまとめて置いておく「tests」フォルダを作りましょう。
$ mkdir tests
はじめてのテスト
では早速はじめてのテストを書いちゃいましょう。
適当な名前でいいのですが「Test.php」が名前に含まれているテストファイルをtestsフォルダの配下に作ります。
「なぜTest.phpを含めなきゃだめなの?」と疑問を持つかもしれませんが、簡単に言うとその方が楽だからです(簡単すぎw)。
のちのち説明&自由な名前でも動作させる方法をまとめますので今のところはとりあえず進めちゃいます!
$ touch tests/ExampleTest.php
↑「tests」フォルダ直下に「ExampleTest.php」を作成します。
↓「ExampleTest.php」の中
// ExampleTest.php <?php // PHPUnit使いますよ〜のおまじない(基本思考停止で絶対書くもの) use PHPUnit\Framework\TestCase; // TestCaseを継承した○○Test(ファイル名)クラスを宣言(これも絶対書く) class ExampleTest extends TestCase { // 訳すと「2 + 2 の結果は4だよねテスト」。わかりやすい名前は大事、ゼッタイ。 public function testAddingTwoPlusTwoResultsInFour() { // 「this」がいまいち理解できないなら「基本書くやつ」ぐらいの認識でもいいと思います。 $this->assertEquals(4, 2 + 2); } }
assertEqulasって?
assertEquals()は「第一引数と第二引数はイコールだよね?→True or Falseで返す」みたいなメソッドです。
assertEquals()の第一引数は期待値、つまり「こうなったらテストは合格!」な結果を書きます。
今回の場合ですと、「2 + 2 の結果は4だよね」テストなので、期待値はもちろん「4」です。
第二引数には式、またはテストする関数を書きます。
おそらく実務ではほぼ他のファイルの関数を呼び出すことになると思いますが、今回のように式を直接書いてもオッケーです。
今回の場合は「2 + 2 の結果は4だよねテスト」なので、「2 + 2」を書きます。
ちなみに「assert」という言葉は他の言語でテストする際にも嫌というほど見ると思うので、テスト初心者(私もですが)は慣れておいた方がいいでしょう。
辞書的な意味では「主張する」「でしゃばる」みたいなことが書いてありますが、ソフトウェアテストの文脈で使うときは、
上司「テストAの結果は○○だよね?(圧力)」=「assertEquals(○○, テストA)」
↓
部下「はい!」= 「True(テスト成功)」
上司「まさかテストBの結果が●●なんてことはないよね?(圧力)」=「assertNotEquals(●●, テストB)」
↓
部下「い……いいえ」= 「False(テスト失敗)」
という強制的に「はい or いいえ」の二択をプログラムに問うているニュアンスで理解した方がいいと思います。
こんな上司嫌ですねぇ……笑
テスト実行
それではterminalで初めてのPHPUnitを走らせて見ましょう。
「testsファイル以下を全部テストする」という意味で以下のコマンドを打ちます。
$ phpunit tests (略) OK (1 tests, 1 assertions)
テストを1つ実行、1つのアサーションメソッドを実行して「OK」つまりパスしました。
これでPHPUnitの初めてのテストの終了です。
今後
次回は失敗や例外のテストから始めます。
一通りテストについて書いたら、TDD風な流れで簡易TODOアプリ開発とかやりたい。
ではではまた次の機会に