web-dev-qa-db-ja.com

PHPUnit Strictモードは何をしますか?

「PHPUnitの厳密モード」とは何か疑問に思っていますか?

例えば:

phpunit --strict

またはphpunit.xmlで

<phpunit strict="true"/>

私はそれを試すためだけにそれをオンにしました、そして私のテストはで失敗し始めました

PHP_Invoker_TimeoutException: Execution aborted after 1 second
36
Mike Graf

短い答え:長時間実行されるテストの場合、アノテーションを使用して許可される実行時間を増やします。

@large // 10 seconds
@medium // 5 seconds
@small // 1 second max <-- Default, so no point using

長い答え:

これは、@ Crozinの助けを借りて得られた更新された情報のセットです。

私の場合、エラーはテストに時間がかかりすぎた(> 1秒)ことでした(DoctrineORMスキーマのドロップ+作成は処理を遅くする可能性があります 私が行っていたことについてはこの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の問題#49 クラスレベルとメソッドレベルの両方を提供する際の問題を示唆しているため、それらを混在させるとYMMVになります。 crozinが言ったように、割り当てられたタイムアウトはそれぞれ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
タイムアウトを使用して呼び出し可能オブジェクトを呼び出すためのユーティリティクラス。このパッケージは、strictモードでテストタイムアウトを強制するために必要です。 [ PHPUnitのインストール手順 ]

何もアサートしない厳密モードテストは、不完全なテストとしてマークされます。不完全な(またはスキップされた)テストでは、コードカバレッジは得られません Sebastian Bergmannによるスライドシェア(スライド10)

注意
PHPUnitは、テストの実行中に出力されるすべての出力を飲み込むことに注意してください。 strictモードでは、出力を出力するテストは失敗します。 PHPUnitマニュアルの出力セクションのテスト

21
Mike Graf

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

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

  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モードも使用していません。

34
Crozin