2012-03-06 10 views
8

हम एक सेवा उन्मुख ढांचे (एसओए) की वास्तुकला शुरू करने वाले हैं, जिसमें निश्चित रूप से बड़ी संख्या में दानेदार वेब सेवाएं (डब्लूसीएफ में आरईएसटी) शामिल होंगी। हम अपने क्लाइंट और सर्वर-साइड कोड बेस की इकाई परीक्षण में काफी अनुशासित हैं, हालांकि हमारे पास यूनिट परीक्षण वेब सेवाओं में कोई भी अनुभव नहीं है। हम वास्तव में मार्गदर्शन की तलाश में हैं कि परीक्षण कहां लिखा जाना चाहिए और हमारी सेवाओं का परीक्षण करते समय किस दृष्टिकोण का उपयोग करना है, इसकी सिफारिशें।यूनिट परीक्षण वेब सेवाओं के लिए अनुशंसित पैटर्न

क्या हमें ऐसे परीक्षण लिखना चाहिए जो http अनुरोध करते हैं और दावा करते हैं कि प्रतिक्रियाएं क्या हैं? क्या हमें केवल सेवा विधियों के आंतरिक तर्क का परीक्षण करने पर ध्यान देना चाहिए और वास्तविक अनुरोधों के परीक्षण के बारे में चिंता न करें? या हम दोनों को करना चाहिए? क्या हमें परीक्षण करने के लिए कोई अन्य सिफारिशें हैं?

हम वास्तव में कुछ स्पष्टीकरण और मार्गदर्शन की तलाश में हैं और हम जो भी सलाह प्राप्त कर सकते हैं उसकी सराहना करेंगे।

उत्तर

11

मैं परीक्षण वेब सेवाओं, विशेष रूप से WCF क्लाइंट और सर्वर, पाया है निम्न परिदृश्यों में नियमित रूप से इकाई परीक्षण के शीर्ष पर उपयोगी:

  1. स्वीकृति परीक्षण जहाँ आप अपने पूरे सेवा का परीक्षण और चीजों प्रहार ब्लैक बॉक्स करना चाहते हैं चरम पर।
  2. एक विशिष्ट डब्ल्यूसीएफ वायर अप, एक्सटेंशन, व्यवहार इत्यादि का परीक्षण
  3. परीक्षण करना कि आपका इंटरफ़ेस और आपके डेटा सदस्य सही तरीके से सेटअप हैं।

अधिकांश समय मैं मूल http के साथ एक बहुत ही बुनियादी सेटअप का उपयोग करने की कोशिश करता हूं और कोड में सब कुछ तार करता हूं। जब तक मैं एकीकरण या स्वीकृति परीक्षण नहीं करता हूं, मैं सर्वर के खिलाफ क्लाइंट का परीक्षण नहीं करता हूं, इसके बजाय मैं उनमें से एक को नकल करता हूं ताकि मैं अलगाव में दूसरे का परीक्षण कर सकूं। नीचे कैसे मैं WCF ग्राहकों और सेवाओं का परीक्षण के उदाहरण हैं:

public static ServiceHost CreateServiceHost<TServiceToHost>(TServiceToHost serviceToHost, Uri baseAddress, string endpointAddress) 
{ 
    var serviceHost = new ServiceHost(serviceToHost, new[] { baseAddress }); 

    serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true; 
    serviceHost.Description.Behaviors.Find<ServiceBehaviorAttribute>().InstanceContextMode = InstanceContextMode.Single; 

    serviceHost.AddServiceEndpoint(typeof(TServiceToHost), new BasicHttpBinding(), endpointAddress); 

    return serviceHost; 
} 

//Testing Service 

