「PHPUnitの厳密モード」とは何ですか?
例えば:
phpunit --strict
またはphpunit.xmlで
<phpunit strict="true"/>
試してみるためだけにオンにしましたが、テストが失敗し始めました
PHP_Invoker_TimeoutException: Execution aborted after 1 second
「PHPUnitの厳密モード」とは何ですか?
例えば:
phpunit --strict
またはphpunit.xmlで
<phpunit strict="true"/>
試してみるためだけにオンにしましたが、テストが失敗し始めました
PHP_Invoker_TimeoutException: Execution aborted after 1 second
PHPUnit は、テストの実行中に発行されるすべての出力を飲み込むことに注意してください。厳密モードでは、出力を発行するテストは失敗します。
ドキュメントで見つけることができたのはこれだけですが、ソースも確認したところ、厳密モードで次のことがわかりました。
各テストは、サイズとpcntl 拡張機能およびPHP_Invoker ライブラリの存在に応じて、実行時間制限付きで実行される場合があります。3 つのタイムアウト値があります。
timeoutForSmallTests
(デフォルト値: 1)timeoutForMediumTests
(デフォルト値: 10)timeoutForLargeTests
(デフォルト値: 60)テスト サイズ (小、中、大) は、次のPHPUnit_Util_Test::getSize()
方法で決定されます。
PHPUnit_Extensions_Database_TestCase
またはから派生したテスト ケースPHPUnit_Extensions_SeleniumTestCase
が大きい。厳密モードは上記の 3 つの変更のみを行うようですが、それについては完全にはわかりません。PHPUnit のソースを調べたことも、strict モードを使用したこともありません。
簡単な答え: 長時間実行されるテストの場合、注釈を使用して許可される実行時間を増やします。
@large // 10 seconds
@medium // 5 seconds
@small // 1 second max <-- Default, so no point using
長い答え:
これは、@Crozin の助けを借りて得られた一連の更新された情報です。
私の場合、エラーはテストに時間がかかりすぎた (>1 秒) というものでした (Doctrine ORM スキーマの削除 + 作成により処理が遅くなる可能性があります。私が行っていたことについては、この ZendCast を参照してください)。これにより、PHP_Invoker からの問題 (および一部の出力) が発生していました。厳密モードでは、出力は許可されません。
/usr/share/php/pear/share/pear/PHPUnit/Util/Test.php::getSize() (および同じクラスの getGroups()) を読む/リバース エンジニアリングすることで、文書化されていない 3 つの注釈があることがわかりました。使用できます:
@large // 10 seconds
@medium // 5 seconds
@small // 1 second max run time
これらは、クラス レベルまたはメソッド レベルで指定できます。 PHPUnit github の問題 #490 は、クラス レベルとメソッド レベルの両方を提供する際の問題を示唆しているため、それらを混在させると YMMV になります。クロジンが言ったように、割り当てられたタイムアウトはそれぞれ 10,5,1 秒です。
別の解決策は、呼び出された関数の実行を許可する時間を長くすることでした (私の遅いコンピューターで)。
sudo vi /usr/share/php/pear/share/pear/PHP/Invoker.php
Increase line 1 "declare(ticks = 1);" to
"declare(ticks = 10);" // or any higher int that meets your needs
これは、解決策を見つけるのに役立つ厳密モードに関する一連の情報です。
PHP_Invoker
タイムアウトを指定して callable を呼び出すためのユーティリティ クラス。このパッケージは、strict モードでテスト タイムアウトを強制するために必要です。[ PHPUnit インストール手順]Strict モード 何もアサートしないテストは不完全としてマークされる 不完全な (またはスキップされた) テストはコード カバレッジをもたらさないSebastian Bergmann による Slideshare (スライド 10)
注
PHPUnit は、テストの実行中に発行されるすべての出力を飲み込むことに注意してください。厳密モードでは、出力を発行するテストは失敗します。PHPUnit マニュアルのテスト出力セクション