Phalcon フレームワークに PHPUnit を組み込む手順まとめ【実践メモ】

Webアプリケーションの品質を保つうえでユニットテストは欠かせません。
今回は、Phalcon フレームワークを使ったシステム保守の現場で、PHPUnit を導入した際の手順をまとめました。

各バージョンは以下の通りです。
・Phalcon 3.4.5
・PHP 7.2.34
・PHPUnit 8.5

1. PHPUnitを開発依存パッケージとしてインストール

composer で PHPUnit を追加します。
ローカル開発環境で使用するため、”–dev” オプションを付けてインストールします。

[/crayon]

2. composer.json へオートローダを設定

composer.json ファイルへテスト用クラスの自動読み込み設定を追加します。
PSR-4 に準拠して、”tests/” ディレクトリ以下のクラスを “Tests\” の名前空間で扱います。

[/crayon]

3. Phalcon Incubator の導入

Phalcon にはユニットテスト用の抽象クラスなどが用意された公式パッケージ “phalcon/incubator” があるため、それを導入します。

[/crayon]

4. Composer インストール

各依存ライブラリをインストールします。
フレームワークのバージョンに応じて依存ライブラリを変更せずに再構築したいため、次のコマンドでインストールを行います。

※ “composer update” はライブラリのバージョンが変わる可能性があるため、依存関係を崩さず、今回導入するもののみインストールします。

[/crayon]

5. オートロードを再構成

テストクラスを新しく追加した場合や “composer.json” を変更した際は、オートロードを再生成します。

[/crayon]

私の場合、ここでエラーが出ました。


エラーが出ると身構えますが、classが見つからないというエラーでした。
よくよく確認すると同じclassではあるものの、記述されるファイルによってディレクトリ名やクラス名のキャメルケースが揃っていないということがわかりました。
バージョンが古いため、今までは問題なく動いていたようですが、これを機に見直し修正しました。
その後は無事問題なくオートロードの再編成ができました。

6. テストの実行

準備が整ったら、実際にテストを実行します。
導入段階では “SampleTest.php” を作成し、”SUCCESS” と出力する簡単なテストを作成しました。

[/crayon]

ひと通り行った手順は以上となります。
上記テスト実行でも “SUCCESS” と帰ってきたのでホッとしました。

まとめ

初めての案件で Phalcon を触ったこともあり、苦戦しました。
Laravel も研修で少し触った程度の知識しかなかったため、理解が追いつかない部分も多かったです。
作業中はネットの記事を参考に進めました。
Phalcon を扱っている情報は、ある程度経験を積んだエンジニア向けに書かれているものが多い印象でした。
コマンドだけがさらっと書かれており、コマンドや設定の説明が少なく、自分のレベル感だと読み解くのに時間がかかりました。
また記事はPHPUnit単体の話が多く、フレームワークと組み合わせた話があまりありませんでした。
テスト導入を実際にやってみたところ、出てきたコマンドを一つずつ調べ、そのコマンドが何をしているのか、どのファイルにどう影響するのかを追いかけるところを並行する必要がありました。
エラーメッセージを頼りに原因を切り分けていく作業は大変でしたが、その分、フレームワークやツールの挙動を理解するきっかけにもなったかなと感じています。


PHPUnit_その3(データプロバイダ)

福岡拠点の永嵜です。

前回に引き続きPHPUnitの機能を紹介します。

今回はデータプロバイダ機能を紹介します。
データプロバイダ機能とは、テストメソッドに任意の引数を渡せる機能です。
データプロバイダを使用すると同じテストメソッドで様々なテストができる利点があります。

データプロバイダ機能


例題を示しながら説明します。
前回使用したテストケースにデータプロバイダを追加します。

■テストケース

traiangleProviderメソッドがデータプロバイダになります。
[4, 2, 4]、 [4, 2, 10※1]がテストメソッドに渡す引数になります。
[横、縦、想定値]のデータをテストメソッドに渡します。
配列一つが1テスト用のデータになります。

※1  今回データプロバイダの説明のために想定値に誤った値を設定してテスト失敗を発生させています。

データプロバイダのデータにラベルを付けることができます。
(‘ok pattern’/’ng pattern’)
ラベルを付けることによってテスト失敗時にどのデータで失敗しているかを確認しやすくなります。
データプロバイダからデータを受け取るにはテストメソッドに@dataProviderアノテーションを付けます。

■実行

‘ng pattern’のデータでテスト失敗となりました。

また、実行時にfilterオプションを使用すると実行したいテストデータだけテストすることができます。

■データ指定(ok pattern)で実行

 

最後に

前回、今回、PHPUnitの概要を説明しましたが、PHPUnitには
コマンドオプション、アノテーション、アサーションなど他にも便利な機能があるので詳細を知りたい方は下記をチェックしてみてください。

PHPUnit マニュアル

https://phpunit.readthedocs.io/ja/latest/index.html

PHPUnit_その2(実行手順)

福岡拠点の永嵜です。