[TestFixture] 
class TestService 
{ 
    private ServiceHost myServiceUnderTestHost; 
    private ChannelFactory<IMyServiceUnderTest> myServiceUnderTestProxyFactory; 
    [SetUp] 
    public void SetUp() 
    { 
     IMyServiceUnderTest myServiceUnderTest = new MyServiceUnderTest(); 
     myServiceUnderTestHost = CreateServiceHost<IMyServiceUnderTest>(myServiceUnderTest, new Uri("http://localhost:12345"), "ServiceEndPoint"); 
     myServiceUnderTestHost.Open(); 

     myServiceUnderTestProxyFactory = new ChannelFactory<IMyServiceUnderTest>(new BasicHttpBinding(), new EndpointAddress("http://localhost:12345/ServiceEndPoint")); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     myServiceUnderTestProxyFactory.Close(); 
     myServiceUnderTestHost.Close(); 
    } 

    [Test] 
    public void SomeTest() 
    { 
     IMyServiceUnderTest serviceProxy = myServiceUnderTestProxyFactory.CreateChannel(); 

     serviceProxy.SomeMethodCall(); 
    } 
} 

//Testing Client 

[TestFixture] 
class TestService 
{ 
    private ServiceHost myMockedServiceUnderTestHost; 
    private IMyServiceUnderTest myMockedServiceUnderTest; 

    [SetUp] 
    public void SetUp() 
    { 
     myMockedServiceUnderTest = Substitute.For<IMyServiceUnderTest>(); //Using nsubstitute 
     myServiceUnderTestHost = CreateServiceHost<IMyServiceUnderTest>(myMockedServiceUnderTest, new Uri("http://localhost:12345"), "ServiceEndPoint"); 
     myServiceUnderTestHost.Open(); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     myServiceUnderTestHost.Close(); 
    } 

    [Test] 
    public void SomeTest() 
    { 
     //Create client and invoke methods that will call service 
     //Will need some way of configuring the binding 
     var client = new myClientUnderTest(); 

     client.DoWork(); 

     //Assert that method was called on the server 
     myMockedServiceUnderTest.Recieved().SomeMethodCall(); 
    } 
} 

नोट

मैं उल्लेख करना भूल गया था कि अगर आप कुछ भी तो महल गतिशील प्रॉक्सी का उपयोग करता है का उपयोग कर एक WCF सेवा नकली करना चाहते हैं तो आप करेंगे ServiceContractAttribute को नकली में कॉपी करने से रोकने की आवश्यकता है। मेरे पास blog post है लेकिन मूल रूप से आप नकली बनाने से पहले प्रतिकृति से बचने के लिए विशेषता को एक के रूप में पंजीकृत करते हैं।

Castle.DynamicProxy.Generators.AttributesToAvoidReplicating 
    .Add<ServiceContractAttribute>(); 
3

अच्छी तरह से मुझे लगता है कि आपको दो भाग परीक्षण रणनीति की आवश्यकता है।

पहला भाग सच यूनिट परीक्षण होगा, जिसमें किसी भी वेब अनुरोध से पूरी तरह से स्वतंत्र वर्गों का परीक्षण करना शामिल होगा ... एक यूनिट परीक्षण की मुख्य परिभाषा के रूप में वह है जो अतिरिक्त वातावरण की आवश्यकता के बिना चलता है या अन्य सेटअप करता है परीक्षण में स्वयं की तुलना में।

तो आप इकाई परीक्षण परियोजनाएं तैयार करेंगे, जिसमें आप यह सुनिश्चित करने के लिए अपनी डब्ल्यूसीएफ सेवाओं के कोड कक्षाओं को तुरंत चालू करेंगे, वैसे ही जैसे आप अपने बाकी वर्गों का परीक्षण करेंगे।

दूसरा भाग एकीकरण परीक्षण का एक सेट होगा, जो आपके एप्लिकेशन को अंत-टू-एंड फैशन में परीक्षण करेगा। बेशक, यहां आपको पूरे एनचिला, वेब सर्वर, डेटाबेस, और बहुत कुछ की आवश्यकता है।

इस तरह से आप जानते हैं कि आपका तर्क सटीक है और यह भी कि आपका एप्लिकेशन काम करता है।

संबंधित मुद्दे