2010-01-08 14 views
14

मैं यूनिट परीक्षण के लिए काफी नया हूं और वर्तमान में विजुअल स्टूडियो के परीक्षण टूल के साथ थोड़ा सा प्रयोग कर रहा हूं।इकाई परीक्षणों में समरूपता का मॉडल कैसे करें?

मेरा प्रश्न यह है कि इन परीक्षणों में समवर्ती व्यवहार के बारे में दावा परिभाषित करने का तरीका है। जैसे एक वर्ग BoundedChan<T> एक घिरे चैनल को लागू करने, मैं कैसे की तरह

  1. "channel.Send ब्लॉक नहीं" या
  2. परीक्षण निर्दिष्ट कर सकते हैं को देखते हुए "चैनल के क्षमता को पार कर जाता है, तो channel.Send को अवरुद्ध कर देगा जब तक एक मूल्य के पढ़ने के लिए है"

क्या इन दावों को लिखने के लिए कोई शानदार समाधान है?

+1

मुझे यकीन नहीं है कि कोई सटीक डुप्लीकेट हैं (हालांकि यह एक करीबी है: http: // stackoverflow।कॉम/प्रश्न/314580/कैसे-करें-मैं-प्रदर्शन-एक-इकाई-परीक्षण-उपयोग-धागे), लेकिन इस पर बहुत अच्छी सामग्री है। मैंने यहां मेरी प्रतिक्रिया में कुछ बेहतर चर्चाएं सूचीबद्ध की हैं: http://stackoverflow.com/questions/1520539/how-to-prove-that-multithreading-is-working/1520619#1520619। –

+0

@ जेफ: आप इसे उत्तर के रूप में क्यों नहीं पोस्ट करते हैं - मेरे लिए काफी उपयोगी लगता है। – Dario

उत्तर

6

यहां एक blog article है जो इस विषय पर चर्चा करता है; यह न्यूटिट पर केंद्रित है।

दुर्भाग्यवश, समेकन अभी भी इकाई परीक्षण का एक क्षेत्र है जो आसानी से संरचना करने के लिए चुनौतीपूर्ण है। यह एक साधारण समस्या नहीं है, और अभी भी यह आवश्यक है कि आप परीक्षण में अपने कुछ सिंक्रनाइज़ेशन और समवर्ती तर्क को लागू करें।

आपके द्वारा प्रदान किए जाने वाले उदाहरण के लिए, निष्कर्ष निकालना असंभव हो सकता है कि दर्शाता है कि कोई विधि कुछ शर्तों के तहत अवरुद्ध या नहीं होगी। आप पहले सबसे बुरी स्थिति परिस्थितियों को बनाकर आत्मविश्वास के कुछ स्तर प्राप्त करने में सक्षम हो सकते हैं, जहां आप अवरोधक व्यवहार की अपेक्षा करेंगे - और तब यह निर्धारित करने के लिए परीक्षण लिखें कि क्या होता है या नहीं।

+0

लिंक मर चुका है, लेकिन वेबैक मशीन में आपकी पीठ है। मूल दान Barvitsky लेख: https://web.archive.org/web/20140822013404/http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/12/techniques-for-testing-concurrent -कोड-इन-नुनिट.एएसपीएक्स। उनका अनुवर्ती पद: https://web.archive.org/web/20100526080326/http://www.atalasoft.com/cs/blogs/danbarvitsky/archive/2009/06/15/my-solution-for-unit -टेस्टिंग-समवर्ती-कोड-इन-नुनिट.एएसपीएक्स। –

+0

@ सोरेन बोइसेन आपके लिंक भी मर चुके हैं :(यह कहता है कि पेज robots.txt के कारण प्रदर्शित नहीं किया जा सकता है। –

+0

@BogdanMart Ouch, इसलिए एक नव निर्मित robots.txt पुराने साइट स्क्रैप्स तक पहुंच (या हटाएं) को अवरुद्ध करने के लिए वेबैक मशीन का कारण बन जाएगा। इंटरनेट संग्रह के लिए बुरी खबर। मुझे लगता है कि ब्लॉग पोस्ट वास्तव में खो गए हैं। –

4

यह प्रश्न किसी पुस्तक को भरने के लिए पर्याप्त सामग्री का कारण बन सकता है।

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

लेकिन आपकी कक्षा समरूपता (प्रदान की गई जानकारी के आधार पर निश्चित रूप से कुछ नहीं बता सकती है), और इसलिए यह एक ऐसा मामला हो सकता है जहां आप वास्तव में एक सहमति-अनुकरण परीक्षण चाहते हैं।

यदि आप चाहें तो एक इकाई परीक्षण में आप (जहां तक ​​मुझे पता है) कई धागे शुरू कर सकते हैं। लेकिन एक आसान तरीका हो सकता है। Compose Method पैटर्न का लाभ उठाने पर विचार करें। जबकि हम इस विषय पर हैं - यह पैटर्न सभी पर प्रभावी यूनिट परीक्षणों के लिए बहुत महत्वपूर्ण है, न केवल समेकन के साथ।

1

मैं एक सहायक है कि धागे का एक समूह समवर्ती कार्यों को निष्पादित करने शुरू कर सकते हैं बनाया है। सहायक सिंक्रनाइज़ेशन प्राइमेटिव और लॉगिंग तंत्र प्रदान करता है। इसका उपयोग किसी इकाई परीक्षण ढांचे के साथ संयोजन में किया जा सकता है।

[Test] 
public void TwoCodeBlocksInParallelTest() 
{ 
    // This static method runs the provided Action delegates in parallel using threads 
    CTestHelper.Run(
     c => 
      { 
       Thread.Sleep(1000); // Here should be the code to provide something 
       CTestHelper.AddSequenceStep("Provide"); // We record a sequence step for the expectations after the test 
       CTestHelper.SetEvent(); 
      }, 
     c => 
      { 
       CTestHelper.WaitEvent(); // We wait until we can consume what is provided 
       CTestHelper.AddSequenceStep("Consume"); // We record a sequence step for the expectations after the test 
      }, 
     TimeSpan.FromSeconds(10)); // This is a timeout parameter, if the threads are deadlocked or take too long, the threads are terminated and a timeout exception is thrown 

    // After Run() completes we can analyze if the recorded sequence steps are in the correct order 
    Expect(CTestHelper.GetSequence(), Is.EqualTo(new[] { "Provide", "Consume" })); 
} 

यह घटकों में क्लाइंट/सर्वर या तुल्यकालन परीक्षण करने के लिए या बस एक समय समाप्ति के साथ एक धागा चलाने इस्तेमाल किया जा सकता: यहाँ एक इकाई परीक्षण से एक कोड टुकड़ा है। मैं अगले हफ्तों में इसे सुधारना जारी रखूंगा। यहां प्रोजेक्ट पेज है: Concurrency Testing Helper

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