2008-09-03 29 views
57

.नेट फ्रेमवर्क: 2.0 पसंदीदा भाषा: सी #मैं एक विंडोज सेवा का परीक्षण कैसे कर सकता हूं?

मैं TDD (टेस्ट प्रेरित विकास) के लिए नया हूँ।

सबसे पहले, क्या यूनिट परीक्षण विंडोज सेवा के लिए भी संभव है?

Windows सेवा वर्ग ServiceBase, जो overridable तरीकों है से ली गई है,

  1. onStart
  2. OnStop

मैं कैसे के रूप में यदि इकाई परीक्षण एक वास्तविक है के नाम से जाना उन तरीकों को गति प्रदान कर सकते हैं सेवा जो उन तरीकों को उचित क्रम में बुलाती है?

इस बिंदु पर, क्या मैं यूनिट परीक्षण भी कर रहा हूं? या एकीकरण परीक्षण?

मैंने डब्ल्यूसीएफ सेवा प्रश्न पर ध्यान दिया है, लेकिन इससे मुझे कोई समझ नहीं आया क्योंकि मैंने कभी डब्ल्यूसीएफ सेवा से निपटाया नहीं है।

उत्तर

80

मैं शायद आपके ऐप को डिज़ाइन करने की अनुशंसा करता हूं ताकि विंडोज सेवा में "ऑनस्टार्ट" और "ऑनस्टॉप" ओवरराइड बस क्लास लाइब्रेरी असेंबली पर कॉल करें। इस तरह आप कक्षा पुस्तकालय विधियों के खिलाफ यूनिट परीक्षण स्वचालित कर सकते हैं, और डिज़ाइन एक विंडोज सेवा के कार्यान्वयन से आपके व्यावसायिक तर्क को भी सारणीबद्ध करता है।

इस परिदृश्य में, Windows सेवा संदर्भ में स्वयं "ऑनस्टार्ट" और "ऑनस्टॉप" विधियों का परीक्षण करना एकीकरण परीक्षण होगा, कुछ ऐसा नहीं जो आप स्वचालित करेंगे।

11

मैं here शुरू करूंगा। इससे पता चलता है शुरू करने और सी # में सेवाओं को रोकने

एक नमूना शुरू करने के लिए है करने के लिए कैसे

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 
    { 
    // ... 
    } 
} 

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

+1

क्या इस कोड रिटर्न सेवा। WaitForStatus? WaitForStatus() फ़ंक्शन का उपयोग क्या है? कृपया समझाएँ। धन्यवाद – Mou

30

मेरे पास सेवा का परीक्षण न करके यूनिट परीक्षण की गई है, बल्कि यह जांचने के लिए कि सेवा क्या करती है।

आमतौर पर मैं सेवा के लिए एक असेंबली बनाता हूं और दूसरा सेवा करता है। फिर मैं दूसरी असेंबली के खिलाफ यूनिट परीक्षण लिखता हूं।

इस दृष्टिकोण के बारे में अच्छी बात यह है कि आपकी सेवा बहुत पतली है। असल में यह सही समय पर सही काम करने के लिए कॉल विधियां करता है। आपकी अन्य असेंबली में आपके द्वारा किए जाने वाले काम के सभी मांस शामिल हैं। यह परीक्षण के लिए बहुत आसान बनाता है और आवश्यकतानुसार पुन: उपयोग या संशोधित करना आसान बनाता है।

+0

अच्छा दृष्टिकोण, जो आपके बीएल को सेवा से अलग करता है। – JPReddy

5

मैं विंडोज़ सर्विस क्लास (जिसे आप सेवा शुरू/बंद करते हैं, तब आप चलाते हैं) का उपयोग करेंगे, जो आपके वास्तविक सिस्टम के लिए प्रॉक्सी की तरह है। मैं नहीं देखता कि आपकी सेवा के पीछे कोड किसी अन्य प्रोग्रामिंग से अलग कैसे होना चाहिए। ऑनस्टार्ट और ऑनस्टॉप विधियों को केवल जीयूआई पर एक बटन दबाए जाने की तरह घटनाओं को निकाल दिया जाता है।

तो आपकी विंडोज़ सेवा कक्षा एक बहुत ही पतली कक्षा है, जो विंडोज़ के रूप में तुलनीय है। यह आपके व्यापार तर्क/डोमेन तर्क को कॉल करता है, जो तब करता है जो इसे करना है। आपको बस इतना करना है कि आप अपने ऑनस्टार्ट और ऑनस्टॉप में जिस विधि (कॉलिंग) में कॉल कर रहे हैं, वे काम कर रहे हैं जैसे वे हैं।कम से कम है कि मैं स्वत: सत्ता से दूर में ;-)

0

टेस्ट विंडो सेवा करना होगा क्या, टेस्ट खिड़की सेवा शर्तों को बंद कर दिया जब नेटवर्क डिस्कनेक्ट कर दिया, जुड़े टेस्ट खिड़की सेवा विकल्प स्वतः प्रारंभ मैनुअल आदि

+1

मुझे लगता है कि वह एक विंडोज सेवा परीक्षण के प्रकारों के बारे में नहीं पूछ रहा है। – JPReddy

0

लड़का के शायद सबसे बढ़िया उत्तर।

वैसे भी, यदि आप वास्तव में चाहते हैं, तो आप MSDN documentation द्वारा वर्णित इन दो विधियों में इकाई परीक्षण में शामिल हो सकते हैं, लेकिन चूंकि वे सुरक्षित हैं, आपको प्रतिबिंब का उपयोग करने की आवश्यकता होगी।

2

परीक्षण के लिए डिज़ाइनिंग एक अच्छी रणनीति है, क्योंकि कई उत्तरों ने सिफारिश की है कि OnStart और OnStop विधियां डोमेन ऑब्जेक्ट्स को प्रतिनिधि द्वारा बहुत पतली रहती हैं।

हालांकि, यदि आपका परीक्षण किसी कारण से सेवा तरीकों पर अमल करने की आवश्यकता है, तो आप कोड इस तरह उन्हें एक परीक्षा पद्धति (इस उदाहरण में OnStart बुला) के भीतर से कॉल करने के लिए उपयोग कर सकते हैं:

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}}); 
संबंधित मुद्दे