前回に引き続き、PHPUnitを紹介します。
今回はPHPUnitの実行手順を紹介します。実行環境は前回 Composer を使用してインストールした環境で行います。

PHPUnitの実行


PHPUnitでは理解するべき3つの要素があります。

①テスト対象クラス
ユニットテストを行うテスト対象のクラスです。

②テストケースクラス
テストケースは原則としてテスト対象クラスに対して1つ作成します。テストケース は、PHPUnit\Framework\TestCase※1 を継承して作成します。一般的にテストするクラス名の末尾に「Test」という文字列を付与したものをテストケース名とします(ファイル名はテストケースクラス名.php)。

    • テストケースクラス名 : 「[テストするクラス名]Test」
    • ファイル名 : テストケースクラス名.php

※1:vendorフォルダー配下にあります。

③テストメソッド
テストケース内に記述するメソッドです。実際にテストをする単位となります。
テストメソッドの名称は「test」で始まる文字列にする必要があります。
※@testアノテーションを使用する場合は、「test」でなくてもよいです。

では実際にテストケースを作成し、実行してみましょう。

まず、開発用ディレクトリにテスト対象クラスを格納する src ディレクトリとテストケースクラスを格納する test ディレクトリを作成します。

■テスト対象作成

テスト対象となるクラスを用意します。

引き数で横、高さを受け取り三角形の面積を返すクラスです。

■テストケースとテストメソッド作成

テスト対象が完成したらテストケースとテストメソッドを作成します。
test ディレクトリに AreaCalcTest.php ファイルを作成し、次のように記入します。

このテストケースでは、$width(横)と $height(高さ)で計算した面積が正しいかをテストしています。テストメソッドではアサーションと呼ばれる結果判定メソッドを使用します。今回の例ではassertEqualsがアサーションメソッドになります。
ちなみにassertEqualsは2 つの引数が等しくない場合エラーとするメソッドです。
$expectedに想定値、$actualに実測値を設定しassertEqualsで判定しています。

図1

図1のように開発用ディレクトリ(Sample)内にテスト対象(AreaCalc)とテストケース(AreaCalcTest)を配置しています。

■実行

phpunit コマンドを実行してユニットテストを行います。
phpunitはPHPUnitをインストールしたディレクトリのvendor\binフォルダ配下にシンボリックリンクがあります。

全てのテストケースの実行、特定のテストケースだけ実行どちらもできます。
今回はテストケースが1つですが①の方法で実行します。

①テストケースを全て実行する場合
・vendor\bin\phpunit  テストケース保存フォルダ
⇒例:vendor\bin\phpunit  test\

②テストケースを指定して実行する場合
・vendor\bin\phpunit  テストケース指定
⇒例:vendor\bin\phpunit  test\AreaCalcTest

※上記方法以外にもコマンドオプションで制御する方法があります。詳しくは PHPUnitマニュアルをご確認ください。

コマンドプロンプトを開き次のように入力します。
test ディレクトリ内のファイルをテストケースとしてテストが実行されます。

■テスト結果

テストが実行されるとテスト結果ステータス(4行目)が表示されます。
AreaCalcは正しい結果を返す状態なので( $width = 4、 $height = 2を引数で与えると4が返ってくる)テスト成功.(ドット)となっています。

他のステータス表示は以下のようになります。

ステータス 意味
.(ドット) テスト成功
F テスト失敗
E テストが危険としてマーク
S テストをスキップした
I テストが未実装

以上がPHPUnitによる一連のテスト手順となります。

次回は今回実行したサンプルプログラムに手を加え、
データプロバイダ機能について説明したいと思います。

PHPUnit_その1(インストール)

福岡拠点の永嵜です。

PHPUnitを使用する機会があったのでPHPUnitの使い方を紹介します。

本ブログでは下記の流れで説明していきます。
・PHPUnitの概要
・PHPUnit のインストール
・PHPUnitの実行

PHPUnitの概要


■PHPUnit
PHPで実装されたプログラムのユニットテスト(単体テスト)※1を自動化するためのテスティングフレームワークです。

※1:ユニットテスト
ユニットテストとはクラスや関数などプログラムを構成する小さな単位(ユニット)で個々の動作を確認するためのテストです。

PHPUnit のインストール


■PHPUnit のインストール
PHPUnitを使用するためにPHPUnitのインストールを行います。
インストールは下記方法があります。
・公式サイトから直接ダウンロードする。
・Composer を利用する

今回はComposerを利用した手順でインストールを行います。

①開発用ディレクトリに composer.json を設置し、次のように記入します。

②コマンドプロンプトで下記コマンドを実施します。

③インストール結果を確認します。
・開発用ディレクトリにcomposer.lock ファイルと vendor ディレクトリが生成されます。
・下記コマンドを開発用ディレクトリにで実行しPHPUnitが実行できることを確認します。
実行ができたらインストールしたPHPUnitのバージョンが表示されます。

以上がPHPUnitのインストール手順となります。

次回はPHPUnitを実行する手順について説明したいと思います。