2008-11-02 9 views
11

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

तो सवाल यह है: वी.एस. प्रत्येक परीक्षा वर्ग के लिए AppDomain बनाना चाहिए या नहीं? यदि हां, तो मैं यह कैसे देख सकता हूं कि यह करता है। मैंने ProcessExpolorer और प्रदर्शन स्नैप-इन के माध्यम से ट्रेसिंग करने का प्रयास किया। टेस्ट रन के दौरान "कुल एपडोमेन अनलोडेड" का मान हमेशा 0 होता है।

+0

मुझे एक ही समस्या है। क्या यह जवाब "आप समस्या" के रूप में समाप्त हुआ क्योंकि उत्तरदाताओं ने कहा था? या वास्तव में यह परीक्षण धावक था? मैं उत्सुक हूँ। –

+0

मुझे http://social.msdn.microsoft.com/Forums/en-US/vststest/thread/2a2548b5-b992-4033-9d30-2f350a5aacaa/ और http://social.msdn.microsoft.com/ मिल गया है मंच/एन-यूएस/vststest/धागा/95ac06fe-d595-4f49-b47a-bcdb667e65a1/- मुझे यह विचार मिल रहा है कि हम में से कुछ जिन्होंने बड़े परीक्षण सूट बनाए हैं, इस समस्या का सामना कर रहे हैं। –

उत्तर

7

मुझे नहीं लगता कि इकाई परीक्षण इंजन प्रत्येक परीक्षा के लिए एक नया AppDomain बनाता है। चूंकि ऐपडॉमेन बनाना अपेक्षाकृत महंगा ऑपरेशन है, इसलिए प्रत्येक टेस्ट के लिए ऐसा करने से इकाई परीक्षणों में काफी कमी आती है!

विजुअल स्टूडियो 2008 इकाई परीक्षण चलाने के लिए एक अलग निष्पादन योग्य बुलाया vstesthost.exe उपयोग करता है। VS vstesthost.exe (यह कैसे मुझे यह नहीं पता) के साथ संचार करता है यह बताने के लिए कि कौन से परीक्षण चलाना है। vstesthost.exe निष्पादन परिणाम VS को देता है जो उन परिणामों को प्रदर्शित करता है।

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

6

मैं प्रत्येक unittest के लिए अलग AppDomains होने के बारे में गलत था।

यहाँ सबूत है: एक सिंगलटन

public class Singleton 
{ 
    public static Singleton Instance = new Singleton(); 

    private Guid _token; 
    private Singleton() 
    { 
     _token = Guid.NewGuid(); 
    } 

    public Guid Token 
    { 
     get { return _token; } 
    } 
} 

और दो टेस्ट:

[TestClass] 
public class UnitTest2 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Console.WriteLine(Singleton.Instance.Token); 
    } 
} 
[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Console.WriteLine(Singleton.Instance.Token); 
    } 
} 

दोनों परीक्षणों उत्पादन एक ही GUID को क्रियान्वित करने के दौरान।

10

एमएसटेस्ट प्रति टेस्ट असेंबली तक एक-ऐप डोमेन बनाता है, जब तक कि आप शोर का उपयोग नहीं कर रहे हैं, इस मामले में कोई ऐपडोमेन अलगाव नहीं है।

आप लीक देख रहे हैं, अपनी शायद या तो अपने परीक्षण कोड, या अपने उत्पाद कोड में एक लेकिन। सुनिश्चित करें कि आप चीजों को चीजों में भर नहीं रहे हैं और उन्हें वहां छोड़ रहे हैं।

+2

+1, प्रति असेंबली ऐप डोमेन। लेकिन - यह प्रति परीक्षण एक नया टेस्ट क्लास उदाहरण भी बनाता है, इसलिए इसे वास्तव में जीसी फ़ील्ड चाहिए। मेरे पास एमएस परीक्षण के साथ कुछ मेमोरी समस्याएं हैं और मुझे नहीं पता कि क्यों। मुझे लगता है कि परीक्षण धावक में कुछ समस्याएं हैं। टेस्ट क्लास इंस्टेंस प्रति टेस्ट पर –

+1

+1। [कक्षा प्रारंभ] स्थिर है। – bryanbcook

1

बड़े परीक्षण रनों के साथ एक ही समस्या को देखा। मेरा सिद्धांत निम्नलिखित है। इस मामले में मेमोरी थकावट इस तथ्य के कारण है कि एमएसटीएस्ट टेस्ट परिणाम फाइलें एक्सएमएल हैं। इसलिए डिस्क पर क्रमिकरण से पहले परीक्षण चलाने के अंत तक इसे सभी लॉग परिणामों को स्मृति में रखने की आवश्यकता है। XML के लिए Hurray :-)

मैंने कुछ समय पहले इस समस्या को connect issue के रूप में पोस्ट किया है और इसे एमएसटीएस्ट 10 (64 बिट पर जा रहा है) में तय किया जाना चाहिए था, लेकिन मैं अभी तक इसे सत्यापित करने में सक्षम नहीं हूं अन्य समस्याएं जिन्हें हम वीएस -2010 और .NET 4.0 में ले जा रहे हैं।

0

यह एमएसटीएस्ट 2010 में हल नहीं किया जा रहा है। मुझे इस तरह के कई समान मुद्दों का सामना करना पड़ रहा है। यूनिट टेस्ट में कचरा संग्रह क्यों काम नहीं करता है?

मेरी समझ यह थी कि यूटी ढांचे ने सभी निष्पादित परीक्षणों का निपटान करने का ख्याल रखा, लेकिन यह कोड में हमारे कुछ सिंगलटन पैटर्न के मामले में ऐसा प्रतीत नहीं होता है।

0

एक सिंगलटन का निपटान करने का एकमात्र तरीका ऐपडोमेन का निपटान करना है। एक सिंगलटन एक स्थिर होल्डिंग है, इसलिए यह मूल रूप से एक परिपत्र संदर्भ है। ट्रू सिंगलेट्स तब तक निपटान नहीं होते जब तक कि एपडोमेन दूर नहीं हो जाता।

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