2011-03-22 12 views
12

निष्पादित करता है .NET में एक विधि (प्रतिनिधि, स्थैतिक विधि, जो कुछ भी) को निष्पादित करने के लिए संभव है? System.Diagnostics.Process को एक वास्तविक फ़ाइल नाम की आवश्यकता होती है, जिसका अर्थ है कि एक अलग निष्पादन योग्य की आवश्यकता है।एक नई प्रक्रिया शुरू करें जो एक प्रतिनिधि

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

आदर्श रूप में, मैं की तरह कुछ करना होगा:

सभी की
public static void CreateCounter() 
{ 
    var counter = new PerformanceCounter("category", "counter", "instance"); 
    counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Process; 
} 

[Test] 
public void TestResourceDisposal() 
{ 
    // Start child process to execute CreateCounter() 
    ... 
    // verify the resource is disposed 
} 

उत्तर

6

सबसे पहले, नहीं, ऐसा करने के लिए कोई रास्ता नहीं है। मैं प्रक्रिया एक .exe का तात्पर्य है। यह यूनिक्स नहीं है जहां आप एक प्रक्रिया को फोर्क कर सकते हैं जो माता-पिता की एक प्रति है।

मैं बस चलाने के लिए एक छोटा .exe बनाउंगा। क्या आपको विभिन्न प्रदर्शन काउंटरों के साथ परीक्षण चलाने की आवश्यकता है? यदि यह एक के साथ काम करता है, तो निश्चित रूप से यह उनमें से किसी के साथ काम करेगा?

+0

तो ऐसा लगता है कि आप सही हैं - ऐसा कोई प्रबंधित तरीका नहीं है जिसे मैं ऐसा कर सकूं। मैं CodeDOM पथ के साथ गया हूं और छोटे .exe उत्पन्न कर रहा हूँ। धन्यवाद! – Ben

0

मुझे यकीन नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन CreateCounter से प्रदर्शन काउंटर उदाहरण वापस करना आसान होगा और प्रदर्शन काउंटर का उपयोग करने के बाद एक उपयोग निर्देश का उपयोग करना आसान होगा। इस तरह:

using (var counter = CreateCounter()) 
{ 
    // Do some work 
} 

फिर काउंटर हमेशा साफ हो जाएगा, भले ही आप परीक्षण के दौरान फेंक दें।

अन्यथा, मुझे लगता है कि आप क्या चाहते हैं create a new thread पर। आप थ्रेड को पूरा करने के लिए प्रतीक्षा करने के लिए थ्रेड कर सकते हैं। जॉइन()। अधिक जानकारी के लिए System.Threading namespace देखें।

+0

दुर्भाग्य से, न तो निपटने का निपटान() और न ही धागे को फैलाना पर्याप्त होगा।मैं विशेष रूप से पर्फ काउंटर इंस्टेंस नाम के रिलीज (विंडोज़ द्वारा) के लिए परीक्षण कर रहा हूं, जो केवल प्रक्रिया से बाहर निकलने के लिए निर्दिष्ट है - एक थ्रेड-जॉइन में वांछित प्रभाव नहीं होगा, और न ही निपटान()। – Ben

2

आप जो बात कर रहे हैं वह इकाई परीक्षण नहीं है। वास्तविक (महंगी) ऑपरेटिंग सिस्टम सेवाओं के साथ बातचीत करने से अलगाव के मूल सिद्धांत का उल्लंघन होता है कि यूनिट परीक्षण का प्रयास करने के लिए किया जाता है।

अपने इरादे वास्तव में प्रदर्शन काउंटर और इतने पर के साथ बातचीत, एक और अधिक एंड-टू-एंड फैशन में कोड का परीक्षण करने के लिए है, तो उसे एक एकीकरण परीक्षण हो सकता है और एक अधिक "हेवी ड्यूटी में लिखा जाना चाहिए "रास्ता, यानी यदि आवश्यक हो तो एक अलग EXE लिखना, किसी भी जटिल सेटअप या सफाई चरण आदि चलाना

यदि आपको प्रदर्शन काउंटर से निपटने वाले घटकों का परीक्षण करने की आवश्यकता है, तो आपको पहले इस निर्भरता को दूर करना होगा। आम तौर पर आप प्रदर्शन काउंटर के सतह क्षेत्र का प्रतिनिधित्व करने वाली बेस क्लास या इंटरफ़ेस बनाते हैं और उसके बाद (टेस्ट) रनटाइम पर अपनी कार्यक्षमता को प्रतिस्थापित करने के लिए किसी प्रकार के test double बनाते हैं। वास्तविक प्रणाली एक साधारण रैपर का उपयोग करेगी जो वास्तविक प्रदर्शन काउंटर को प्रतिनिधि करती है और उपरोक्त के रूप में एकीकरण परीक्षणों द्वारा इसका उपयोग किया जाएगा।

ऊपर अपनी टिप्पणी पढ़ने से, यह लगभग लगता है जैसे आप .NET ढांचे की गारंटी का परीक्षण करने की कोशिश कर रहे हैं। मैं सवाल करता हूं कि यह वास्तव में जरूरी है क्योंकि यह पहले से ही काफी अच्छी तरह से परीक्षण किया गया है, हालांकि शायद आप यह जांचना चाहते हैं कि आपका कोड ठीक से इसका उपयोग कर रहा है (इस मामले में आप या तो सत्यापन या सत्यापन के आधार पर एकीकरण परीक्षण कर सकते हैं)।

+0

डब्लूआरटी आपका अंतिम पैराग्राफ: हाँ और नहीं। मैं वास्तव में काउंटरों के चारों ओर अपने स्वयं के रैपर का परीक्षण कर रहा हूं; आम तौर पर एक नकली पर्याप्त होगा, लेकिन इस मामले में उतना ही नहीं। प्रदर्शन काउंटरों के पास लटकने का इतिहास (मेरे अनुभव में) है और हमेशा अभिनय नहीं करना चाहिए; परीक्षण (किसी भी नाम से) जब ऐसा होता है तो इस व्यवहार को अलग करना चाहिए। – Ben

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