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を実行する手順について説明したいと思います。

PHP7の新規機能その2

福岡拠点の永嵜です。

前回に引き続き、PHP7.0以降に追加された機能を紹介します。

1.define() を用いた配列定数の定義
define() で配列の定数を定義できるようになりました。

サンプルプログラム
echoでANIMALSの要素1を出力しています。

 

2.use 宣言のグループ化
複数のクラスや関数そして定数を同じ namespace からインポートする際に、
単一の use 文にまとめられるようになりました。

サンプルプログラム

 

3.例外処理における複数の例外の catch
ひとつの catch ブロックで複数の例外を扱えるようになりました。
パイプ文字 (|) を使って指定します。
異なる例外を同じように処理したい場合に有用です。

サンプルプログラム

 

4.list() におけるキーのサポート
list() (あるいはその短縮版である [] 構文) の内部でキーを
指定できるようになりました。
list()及び[]で変数の中身を受け取る時もキーを指定した書き方が
出来るようになりました。

サンプルプログラム

実行結果

 

5.最後に
PHP7.0以降に多くの機能が機能が追加されています。
今回紹介した機能以外にも便利な機能が追加されていますので
詳細を知りたい方は下記をチェックしてみてください。

PHP マニュアル
http://php.net/manual/ja/migration70.new-features.php
http://php.net/manual/ja/migration71.new-features.php
http://php.net/manual/ja/migration72.new-features.php

PHP7の新規機能その1

福岡拠点の永嵜です。

現時点(2019/2/25)でのPHPの最新バージョンは7.3です。
PHP7.0リリースの際にパフォーマンスの向上や多くの新機能が追加されていますが、私自身があまり新機能を使えていなかったので新機能について調べました。
このブログでPHP7.0以降に追加された機能をいくつか紹介したいと思います。

1.引数/戻り値の型宣言
関数の引数/戻り値に明示的に型を指定することができるようになりました。
型を指定することで不正な値が渡されるのが防げます。
通常、Nullは許容されませんが型の前にクエスチョンマークをつけるとNullを許容でき指定した型だけでなく Nullも引数/戻り値として使用できるようになります。

サンプルプログラム
引き数 $a、$b、戻り値にint型指定を指定しています。

実行結果
宣言した型以外(キャスト出来る場合OK)が引数で指定されるとTypeErrorの例外がスローされます。

注意点
引数/戻り値が指定した型にキャストできる場合は、自動的にキャスト変換されて
正常終了します。厳密に型チェックを行いたい場合は、declare(strict_types=1)命令を使用する必要があります。

※PHP5でも型宣言(タイプフィンディング)は使用できましたが、
以下の制約がありました。
・戻り値では型宣言ができない。
・引数で型を宣言できるのは配列/オブジェクトのみ
(int/floatのような型宣言はできない)

指定可能な型は以下の通りです。

型名

概要

使用可能バージョン

bool 真偽値 7.0.0
float 浮動小数点数 7.0.0
int 整数 7.0.0
string 文字列 7.0.0
array 配列 5.1.0
callable コールバック関数 5.4.0
クラス名 指定したクラス 5.0.0
インターフェイス名 指定したインターフェイス 5.0.0
self そのメソッドが定義されている
クラスと同じクラスのインスタンス
5.0.0
void 戻り値が特に無いことを指定

7.1.0

2.Null合体演算子
式1 ?? 式2
式1がNullでない場合には式1をそうでない場合は式2を返します。

サンプルプログラム

実行結果
$message2はNullのため式2の値が表示されています。

 

3.宇宙船演算子
2つの式を比較するための演算子です。
左辺<=>右辺
左辺が大きい:戻り値「1」
右辺が大きい:戻り値「-1」
両辺が等しい:戻り値「0」

サンプルプログラム

実行結果

 

4.最後に
今回紹介しきれなかった機能を次回紹介します。