문제

.넷 프레임 워크:2.0 우선 언어 :씨#

저는 TDD(테스트 주도 개발)을 처음 접했습니다.

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

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

  1. 시작 시
  2. 온스톱

단위 테스트가 적절한 순서로 해당 메서드를 호출하는 실제 서비스인 것처럼 해당 메서드가 호출되도록 어떻게 트리거할 수 있나요?

이 시점에서 단위 테스트도 수행하고 있습니까?아니면 통합 테스트?

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 형식과 비교할 수 있는 매우 얇은 클래스입니다.이는 비즈니스 로직/도메인 로직을 호출하여 예상되는 작업을 수행합니다.당신이 해야 할 일은 onStart 및 onStop에서 호출하는 메소드가 예상대로 작동하는지 확인하는 것입니다.적어도 나는 그렇게 할 것이다 ;-)

많은 답변에서 다음을 권장하므로 테스트용으로 디자인하는 것은 좋은 전략입니다. OnStart 그리고 OnStop 메서드는 도메인 개체에 위임하여 매우 얇은 상태를 유지합니다.

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

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

자동 전원 끄기 테스트 창 서비스, 종료 조건 테스트 창 서비스 네트워크 연결이 끊어지면 연결된 테스트 창 서비스 옵션 자동 스타트, 매뉴얼 등

Guy가 아마도 가장 좋은 대답 일 것입니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top