はじめに
この記事は自分への戒めのために書きます。
結末は、**普段から出力されているWarningに慣れたらダメだよ。**です。
Warningであっても早期に解消するように心がけましょう。
学んだこと
- 個別のプロセスで起動したテストは、標準出力があると失敗することがある。
- Warningだからといって放置してはいけない。
環境
- PHP 7.2系
- CakePHP 3.5系
- PHPUnit 6.5系
何が起きた?
-
@runInSeparateProcess
をつけるとテストが失敗してしまう。。。
他の@runTestsInSeparateProcesses
や@runClassInSeparateProcess
でも同じ結果。。。 - コンソールに出力されるのは親プロセスの起動時にも出力されるものと全く同じWarning。。。
↓こんな感じの
PHP Warning: PHP Startup: ...
今思えばこれが原因ではないか?っと気づきそうではあるのですが、
- よく出力されるメッセージ
-
@runInSeparateProcess
を付ける前は、Warningが出ていても動いていた - アノテーションつけていないものは正常のテスト結果を返している
ので、これが原因であるとは全く考えませんでした😇
DockerやPHPUnitの設定が悪さをしているのか、それともWebサーバー...などだいぶ時間を使ってしまいました。。。
どうやって気づいたのか
ググってみても良い感じの記事を見つけ出すことができず、PHPUnitをデバッグしてみることにしました。
するとPHPUnitのprocessChildResult()
という関数で例外が発生していることがわかりました。
以下、processChildResult()
の一部です。
/**
* Processes the TestResult object from an isolated process.
*
* @param Test $test
* @param TestResult $result
* @param string $stdout
* @param string $stderr
*/
private function processChildResult(Test $test, TestResult $result, $stdout, $stderr)
{
$time = 0;
// $stderr(標準出力)があるとエラーとして扱われる
if (!empty($stderr)) {
$result->addError(
$test,
new Exception(\trim($stderr)), // ここで例外が発生している。コンソールに表示されるのはいつものWarning。
$time
);
} else {
// ... 省略 ...
}
$result->endTest($test, $time);
if (!empty($output)) {
print $output;
}
}
はい、ご覧いただいたように**標準出力($stderr)**があるとテスト結果は失敗し、私の場合は、普段から出力されていたWarningが原因でテストが失敗となっていたことがわかりました。
(テストの失敗後、コンソールに出力されるのは$stderrだけなのでちょっとわかりづらいなぁっと思いました。もちろん悪いのは私です!)
まとめ
普段から出力されているWarningは、やはり何らかの悪影響を引き起こすことを身をもって体験できました。そして反省しました。
Warningだからと放置せず、すぐに対応する。慣れないことが大切ですね。
この記事が同じような事象に出くわした方の助けになれば幸いです🙏