4

テストの一環として、EventFilter と TestEventListener を使用してログ メッセージをリッスンしています。ただし、これを行うと、コマンド プロンプトに大量のエラーが発生し、テストの実行が非常に難しくなります。

サンプルコード:

it("should send a welcome message to the user", SystemFortressTest) {
  val stub = new SubFortressBuildingPermitRefTraitImplStub
  EventFilter.debug(message = "SystemFortressExchange: Received Message: SystemOutput(List(JITMP Booted))", occurrences = 1) intercept {
      stub.buildASubFortress(SystemFortressBlueprintRef)
  }
}

このコードは機能しますが、TestEventListener はデフォルトで STDOUT に出力されるため、デバッグ レベルのデータがあふれます (デフォルトのロガーをサブクラス化するため、STDOUT のみのログ記録となります)。

Akka の上にある独自のロギング抽象化を展開し、Akka のものに到達する前にそこからのメッセージをフィルター処理できます。コマンド プロンプトが汚染されることはありません。同様のソリューションがすでに利用可能です。

問題は、SL4J ロガーを使用すると、EventFilter が機能しないことです。

4

3 に答える 3

4

私がすることは:

akka.loglevel = DEBUG
akka.loggers = ["akka.event.slf4j.Slf4jLogger", "akka.testkit.TestEventListener"]

..そして私のテストでは:

system.eventStream.publish(Mute(EventFilter.info()))
system.eventStream.publish(Mute(EventFilter.debug()))

こちらです:

  • エラーと警告が 2 回報告されます (ただし、いずれにせよ修正する必要があります :) )
  • デバッグおよび情報メッセージは、slf4j を介してのみ報告されます
  • イベントフィルターを使用して特定のメッセージを確認することもできます (おそらく、最初にミュートを解除した後)。

ただし、通常、ログメッセージのテストはコードの匂いだと考えていることに注意してください。通常は、より「観察可能な」動作をチェックする方がよいでしょう。おそらく、イベントをイベントストリームに発行します。

于 2014-07-30T11:16:16.720 に答える
0

他のロガーと同様に、ログ レベルを構成するか、ロガーを完全にオフにすることができます。

akka.loggers=["akka.testkit.TestEventListener"]
akka.loglevel = OFF

お役に立てれば

于 2013-11-10T12:52:32.357 に答える
0

TestEventListener解決策は、メソッドを拡張してメソッドをオーバーライドする新しいリスナー クラスを作成し、print何もしないか、stdout に直接出力する代わりに、好みのログ ソリューションを使用してログを記録することです。application.conf次に、オプションの下で、カスタム イベント リスナーをロガーとして指定できますakka.loggers。(詳細はhttps://doc.akka.io/docs/akka/2.5/scala/testing.htmlを参照)

したがって、イベントリスナーは次のようになります。

package mypackage
import akka.testkit.TestEventListener

class SilentTestEventListener extends TestEventListener {
  override def print(event: Any): Unit = ()
}

そして、次を に追加しますapplication.conf

akka {
  loggers = [mypackage.SilentTestEventListener]
}

ログ レベルを変更してログ記録を無効にするか、イベント フィルターを使用してノイズの多いログをフィルター処理する場合、テストでそれらのログをリッスンすることもできません。これは、イベント フィルターでも行われるためです。ログメッセージを除外する最初のフィルタが見つかるまで、ログに対してのみフィルタを実行します。テストで使用されたフィルターの前に別のそのようなフィルターが見つかった場合、テストはログ エントリについて通知されません。

別のより良い解決策は、の動作を継承して変更する代わりに、ログを処理する独自の方法を定義するイベント リスナーを実装することです (のサブクラスがstdout にログを記録するStdOutLoggerことが期待されるため...)。StdOutLoggerの機能を複製する必要があるため、上記のハッキーなソリューションよりも労力がかかりますTestEventListener

于 2017-10-13T13:48:24.073 に答える