0
1

More than 1 year has passed since last update.

Setup Unit Test with PHP Laravel in windows

Last updated at Posted at 2023-07-19

Outline

前回、Laravel + MariaDB + IIS といろんな環境を構築して、phpunitを使う環境のドキュメントを作成した。
今回はシンプルに、phpunitを学習するための最低限の環境を構築、かつサンプルコードで1つ書いてみるところまでをドキュメントとして残す

PHP

install PHP

php windows versionのzipをダウンロードする。
今回、Non Thread Safe versionを使う。

Thread Safeに関する記事は、以下参照。使用環境によって異なる。

zipをdownload後、解凍し任意の場所に配置する。
今回、一般的に使われる、c:\phpに配置した。
image.png

その後、phpのpathを設定する。
今回、 path = c:\php を追加した。

image.png

その後、任意のpathでphpコマンドを実行する

php -i

setup php.ini

phpの設定ファイルを用意する。
defaultでは、2つのiniがtemplateとして用意されている

  • php.ini-development (開発環境用 - debug mode出力などが有効になっている)
  • php.ini-production (本番環境用)

今回、development用を使うため、php.ini-developmentをcopyしてphp.iniとして配置する。

image.png

install xdebug

xdebugは、unittest coverageを出力してくれるextensionである。

このサイトに準じてすすめると、以下のようにphp.iniの設定方法まで表示されるため、それに従いxdebugを有効にする。

image.png

install Composer

Composerとは、PHPと必要なライブラリの依存関係を管理する標準形式を提供するアプリケーションレベルのパッケージ管理システム
Laravelをinstallするときに使う
インストーラーをdownloadして、基本的にデフォルトでインストールを行えばよい

尚、install中に以下のように警告が出るときがある。
その時は、php extensionの設定が足らないため、都度php.iniを修正する必要がある。

image.png

install後、command promptを立ち上げて、composerを起動する

composer

image.png

install Laravel

composerを使用して、laravelをinstallする

composer global require "laravel/installer"

その後、laravelコマンドが有効か試す

laravel

image.png

install phpunit

unit testである、phpunitをinstallする

composer require --dev phpunit/php-code-coverage

Laravel Project

create Laravel Project

Laravel project を新規作成する

laravel new ut_sample

image.png

実行後、以下のようにlaravel projectのtemplateが作成される

image.png

update composer.json

unit-test coverageの結果をhtmlで出力できるようにする。
そのため、作成したprojectのcomposer.jsonのscriptsの中で以下を追加する

        "test:coverage-html": [
            "@putenv XDEBUG_MODE=coverage",
            "./vendor/bin/phpunit --color=always --coverage-html=\"storage/logs/code-coverage\""
        ]

image.png

設定後、対象project配下で以下のコマンドを実行する

composer test:coverage-html

image.png

その後、storage/logs/code-coverage にcoverageのhtmlが作成される。

image.png

feature / unit test

laravelのfeature testと unit testは以下folderで作成する。

image.png

project配下で以下コマンドを実行することで、2つのtypeのtestを行う。

php artisan test

image.png

実際に簡単なclassのunit testを書いてみる

app以下に、SampleUser.phpを作成する。
このclassはpasswordで以下条件を満たすかをしらべるmethodを持つ。

  • Password length is 8 ~ 16
  • Available word is alphabet & number
  • 1 capital letter , 1 small letter , 1 number should be included

SampleUser.php

<?php

namespace App;

class SampleUser
{
	protected $password;
	// ** setter **/
	public function setPassword($pwd)
	{
		$this->password = $pwd;
	}

    /** validate password **/
    public function validatePassword()
    {
    	$result = true;
    	
    	// validate length
    	$length = mb_strlen($this->password);
    	if ($length < 8 || $length > 16) {
    		$result = false;
    	}

    	// character accept a-z,A-Z,0-9
    	if (preg_match("/[^a-zA-Z0-9]/",$this->password) == true) {
    		$result = false;
    	}
    	if (preg_match("/[a-z]/",$this->password) == false) {
    		$result = false;
    	}
    	if (preg_match("/[A-Z]/",$this->password) == false) {
    		$result = false;
    	}
    	if (preg_match("/[0-9]/",$this->password) == false) {
    		$result = false;
    	}


    	return $result;
    }


}

次に、unit test codeを作成する
tests\Unit 配下に作成する。
まず、長さのtest codeを一つ書いてみる

UserTest.php

<?php

namespace Tests\Unit;

use Tests\TestCase;
use App\SampleUser;

class UserTest extends TestCase
{

    /** @test password length **/
    public function return_validate_password_lenght(){

        $user = new SampleUser();
        
        // length 7 : false
        $user->setPassword('1234567');

        $result = $user->validatePassword();
        $this->assertFalse( $result);
        
    }

}

そのうえで、テストを実行する

php artisan test

image.png

このように、1 test codeが正しく通ることを確認。

次にcoverageを確認する

composer test:coverage-html

htmlを開いてみると、今回の対象Class SampleUser.php のcoverageが50%を満たしていることがわかる。

image.png

今度は、100%になるように、最低限のtest codeを作成する

<?php

namespace Tests\Unit;

use Tests\TestCase;
use App\SampleUser;

class UserTest extends TestCase
{

    /** @test password length **/
    public function return_validate_password_lenght(){

        $user = new SampleUser();
        
        // length 7 : false
        $user->setPassword('1234567');

        $result = $user->validatePassword();
        $this->assertFalse( $result);

    }
    
    /** @test password charactor **/
    public function return_validate_password_charactor(){

        $user = new SampleUser();
        

        // charactor
        $user->setPassword('aA');

        $result = $user->validatePassword();
        $this->assertFalse( $result);

        // non allow  charactor 
        $user->setPassword('@');

        $result = $user->validatePassword();
        $this->assertFalse( $result);

    }

}

このテストコードによる結果、100% coverageを見たいしていることが確認できる。
ただ、これは phpunit が C0 coverage のため、上記テストコードで満たしてしまう。

image.png

0
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
0
1