end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

phpunit による php の 自動単体テスト( unittet )練習

タイトルの通りです。 phpunit による自動単体テストは触ったことがありませんでしたので。

phpunit の install

と言っても、phpunit.phar をダウンロードするだけです。

$ cd /home/end0tknr/prj01/hon/cgi-bin2/test
$ wget https://phar.phpunit.de/phpunit-8.5.9.phar
$ chmod 755 phpunit-8.5.9.phar
$ phpunit-8.5.9.phar --version
PHPUnit 8.5.9 by Sebastian Bergmann and contributors.

xdebug の install

今回は、code coverage を計測しますので、xdebug も installします。

$ sudo yum install php72-php-xdebug

## 以下の2行を追加。
$ sudo vi /etc/php.ini
zend_extension=/opt/remi/php72/root/usr/lib64/php/modules/xdebug.so
xdebug.mode=coverage

testファイルの準備 - TestHelmForm4Sendmail.php

以下の通り

<?php
use PHPUnit\Framework\TestCase;

require_once 'lib/HelmForm4Sendmail.php';

// ※ TEST対象CLASSにある public methodに対してテストします
// ※ assert~() の fail 時にテストを停止したくないが
//    実現方法不明。python のsubTest()のようなものが欲しい

class StackTest extends TestCase {
    protected $obj;
    protected $assign_forms = [];

    protected function setUp(): void {
        // refer to https://www.php.net/manual/ja/function.assert-options.php
        ini_set("assert.warning",1);
        ini_set("assert.bail",   0);
        
        $this->obj = new HelmForm4Sendmail();

        $this->assign_forms = $this->obj->assign_forms_def();
    }

    private function rand_assign_form_def() {
        $i = rand(0,count($this->assign_forms) -1);
        return $this->assign_forms[$i];
    }

    public function test_validate_mailtos_str() {
        $func_name = __CLASS__." ".__FUNCTION__;
        $test_cases = [
            ["test1@example.com,test2@example.com",
             ["test1@example.com","test2@example.com"]],
            ["test1@example.com",      ["test1@example.com"]],
            ["test1,test2@example.com", ["test2@example.com"]]];
        
        foreach ($test_cases as $test_case ) {
            $result_valid = $this->obj->validate_mailtos_str($test_case[0]);
            
            $tmp_msg = $func_name." ".$test_case[0];
            $this->assertEquals($result_valid,$test_case[1],$tmp_msg);
        }

        

    }
    
    public function test_is_valid_address() {
        $func_name = __CLASS__." ".__FUNCTION__;
        $test_cases = [["test",            false],
                       ["test@example.com",true ]];
        foreach ($test_cases as $test_case ) {
            $result_valid = $this->obj->is_valid_address($test_case[0]);
            
            $tmp_msg = $func_name." ".$test_case[0] ." ".$test_case[1];
            $this->assertEquals($result_valid,$test_case[1],$tmp_msg);
        }
    }

    
    public function test_mail_info_defs() {
        $func_name = __CLASS__." ".__FUNCTION__;

        $mail_rule_keys = [
            "rule_name","formid","subject",
            "fromname","fromaddress","target_to","system_to"];
        $mail_rules = $this->obj->mail_info_defs();

        foreach ($mail_rules as $mail_rule ) {
            foreach ($mail_rule_keys as $mail_rule_key ) {
                $rule_val = $mail_rule[$mail_rule_key];
                $tmp_msg = "$func_name $mail_rule_name $mail_rule_key = '$rule_val'";
                $this->assertGreaterThanOrEqual(0, count($rule_val), $tmp_msg);
            }
        }
    }

    
    public function test_mail_info_def() {
        $func_name = __CLASS__." ".__FUNCTION__;

        $mail_rule_keys = [
            "rule_name","formid","subject",
            "fromname","fromaddress","target_to","system_to"];

        foreach ($this->assign_forms as $assign_form_def ) {
            $mail_rule_name = $assign_form_def["notify_mail"];
            $mail_rule = $this->obj->mail_info_def($mail_rule_name);
            
            foreach ($mail_rule_keys as $mail_rule_key ) {
                $rule_val = $mail_rule[$mail_rule_key];
                $tmp_msg = "$func_name $mail_rule_name $mail_rule_key = '$rule_val'";
                $this->assertGreaterThanOrEqual(0, count($rule_val), $tmp_msg);
            }
        }
    }
}

phpunit の実行

以上で、準備完了ですので、以下のように実行 & 表示されます。

$ pwd
/home/end0tknr/prj01/hon/cgi-bin2

$ ./test/phpunit-8.5.9.phar --verbose \
     --coverage-text \
     --whitelist=/home/end0tknr/prj01/hon/cgi-bin2/lib \
     ./test/TestHelmForm4Sendmail.php
PHPUnit 8.5.9 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.2.24 with Xdebug 3.0.3

....                                        4 / 4 (100%)
Time: 461 ms, Memory: 16.00 MB
OK (4 tests, 537 assertions)

Code Coverage Report:      
  2021-04-08 15:24:02      
 Summary:                  
  Classes:  0.00% (0/8)    
  Methods:  9.72% (7/72)   
  Lines:    8.74% (93/1064)

HelmForm
  Methods:  29.41% ( 5/17)   Lines:  35.47% ( 61/172)
HelmForm4Sendmail
  Methods:  22.22% ( 2/ 9)   Lines:  28.83% ( 32/111)