別の「phpunitが機能しません」という質問で申し訳ありません。以前は何年も機能していました。今日、私はPEARとphpunitをこの問題に関係のない理由で再インストールしました。
誰もがこの問題に遭遇したか、何が原因だったのか考えていますか。
PHPUnit Version: 3.5.15
PEAR Version: 1.9.4
PHP Version: 5.3.8
Windows 7
bootstrap.php
またはphpunit.xml
なしでできる最も単純なテストクラスを作成して、最初に新しいインストールが機能することを確認します。 PHPUnitは、テストを実行する前に、すべてのテストケース(各テストメソッドとデータプロバイダーに対して1つ)をインスタンス化できない場合、メッセージなしで停止します。
OSXとMAMPを使用しています。エラーメッセージを取得するには、php.ini
の次のエントリを調整する必要がありました。
display_errors = On
display_startup_errors = On
これは/Applications/MAMP/bin/php/php5.3.6/conf/php.ini
に入る必要があることに注意してください。
将来の参考のために、PHPUnitの問題に直面していて、PHPUnitがサイレントに失敗する場合は、phpunit.xml内に次の3行を追加してください。
<phpunit ....... >
...
...
<php>
<ini name="display_errors" value="true"/>
</php>
</phpunit>
その後、テストを再度実行すると、PHPUnitが失敗する理由がわかります。
そして...ユニットテストをお楽しみください:)
元のポスターの質問はすでに回答されていますが、将来検索する人のためだけに: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);
}
あなたはすでにそれを機能させる方法を理解していますが、私の解決策は少し異なっていました。
最初にできることは、終了ステータスを確認することです。 0でない場合、PHPが終了し、INI構成設定が設定されているため、PHPエラーメッセージは出力されませんでした。私がしたことは、「display_errors」INI設定を有効にし、「error_reporting」をE_ALL
に設定することでした。それから、特定のスクリプトを解析できないPHPなどのエラーを特定することができました。修正したら、PHPUnitは正常に実行されました。
特定のまれな条件で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);
});
これは古いスレッドですが、同じ問題が発生したときに偶然見つけました。
同じ問題が発生しました。print、print_r、echoなど、コンソールに何も返されませんでした。
--stderr
を test-runner オプションとして使用して解決しました。
コードが停止するだけで、出力なしのロジックを記述していないことを確認してください。例えば、
<?php
if (!array_key_exists('SERVER_NAME', $_SERVER)) {
die();
}
これはまさに私の場合でした。 Apacheを介してコードを実行する場合は正しい環境についていくつかの仮定を立てましたが、CLIから実行する場合は満たされず、コードは出力をエコーしませんでした。
PHPUnitは、通常のinit出力を行う前にbootstrapファイルを含めようとしましたが、ブートストラップ処理中に死亡したため、ステータス0で終了し、出力はありません。
コマンドラインから実行するときに、このような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ファイルを編集する必要がある場合があります
ここですべて試してみましたが、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');
}
}
私にとっては、競合はXdebugのディレクティブにありました
xdebug.remote_enable=1
実行しているphpunitとインストールしたphpunitが同じかどうかを確認します。
$ pear list phpunit/phpunit
...
script /path/to/phpunit
...
そのphpunitを完全なパスで正確に実行してみてください。
次に、PATH変数をチェックして、正しいディレクトリがその中にあるかどうかを確認します。そうでない場合は、修正します。
それでも解決しない場合は、phpunit実行可能ファイルに何かを書き込みます。 「エコー123;」 phpunitを実行します。表示されるかどうか確認してください。