Symfoware

Symfowareについての考察blog

PHP assertで関数のテスト、assert_optionsでテストを無効にする

こちらで簡単な2つの関数を作りました。
PHP 文字列の最初の1文字が特定の文字であるか判定する(startsWith)

両方、正しく動作するかチェックしたいと思います。



assert



http://php.net/manual/ja/function.assert.php

文字列をプログラムとして評価することもできるようですが、
簡単なのは単純に結果がtrueとなる値を渡すことでしょうか。


  1. <?php
  2. function t1($s) {
  3.     return preg_match('/^\./', $s);
  4. }
  5. function t2($s) {
  6.     return (substr($s, 0, 1) === '.');
  7. }
  8. $s1 = '.abc';
  9. assert( t1($s1));
  10. assert( t2($s1));
  11. $s2 = 'abc';
  12. assert( !t1($s2) );
  13. assert( !t2($s2) );
  14. $s3 = '';
  15. assert( !t1($s3) );
  16. assert( !t2($s3) );




失敗する(引数にfalseを渡してしまった)assertがある場合は、
こんな警告が表示されます。


$ php sample.php
PHP Warning: assert(): Assertion failed in /dev/php/sample.php on line 26







assert_options



assertを行いたくない場合は、assert_optionsで指定します。

http://php.net/manual/ja/function.assert-options.php


  1. <?php
  2. function t1($s) {
  3.     return preg_match('/^\./', $s);
  4. }
  5. function t2($s) {
  6.     return (substr($s, 0, 1) === '.');
  7. }
  8. // assertを無効化
  9. assert_options(ASSERT_ACTIVE, false);
  10. $s1 = '.abc';
  11. assert( t1($s1));
  12. assert( t2($s1));
  13. $s2 = 'abc';
  14. assert( !t1($s2) );
  15. assert( !t2($s2) );
  16. $s3 = '';
  17. assert( !t1($s3) );
  18. assert( t2($s3) );




最後に失敗するassertがありますが、警告は表示されなくなります。






文字列による評価式の指定



例えば、こんな感じで関数の実行に時間がかかるものを評価したいとします。


  1. <?php
  2. function heavy() {
  3.     sleep(3);
  4.     return false;
  5. }
  6. // assertを無効化
  7. assert_options(ASSERT_ACTIVE, false);
  8. $time_start = microtime(true);
  9. assert( heavy() );
  10. $time_end = microtime(true);
  11. $time = (int)(microtime(true) - $time_start);
  12. echo "{$time}秒" . PHP_EOL;




この記載方法だと、assert_optionsでassertを無効化しても
3秒待たされました。


  1. $ php sample.php
  2. 3




こういった場合、評価式を文字列で指定しておくと良いようです。
以下の記載方法でもちゃんとassertが行われます。


  1. <?php
  2. function heavy() {
  3.     sleep(3);
  4.     return false;
  5. }
  6. // assertを無効化
  7. assert_options(ASSERT_ACTIVE, false);
  8. $time_start = microtime(true);
  9. // 評価式を文字列で指定
  10. assert( 'heavy()' );
  11. $time_end = microtime(true);
  12. $time = (int)(microtime(true) - $time_start);
  13. echo "{$time}秒" . PHP_EOL;




assert_optionsでassertを無効にすれば、3秒待たされることなく、
スクリプトが終了するようになりました。


$ php sample.php
0秒



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/10/24(土) 23:44:50|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PHP 文字列操作関数まとめ (文字数のカウント、分割、結合等) | ホーム | PHP 文字列の最初の1文字が特定の文字であるか判定する(startsWith)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1813-bb2c3cbe
この記事にトラックバックする(FC2ブログユーザー)