タイトルの通りです。 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)