Akka TestKitテストパッケージの使用

6438 ワード

Akka TestKitテストパッケージの使用


TestKit、テストクラスはいくつかのインタフェースを継承する必要があります.
class SendingActor01Test extends TestKit(ActorSystem("testsystem")) //TestKit testsystem 
  with WordSpecLike // must,in 
  with MustMatchers //must assertion, "hello" must (contain("hello"))
  with StopSystemAfterAll { // system
"A Silent Actor" must { // 
 "change state when it receives a message, single threaded" in { // in 
 //Write the test, first fail
 fail("not implemented yet")
 }
 "change state when it receives a message, multi-threaded" in {
 //Write the test, first fail
 fail("not implemented yet")
 }
 }
}

これらのインタフェースは、actor testsystem、testActorを初期化し、テストを終了し、クリーンアップを実現します.
テスト環境は次のとおりです.
シングルスレッドマルチスレッドマルチJVM

シングルスレッド


この環境では、TestActorRefを使用してsilentActor内部に直接アクセスできる簡単なテストが一般的です.
    // 
    "A Silent Actor" must {
      "change internal state when it receives a message, single" in {
        import SilentActorProtocol._ 
        //actor , TestActorRef silentActor 
        val silentActor = TestActorRef[SilentActor] 
        silentActor ! SilentMessage("whisper")
        // silentActor , 
        silentActor.underlyingActor.state must (contain("whisper")) 
      }
    }

TestActorRefとLocalActorRefは、スケジューラとしてテスト用のCallingThreadDispatcherのみを使用し、CallingThreadDispatcherは新しいスレッドでactorを呼び出さない

マルチスレッド環境


直接actorにアクセスできないため、testActorでactorのメッセージを取得するしかありません.たとえば、次のようにします.
    // , actor , testActor 
    "A Silent Actor" must {
      "change internal state when it receives a message, multi" in {
        import SilentActorProtocol._ 
        val silentActor = system.actorOf(Props[SilentActor], "s3") 
        silentActor ! SilentMessage("whisper1")
        silentActor ! SilentMessage("whisper2")
        //silentActor testActor
        silentActor ! GetState(testActor) 
        //expectMsg testActor message
        expectMsg(Vector("whisper1", "whisper2")) 
      }

expectMsg,expectMsgPFメソッドはtest actorからのメッセージを受信する.したがって、actorに対応するmessageをテストする場合は、testActorにメッセージを送信し、testActorを私たちのテスト方法に転送することができます.

マルチJVM環境


discuss on chapter 5
actorを分類します.次の3つがあります.
1. SilentActor
メッセージは返さずに送信されません.メッセージを受け入れたかどうか、内部状態を変えたかどうか、異常を投げたかどうかをテストします.単一スレッド環境では、TestActorRefを使用します.マルチスレッド環境ではtestActorを使用します.
2. SendingActor
他のactorにメッセージを送信します.一般的にブラックボックスとしてテストします.testActorを使用してメッセージを受信し、expectMsgまたはexpectMsgPFを使用してtestActorからテストされたactorから受信したメッセージを取得します.
3.SideEffectingActor
メッセージを受け入れ、いくつかのobjectとインタラクティブにします.メッセージを送信するとobjectが変動していることを検出します

TestProbe


TestKitはtestActorを提供しています.
expectMsg
expectNoMsg
ignoreMsg
expectMsgPF
などの方法でtestActorが受け入れるmessageを取得する.複数のactorに送信されるメッセージを受信する場合は、TestProbeを使用してTestProbe()を直接呼び出す必要があります.

まとめ


ほとんどの場合、testActorテストが最も便利です.