web-dev-qa-db-ja.com

PHPUnit-何もせず、エラーも出力もしません

別の「phpunitが機能しません」という質問で申し訳ありません。以前は何年も機能していました。今日、私はPEARとphpunitをこの問題に関係のない理由で再インストールしました。

誰もがこの問題に遭遇したか、何が原因だったのか考えていますか。

PHPUnit Version: 3.5.15 
PEAR Version: 1.9.4 
PHP Version: 5.3.8 
Windows 7
42
markus

bootstrap.phpまたはphpunit.xmlなしでできる最も単純なテストクラスを作成して、最初に新しいインストールが機能することを確認します。 PHPUnitは、テストを実行する前に、すべてのテストケース(各テストメソッドとデータプロバイダーに対して1つ)をインスタンス化できない場合、メッセージなしで停止します。

22
David Harkness

OSXとMAMPを使用しています。エラーメッセージを取得するには、php.iniの次のエントリを調整する必要がありました。

display_errors = On
display_startup_errors = On

これは/Applications/MAMP/bin/php/php5.3.6/conf/php.iniに入る必要があることに注意してください。

53
BetaRide

将来の参考のために、PHPUnitの問題に直面していて、PHPUnitがサイレントに失敗する場合は、phpunit.xml内に次の3行を追加してください。

<phpunit ....... >
    ...
    ...
    <php>
         <ini name="display_errors" value="true"/>
    </php>
</phpunit>

その後、テストを再度実行すると、PHPUnitが失敗する理由がわかります。

そして...ユニットテストをお楽しみください:)

41
Ahmad Hajjar

元のポスターの質問はすでに回答されていますが、将来検索する人のためだけに:PHPUnitがサイレントに失敗する原因の1つ(つまり、理由を言わずにテストの実行を停止する)は、それがエラーハンドラを持っていることです各テスト実行の前に設定します。これは、エラーをキャプチャし、テスト実行の最後にエラーを表示することを目的としています。問題は、特定のエラーがテスト実行全体の実行を停止することです。

これが発生したときに私が通常行うことは、最初のステップとして、エラーハンドラーをエラーメッセージをすぐに出力するものにリセットすることです。基本テストクラスには、setVerboseErrorHandlerというメソッドがあります。このメソッドは、テストが発生したときにテストの先頭(またはsetUp)で呼び出します。以下ではphp 5.3以上が必要です(閉鎖のため)。したがって、5.2以下を使用している場合は、通常の機能にすることができます。

protected function setVerboseErrorHandler() 
{
    $handler = function($errorNumber, $errorString, $errorFile, $errorLine) {
        echo "
ERROR INFO
Message: $errorString
File: $errorFile
Line: $errorLine
";
    };
    set_error_handler($handler);        
}
27
Isaac

あなたはすでにそれを機能させる方法を理解していますが、私の解決策は少し異なっていました。

最初にできることは、終了ステータスを確認することです。 0でない場合、PHPが終了し、INI構成設定が設定されているため、PHPエラーメッセージは出力されませんでした。私がしたことは、「display_errors」INI設定を有効にし、「error_reporting」をE_ALLに設定することでした。それから、特定のスクリプトを解析できないPHPなどのエラーを特定することができました。修正したら、PHPUnitは正常に実行されました。

6
Kevin Herrera

特定のまれな条件でnothingを出力するカスタムの「致命的なエラーハンドラ」を使用して、隅にすっかりペイントできました。マーフィーの法則に従って、これらの条件は、ハンドラーが設置されていることを忘れると実現しました。

それは実際には「PHPunitの問題」ではなかったため、症状は同じでしたが、他の回答はどれも役に立ちませんでした(@Davidの問題は同じ問題でしたが)。ログと手掛かりなし。

最終的に、これをbootstrap=コードに追加して、テストスイート全体の段階的なトレースに頼らなければなりませんでした。

register_shutdown_function(function() {
    foreach ($GLOBALS['lastStack'] as $i => $frame) {
        print "{$i}. {$frame['file']} +{$frame['line']} in function {$frame['function']}\n";
    }
});
register_tick_function(function() {
    $GLOBALS['lastStack'] = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8);
});
declare(ticks=1);

誰かがこれよりもうまくいかず、どういうわけかstdoutもブロックする場合、この変更は機能するはずです:

register_shutdown_function(function() {
    $fp = fopen("/tmp/path-to-debugfile.txt", "w");
    foreach ($GLOBALS['lastStack'] as $i => $frame) {
        fwrite($fp, "{$i}. {$frame['file']} +{$frame['line']} in function {$frame['function']}\n");
    }
    fclose($fp);
});
5
LSerni

これは古いスレッドですが、同じ問題が発生したときに偶然見つけました。

同じ問題が発生しました。print、print_r、echoなど、コンソールに何も返されませんでした。

--stderrtest-runner オプションとして使用して解決しました。

4
DevDonkey

コードが停止するだけで、出力なしのロジックを記述していないことを確認してください。例えば、

<?php

if (!array_key_exists('SERVER_NAME', $_SERVER)) {
    die();
}

これはまさに私の場合でした。 Apacheを介してコードを実行する場合は正しい環境についていくつかの仮定を立てましたが、CLIから実行する場合は満たされず、コードは出力をエコーし​​ませんでした。

PHPUnitは、通常のinit出力を行う前にbootstrapファイルを含めようとしましたが、ブートストラップ処理中に死亡したため、ステータス0で終了し、出力はありません。

4
anroots

コマンドラインから実行するときに、このようなphpunitの最新バージョン

> php phpunit
or
> ./phpunit
or
> php ./phpunit.phar
or
> ./phpunit.phar

そして、メッセージを表示せずに即座にプロンプ​​トに戻ります。これは、おそらく「スホシンセキュリティ」設定によるものです。 phpunitは、すべてのライブラリを含む「phar」パッケージになりました。 phpでsuhosinセキュリティモジュールが有効になっているときにこのようなファイルを実行できるようにするには、まずこれを設定する必要があります

suhosin.executor.include.whitelist = phar

php.iniファイルに移動します(たとえば、debian/ubuntuの場合、/ etc/php5/conf.d/suhosin.iniファイルを編集する必要がある場合があります

3
eldy

ここですべて試してみましたが、phpunit --no-configuration simpletest.phpを試すまで何も機能しませんでした。最終的にいくつかの出力が得られました。これは、phpunit.xml.distファイルが壊れていることを意味します。 (デバッグしたら戻って更新します。)

simpletest.phpの内容は以下のとおりですが、テストファイルはすべて機能するはずです。

<?php
use PHPUnit\Framework\TestCase;

final class FooTest extends TestCase
{
    public function testFoo()
    {
        $this->assertEquals('x', 'y');
    }
}
2
ryan

私にとっては、競合はXdebugのディレクティブにありました

xdebug.remote_enable=1
1
Yeke

実行しているphpunitとインストールしたphpunitが同じかどうかを確認します。

$ pear list phpunit/phpunit
...
script /path/to/phpunit
...

そのphpunitを完全なパスで正確に実行してみてください。

次に、PATH変数をチェックして、正しいディレクトリがその中にあるかどうかを確認します。そうでない場合は、修正します。


それでも解決しない場合は、phpunit実行可能ファイルに何かを書き込みます。 「エコー123;」 phpunitを実行します。表示されるかどうか確認してください。

1
cweiske