1

CakePHP には非常に単純なテストがありますが、モデルで $this->log() を使用するたびに、テストに合格していても、テストを実行すると CLI で非常に厄介な出力が得られます。これにより、実際のエラーが発生した場合のデバッグが非常に難しくなり、実際のエラーを見つけるためにログ出力をフィルターで除外する必要があります。

例:

//単体テスト

public function testTesting() {
    $this->Ad->testing();
    $this->assertTrue(true);
}

//テスト中のモデル メソッド

public function testing() {
    $this->log('sweet nothings');
}

CLI での出力: http://cl.ly/image/3R3a040c3S46

ご覧のとおり、テストはパスしましたが、詳細なログ出力が得られます。私が使用しているコマンドはcake test app Model/ModelName

CLI ランナーの出力をあまり冗長にしないにはどうすればよいですか。-q または --quiet を使用するとエラーが発生しますunrecognized option --quiet

どんな助けでも大歓迎です!:)

4

1 に答える 1

1

あなたの最小限のテストケースは、いくつかの側面を非常にうまく示しています。

  1. $this->assertTrue(true)何かを主張するためだけに使用しています。
  2. テストされた関数は、テストされていないログを記録します。
  3. テストの実行はログ出力で雑然としています。

最初に 3 番目の点に取り組みましょう。使用するロガーが何であれ、ログ メッセージをどこかに配置するように構成できる必要があります。現在のように、ロガーはメッセージをエコーするだけです。おそらく、ファイルにログインしたり、メールを送信したりすることもできます。または、何もしません。したがって、理論的には、テストのためだけに構成を適用することで、ログ出力を黙らせることができるはずです。

2 番目のポイント: ロガーの出力を黙らせると、ログが実際に正しく機能することを確認できなくなります。

ロギングには実際には複数の種類があります。そのうちの 1 つは開発者がエラーが発生した場合にアプリケーションをデバッグするのに役立ち、もう 1 つは非常に重要なアプリケーション トランザクションの監査証跡を残します。監査証跡のログ記録は、クラスの動作の重要な部分であり、テストする必要があります。一方、デバッグ支援は、それが起こらなくてもアプリケーションに害を及ぼさない単なるクラスへのアドオンです。

質問は次のとおりです。このロギングは、あなたのアプリケーションで何をしているのですか? それは単なるデバッグ支援ですか、それともアプリケーションの動作の重要な部分ですか?

重要な場合は、テストする必要があります。そして、そのテストは、ロガーのモック オブジェクトを注入しlog()、おそらく正しいパラメーターを使用して関数の呼び出しをアサートすることによって最もよく達成されます。

そして、テスト中にそのロガー モックを実際に挿入すると、そのモック用に構成されたアサーションがテストとして機能し、最初のポイントは実際には無効になります。この例では)、しかし内部オブジェクトの正しい呼び出し。

一方、重要な目的でロガーを使用していない場合は、モックしてテストする必要はありません。この場合、テストできるものが何もないため、コード例は不適切です。testing()その機能が本当にそこにある価値があるかどうか疑問に思うはずです。:)

ただし、実際の関数がロギング以外のことを行うと仮定すると、テストできるものがあるはずです。構成によってロガーをサイレンシングすることと合わせて、非常にクリーンなテスト出力が得られるはずです。

于 2013-09-13T19:44:36.703 に答える