코드 테스트를 하기위해서 다음과 같은 방법이 있습니다.
기호에 맞게 AKKA 테스트 코드를 작성할수 있으나, VisualStudio 유닛테스트기를 권장합니다.
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
}
}
} |
이렇게 하는 이유는 단지, 기존 어플리케이션 코드에서 학습 진행한 코드를 섹션별로 분리목적으로 큰 의도는 없습니다.
위와 같은 템플릿은 ActorTest외에 , RemoteActorTest , ClusterActorTest 등 학습 목적에따라 Class로 분리예정이며
생성패턴이 유사하니 추가로 언급하지 않겠습니다.
using Akka.Actor;
using ServiceA.STUDY;
namespace ServiceA
{
class Program
{
static void Main(string[] args)
{
ConsoleKeyInfo cki;
Console.CancelKeyPress += new ConsoleCancelEventHandler(myHandler);
using (ActorSystem system = ActorSystem.Create("ServiceA"))
{
//Actor의 시스템 준비 완료
//ActorTest -ActorTest코드는 아래 두줄외에 더이상 추가가 안됩니다.
ActorTest actorTest = new ActorTest(system);
actorTest.RunAll();
while (true)
{
// 메인 어플리케이션 종료방지를 위한코드 ( ctrl+x 종료 )
cki = Console.ReadKey(true);
if (cki.Key == ConsoleKey.X) break;
}
}
}
protected static void myHandler(object sender, ConsoleCancelEventArgs args)
{
args.Cancel = true;
}
}
} |
간단한 단위 테스트를 이용할때는, 직접 테스트 클랙스를 작성하여 콘솔환경에서 수행하는것보다
IDE에서 제공하는 유닛 테스트프로젝트를 이용하는것이 더 편리하고 강력합니다.
AKKA의 기본기능을 배우기위해서는, 유닛테스트 템플릿 프로젝트로 충분합니다.
![]()
서비스코드는 서비스에 필요한 각종 액터,메시지정의가 포함될수 있습니다.
Test프로젝트는 서비스프로젝트를 참조하여, 서비스내에서 정의한 객체들을 참조를통해
테스트 수행 가능합니다.

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를 안전하게 종료시킨다.
}
}
}
}
|
출력:
테스트 이름: TestMethod1 테스트 결과: 성공 Result StandardOutput: [DEBUG][2017-09-12 오전 1:29:23][Thread 0022][EventStream(ServiceA)] Logger log1-DefaultLogger [DefaultLogger] started [DEBUG][2017-09-12 오전 1:29:23][Thread 0022][EventStream(ServiceA)] StandardOutLogger being removed [DEBUG][2017-09-12 오전 1:29:23][Thread 0022][EventStream(ServiceA)] Default Loggers started [INFO][2017-09-12 오전 1:29:23][Thread 0022][remoting] Starting remoting [DEBUG][2017-09-12 오전 1:29:23][Thread 0029][remoting] Starting prune timer for endpoint manager... [INFO][2017-09-12 오전 1:29:23][Thread 0022][remoting] Remoting started; listening on addresses : [akka.tcp://ServiceA@127.0.0.1:8001] [INFO][2017-09-12 오전 1:29:23][Thread 0022][remoting] Remoting now listens on addresses: [akka.tcp://ServiceA@127.0.0.1:8001] [WARNING][2017-09-12 오전 1:29:23][Thread 0022][ActorSystem(ServiceA)] NewtonSoftJsonSerializer has been detected as a default serializer. It will be obsoleted in Akka.NET starting from version 1.5 in the favor of Hyperion (for more info visit: http://getakka.net/docs/Serialization#how-to-setup-hyperion-as-default-serializer ). If you want to suppress this message set HOCON `akka.suppress-json-serializer-warning` config flag to on. [INFO][2017-09-12 오전 1:29:23][Thread 0004][[akka://ServiceA/user/myactor#1560625506]] BasicActor:GetSomeMessage 나는 살아있다. [INFO][2017-09-12 오전 1:29:23][Thread 0008][[akka://ServiceA/user/watcher#2126936690]] WatchActor:GetSomeMessage <Terminated>: [akka://ServiceA/user/myactor#1560625506] - ExistenceConfirmed=True [INFO][2017-09-12 오전 1:29:23][Thread 0008][[akka://ServiceA/user/watcher#2126936690]] 감시대상이 사라짐 [DEBUG][2017-09-12 오전 1:29:23][Thread 0022][ActorSystem(ServiceA)] Disposing system [DEBUG][2017-09-12 오전 1:29:23][Thread 0022][ActorSystem(ServiceA)] System shutdown initiated |