Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 간단하게 사용자 정의 클래스 생성하여 학습 코드 집합
  • VisualStudio에 유닛테스트 프로젝트활용
  • 분산환경 메시지 Test를 위해 AKKA Test Toolkit사용


 Actor 개념을 익히기까지는 사용자 정의 테스트 클래스를 통해 실습을 하고

이후 Remote 테스트때 기본유닛테스트+Akka Test ToolKit을 이용예정입니다 기호에 맞게 AKKA 테스트 코드를 작성할수 있으나, VisualStudio 유닛테스트기를 권장합니다.


사용자 정의 테스트 클래스 작성

...


Code Block
languagec#
themeEmacs
titleActor를 학습하고 테스트하는 Class
linenumberstrue
using Akka.Actor;

namespace ServiceA.STUDY
{
    public class ActorTest  //Actor 기본 테스트를 위해서~~
    {
        protected ActorSystem actorSystem;

        public ActorTest(ActorSystem system)  //메인 APP에서 생성한 AKKA System만 참조하면 됩니다.
        {
            actorSystem = system;
        }

        protected void SomeTest1()
        {

        }

        public void RunAll()
        {
            SomeTest1(); //SubTest

        }
    }
}

...

AKKA의 기본기능을 배우기위해서는, 유닛테스트 템플릿 프로젝트로 충분합니다.


테스트 코드를 서비스 코드와 완전하게 분리할수 있습니다.

 서비스코드는 서비스에 필요한 각종 액터,메시지정의가 포함될수 있습니다.

Test프로젝트는 서비스프로젝트를 참조하여, 서비스내에서 정의한 객체들을 참조를통해

테스트 수행 가능합니다.


테스트를 단위혹은 그룹별실행 가능하며, 출력및 유효검사가 편리합니다.



AKKA 유닛테스트 샘플

Code Block
languagec#
themeEmacs
linenumberstrue
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Akka.Actor;
using Akka.Event;

using ServiceA.STUDY;


namespace AkkaTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            using (ActorSystem actorSystem = ActorSystem.Create("ServiceA"))
            {
                IActorRef myActor = actorSystem.ActorOf<BasicActor>("myactor");
                Props watchProps = WatchActor.Props(myActor);
                IActorRef watcher = actorSystem.ActorOf(watchProps, "watcher");
                var result = myActor.Ask("나는 살아있다.").Result;
                actorSystem.Stop(myActor); //myActor를 임의로 Stop하여, watcher가 종료를감시한는지 체크
                myActor.GracefulStop(TimeSpan.FromSeconds(10)).Wait();  //생성한 Actor를 안전하게 종료시킨다.
            }            
        }
    }
}

...

 각종 리모트,클러스터환경에서의 메시지 검증을 위해서 AKKA TestTookit을 제공합니다.


Image Modified

-실제 메시지 처리에 대한 유효검사가 가능합니다.

-여러가지 가상의 환경을 셋팅하여 AKKA의

기능에관련된 메시징 기능 체크가 가능합니다.


설치(기존 유닛 테스트에 추가 설치)


사용예

Code Block
languagec#
themeEmacs
linenumberstrue
using ServiceA.STUDY;

using Akka.TestKit.VsTest;

namespace AkkaTest
{
    [TestClass]
    public class UnitTest1 : TestKit
    {
        [TestMethod]
        public void TestMethod1()  //기본 유닛 테스트기
        {
            using (ActorSystem actorSystem = ActorSystem.Create("ServiceA"))
            {
                IActorRef myActor = actorSystem.ActorOf<BasicActor>("myactor");
                Props watchProps = WatchActor.Props(myActor);
                IActorRef watcher = actorSystem.ActorOf(watchProps, "watcher");
                var result = myActor.Ask("나는 살아있다.").Result;
                actorSystem.Stop(myActor); //myActor를 임의로 Stop하여, watcher가 종료를감시한는지 체크
                myActor.GracefulStop(TimeSpan.FromSeconds(10)).Wait();  //생성한 Actor를 안전하게 종료시킨다.
            }            
        }

        [TestMethod]
        public void TestMethod2()  //Akka Tookit을 이용한 유닛테스트, 테스트기에 테스트를 할수 있는 액터가 추가됨
        {
            var myActor = this.Sys.ActorOf<MyActor>("myActor");
            var probe = this.CreateTestProbe();
            myActor.Tell("Hello", this.TestActor);
            ExpectMsg("Re:Hello", TimeSpan.FromSeconds(1));            
        }

    }
}