developer tip

Windows 서비스를 단위 테스트하려면 어떻게해야합니까?

copycodes 2020. 12. 7. 08:23
반응형

Windows 서비스를 단위 테스트하려면 어떻게해야합니까?


.NET Framework : 2.0 기본 언어 : C #

저는 TDD (Test Driven Development)를 처음 사용합니다.

우선, Windows 서비스 단위 테스트도 가능합니까?

Windows 서비스 클래스는 재정의 가능한 메서드가있는 ServiceBase에서 파생됩니다.

  1. OnStart
  2. OnStop

단위 테스트가 적절한 순서로 해당 메서드를 호출하는 실제 서비스 인 것처럼 이러한 메서드가 호출되도록 트리거하려면 어떻게해야합니까?

이 시점에서 단위 테스트도하고 있습니까? 또는 통합 테스트?

나는 WCF 서비스 질문을 보았지만 WCF 서비스를 다루지 않았기 때문에 나에게 의미가 없습니다.


Windows 서비스의 "OnStart"및 "OnStop"이 클래스 라이브러리 어셈블리의 메서드를 호출하도록 앱을 디자인하는 것이 좋습니다. 이렇게하면 클래스 라이브러리 메서드에 대한 단위 테스트를 자동화 할 수 있으며 디자인은 Windows 서비스 구현에서 비즈니스 논리도 추상화합니다.

이 시나리오에서 Windows 서비스 컨텍스트에서 "OnStart"및 "OnStop"메서드 자체를 테스트하는 것은 자동화 할 것이 아니라 통합 테스트가됩니다.


서비스를 직접 테스트하지 않고 서비스가 수행하는 작업을 테스트하여 Windows 서비스를 단위 테스트했습니다.

일반적으로 서비스 용 어셈블리 하나와 서비스 작업용 어셈블리 하나를 만듭니다. 그런 다음 두 번째 어셈블리에 대한 단위 테스트를 작성합니다.

이 접근 방식의 좋은 점은 서비스가 매우 적다는 것입니다. 기본적으로 모든 작업은 적절한 시간에 올바른 작업을 수행하기 위해 메서드를 호출하는 것입니다. 다른 어셈블리에는 서비스가 수행하려는 작업의 모든 고기가 포함되어 있습니다. 따라서 테스트가 매우 쉽고 필요에 따라 쉽게 재사용하거나 수정할 수 있습니다.


여기서 시작 하겠습니다 . C #에서 서비스를 시작하고 중지하는 방법을 보여줍니다.

시작할 샘플은 다음과 같습니다.

public static void StartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

또한 주로 콘솔 앱을 통해 서비스를 테스트하여 서비스가 수행 할 작업을 시뮬레이션했습니다. 그렇게하면 단위 테스트가 완전히 자동화됩니다.


Windows 서비스 클래스 (서비스를 시작 / 중지 할 때 실행하는 클래스)를 실제 시스템에 대한 프록시처럼 사용합니다. 귀하의 서비스 뒤에있는 코드가 다른 프로그래밍과 어떻게 달라야하는지 모르겠습니다. onStart 및 onStop 메소드는 GUI에서 버튼을 누르는 것과 같이 단순히 실행되는 이벤트입니다.

따라서 Windows 서비스 클래스는 Windows Form과 비교할 수있는 매우 얇은 클래스입니다. 비즈니스 로직 / 도메인 로직을 호출 한 다음 수행해야하는 작업을 수행합니다. onStart 및 onStop에서 호출하는 메서드가 예상대로 작동하는지 확인하기 만하면됩니다. 적어도 그게 내가 할 일입니다 ;-)


테스트를 위해 디자인하는 것은 좋은 전략입니다. 많은 답변 에서 도메인 개체에 위임하여 사용자 OnStartOnStop메서드를 매우 얇게 유지 하도록 권장 합니다.

그러나 어떤 이유로 테스트에서 서비스 메서드를 실행해야하는 경우 다음과 같은 코드를 사용하여 테스트 메서드 내에서 호출 할 수 있습니다 ( OnStart이 예제에서 호출 ).

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});

자동 전원 끄기, 종료 조건에서 테스트 창 서비스 네트워크 연결 해제, 연결시 창 서비스 테스트 테스트 창 서비스 옵션 자동 시작, 수동 등


가이가 가장 좋은 대답 일 것입니다.

어쨌든, 정말로 원한다면 MSDN 문서에 설명 된 대로이 두 메서드를 단위 테스트에서 호출 할 수 있지만, 보호되기 때문에 Reflection을 사용해야합니다.

참고URL : https://stackoverflow.com/questions/42150/how-can-i-unit-test-a-windows-service

반응형