36

「PHPUnitの厳密モード」とは何ですか?

例えば:

phpunit --strict

またはphpunit.xmlで

<phpunit strict="true"/>

試してみるためだけにオンにしましたが、テストが失敗し始めました

PHP_Invoker_TimeoutException: Execution aborted after 1 second
4

2 に答える 2

34

PHPUnit は、テストの実行中に発行されるすべての出力を飲み込むことに注意してください。厳密モードでは、出力を発行するテストは失敗します。

ドキュメントで見つけることができたのはこれだけですが、ソースも確認したところ、厳密モードで次のことがわかりました。

  1. アサーションのないテストは、不完全/失敗としてマークされる場合があります。
  2. 各テストは、サイズとpcntl 拡張機能およびPHP_Invoker ライブラリの存在に応じて、実行時間制限付きで実行される場合があります。3 つのタイムアウト値があります。

    • timeoutForSmallTests(デフォルト値: 1)
    • timeoutForMediumTests(デフォルト値: 10)
    • timeoutForLargeTests(デフォルト値: 60)

    テスト サイズ (小、中、大) は、次のPHPUnit_Util_Test::getSize()方法で決定されます。

    • PHPUnit_Extensions_Database_TestCaseまたはから派生したテスト ケースPHPUnit_Extensions_SeleniumTestCaseが大きい。
    • テスト ケースと個々のテストは、それぞれ「大」または「中」グループに追加することで、大または中にすることもできます。
    • それ以外の場合、テストは小規模です。

厳密モードは上記の 3 つの変更のみを行うようですが、それについては完全にはわかりません。PHPUnit のソースを調べたことも、strict モードを使用したこともありません。

于 2012-05-09T17:13:52.040 に答える
21

簡単な答え: 長時間実行されるテストの場合、注釈を使用して許可される実行時間を増やします。

@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 マニュアルのテスト出力セクション

于 2012-05-10T14:09:05.517 に答える