2

TeamCity의 각 커밋에서 내 통합 테스트를 실행하고 싶습니다. 테스트를 위해 자동으로 WCF 서비스를 실행하는 좋은 방법은 무엇입니까? WCF 서비스는 테스트 된 솔루션의 일부입니다.TeamCity의 WCF 통합 테스트

현재 테스트에서 서비스를 자체 호스팅합니다.

host = new ServiceHost(typeof(...), url); 

그러나이 경우 실제 IIS 구성 파일을 적용 할 수 없습니다. 코드로 설정을 복제 할 수는 있지만 오히려하지 않을 것입니다.

연속 통합 및 WCF 테스트를위한 모범 사례는 무엇입니까?

참고 : WCFStorm 및 SoupUI를 본 적이 있지만 GUI 기반 응용 프로그램입니다.

답변

3

테스트 프로젝트의 AssemblyInitialize에서 호출하려는 서비스를 자체 호스팅하는 테스트 프로젝트에서 서비스 호스트 클래스를 만듭니다.

[TestClass] 
    internal class ServiceHost 
    { 
     private static ServiceHost<Service1> m_Host = null; 

     /// <summary> 
     /// Setups the specified context. 
     /// </summary> 
     /// <param name="context">The context.</param> 
     [AssemblyInitialize] 
     public static void Setup(TestContext context) 
     { 
      //comment to run against local consolehost 
      m_Host = new ServiceHost<Service1>(); 
      m_Host.Open(); 
     } 

     /// <summary> 
     /// Tears down. 
     /// </summary> 
     [AssemblyCleanup] 
     public static void TearDown() 
     { 
      if (m_Host != null) 
      { 
       m_Host.Close(); 
      } 
     } 
    } 

테스트에서는 서비스를 호출하기 위해 ChannelFactory를 사용합니다. 그런 다음 AssemblyCleanup에서 서비스를 종료합니다.

try 
      { 
       ChannelFactory<IService> factory = new ChannelFactory<IService>("User"); 
       IServiceproxy = factory.CreateChannel(); 
       try 
       { 
        m_IsAuthenticated = proxy.Method(""); 
        // Make sure to close the proxy 
        (proxy as IClientChannel).Close(); 
        Assert.IsTrue(m_IsAuthenticated); 
       } 
       catch 
       { 
        if (proxy != null) 
        { 
         // If the proxy cannot close normally or an exception occurred, abort the proxy call 
         (proxy as IClientChannel).Abort(); 
        } 
        throw; 
       } 
      } 
      catch (Exception ex) 
      { 
       Assert.Fail(ex.Message); 
      } 

테스트 프로젝트와 관련된 설정이 포함 된 자체 App.config 파일을 제공하여 호스트 할 때 테스트 환경과 관련이 있도록하십시오. 이것은 당신에게 자동화 된 블랙 박스 테스트를 제공합니다. 나는 또한 테스트하고자하는 서비스의 일부를 격리하기 위해 모의 (mocks)를 사용한다.