2008-12-20 4 views
17

मैं एर्लांग के साथ थोडा समय बिता रहा हूं, और मैं लिखने वाले कोड में टीडीडी लागू करना चाहता हूं।इकाई परीक्षण समवर्ती एरलांग कोड का सबसे अच्छा तरीका क्या है?

मानक lib में EUnit नियमित शैली कोड का परीक्षण करने के लिए एक अच्छा पारंपरिक इकाई परीक्षण ढांचा प्रदान करता है, विशेष रूप से समवर्ती कोड परीक्षण के साथ मदद करने के लिए कुछ भी प्रतीत नहीं होता है, जिसका उपयोग एरलांग में बहुत कम होता है।

ध्यान दें कि हम यहां एर्लांग से बात कर रहे हैं, जो समवर्ती प्रक्रियाओं के बीच संचार के लिए संदेश पास (साझा राज्य के विपरीत) का उपयोग करता है, इसलिए साझा राज्य भाषाओं में यूनिट परीक्षण समवर्ती कोड के लिए तकनीक लागू नहीं हो सकती है।

किसी को भी एरलांग में समवर्ती कोड का परीक्षण करने का एक अच्छा तरीका मिला?

उत्तर

1

क्योंकि समवर्ती कोड में त्रुटियां स्वयं को विभिन्न भागों को निष्पादित करने के आदेश के आधार पर प्रकट होती हैं, मुझे लगता है कि आपके कोड के समवर्ती भाग में अपनी बग को उजागर करने के लिए परीक्षण पर भरोसा करना सबसे अच्छा नहीं है। ऐसी बग्स को फिसलने के लिए बहुत आसान है और ढूंढना बेहद मुश्किल है। उदाहरण के लिए देखें कि डबल-लॉकिंग तकनीक, जिसे व्यापक रूप से उद्धृत किया गया था और एक बहुप्रचारित वातावरण में आलसी प्रारंभिकरण को लागू करने के लिए एक कुशल विधि के रूप में उपयोग किया गया था, was later found to be broken। अपने कोड के समवर्ती हिस्सों को "डिज़ाइन द्वारा" सही बनाने के लिए उपयुक्त abstractions और तकनीकों का उपयोग करना बेहतर है।

+0

यह सलाह जावा जैसी भाषा के लिए साझा राज्य समरूपता के साथ सच है। हालांकि एरलांग संदेश पासिंग का उपयोग करता है, और जब आप अन्य प्रक्रियाओं पर डेटा भेजते हैं, और किस क्रम में प्राप्त किया जाता है, तो आप पर नियंत्रण होता है। असल में अधिक नियंत्रण। ऐसा लगता है कि इसके लिए कोड/परीक्षण पैटर्न होना चाहिए। – madlep

+0

सच है, साझा राज्य की कमी आपको डेटा भ्रष्टाचार या असंगतता समस्याओं से बचाती है। लेकिन आपको अभी भी सिंक्रनाइज़ेशन के बारे में चिंता करने की ज़रूरत है। क्या मैं सही हूँ? –

0

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

2

एक उपकरण मैं तुम्हें समवर्ती परिदृश्यों के तहत Erlang कार्यक्रमों का परीक्षण करने के लिए उपयोग कर सकते है कि के बारे में पता QuickCheck है: http://www.quviq.com/

आप अपने अपेक्षित व्यवहार गुण का उपयोग कर निर्दिष्ट कर सकते हैं, और उपकरण की एक श्रृंखला पर अपने Erlang कार्यक्रम व्यायाम कर सकते हैं गुण सुनिश्चित करने के लिए इनपुट और समय। http://www.protest-project.eu

अपडेट:: विरोध परियोजना एक सर्वेक्षण जारी किया है, "Results for: Erlang testing tools survey for the ProTest project"

-1

आप बाहर भाग क्या तुम करोगी अलग कर सकते

दुर्भाग्य से यह एक वाणिज्यिक उपकरण

इसके अलावा विरोध परियोजना पर एक नजर है है इसका उपयोग करके मैक्स के साथ परीक्षण करना पसंद है: http://github.com/charpi/erl_mock/tree/master

हालांकि मुझे erl_mock के साथ कोई अनुभव नहीं है।

5

प्रश्न थोड़ा अस्पष्ट है ("एरलांग समवर्ती है, इसे एरलांग के साथ परीक्षण करें!") लेकिन मैं थोड़ी विस्तार करने की कोशिश करूंगा।

परीक्षण एरलांग कोड जटिल परीक्षण harnesses स्थापित करने के लिए सरल रूप से सरल (सही इनपुट सही उत्पादन उत्पन्न करता है) से हो सकता है जो सत्यापित करता है कि आपका घटक जिस तरह से व्यवहार करता है उसे सत्यापित करता है। आपकी दी गई स्थिति के लिए सबसे अच्छा क्या है आपके पास पूरी तरह से आवश्यक आवश्यकताओं और काले बॉक्स/श्वेत बॉक्स परीक्षण की मात्रा पर निर्भर करता है जो आप करना चाहते हैं।

एरलांग की सुंदरता का हिस्सा समरूपता पारदर्शी बनाने की क्षमता है।

deep_sum(ListOfLists) -> 
    Parent = self(), 
    [spawn(fun() -> Parent ! lists:sum(List) end) || List <- ListOfLists], 
    lists:sum([receive Sum -> Sum end || _ <- ListOfLists]). 

आप आमतौर पर एक बहुत ही सरल EUnit परीक्षण मामले के साथ इस परीक्षण होगा::

deep_sum_test() -> 
    ?assertEqual(0, deep_sum([0, 0, 0, 0])), 
    ?assertEqual(40, deep_sum([10, 10, 10, 10]). 

अब, चलो हम मान लें कि उदाहरण का पालन करना (एक समारोह है कि सूचियों की एक सूची के संकलन parallelizes) पर विचार करें

deep_sum(Pool, ListOfLists) -> 
    distribute_lists(Pool, ListOfLists), 
    lists:sum([receive Sum -> Sum end || _ <- ListOfLists]). 

distribute_lists(Pool, ListOfLists) -> distribute_lists(Pool, Pool, ListOfLists). 

distribute_lists([P|Pool], All, [L|ListOfLists]) -> 
    P ! {self(), L}, 
    distribute_lists(Pool, All, ListOfLists); 
distribute_lists([], All, ListOfLists) -> 
    distribute_lists(All, All, ListOfLists); 
distribute_lists(_Pool, _All, []) -> 
    ok. 

जब यह परीक्षण करते हैं, हम इस प्रक्रिया पूल faking से निपटने के लिए:

01 तर्क के रूप में एक प्रक्रिया पूल: इस कार्यक्षमता को थोड़ा और स्पष्ट एपीआई है
deep_sum_test() -> 
    Pool = [spawn_link(fun() -> fake_pool(1) end) || _ <- lists:seq(1, 3)], 
    ?assertEqual(4, deep_sum(Pool, [lists:seq(1, 3) || _ <- list:seq(1, 4)]), 
    ?assertEqual(7, deep_sum(Pool, [lists:seq(1, 3) || _ <- list:seq(1, 7)]), 
    [P ! stop || P <- Pool]. 

fake_pool(CannedResponse) -> 
    receive 
     {From, _L} -> From ! CannedResponse; 
     stop -> ok 
    end, 
    fake_pool(CannedResponse). 

जैसा कि आप देख सकते हैं, एरलांग में समवर्ती कार्यक्रमों का परीक्षण विभिन्न आकार ले सकते हैं। ये बेहद सरल उदाहरण हैं, लेकिन एर्लांग के समेकन प्राइमेटिव्स में निर्मित के साथ, सही स्तर पर सारणी बनाने के लिए आप जिस प्रकार की टेस्ट हार्नेस चाहते हैं, उसे बनाना बहुत आसान है।

मुझे आम तौर पर टीडीडी को ऑर्थोगोनल होने के लिए लगता है कि आप समवर्ती कोड का परीक्षण कर रहे हैं या नहीं, इसलिए कहा जाता है कि परीक्षण तकनीकों का उपयोग सामान्य इकाई परीक्षण के लिए भी किया जा सकता है।

9

मुझे Concuerror नामक समवर्ती एरलांग अनुप्रयोगों का परीक्षण करने के लिए कुछ अच्छा नया (2011 तक) विकसित सॉफ्टवेयर मिला। इसमें fewpapers और repository on github है। स्पष्ट रूप से यह अपने स्वयं के शेड्यूलर का उपयोग करके और व्यवस्थित रूप से प्रक्रियाओं के बीच विभिन्न अंतःक्रियाओं का परीक्षण करके काम करता है।

इसके अलावा उल्लेख के लायक अपोहक (Erlang के लिए विसंगति विश्लेषक) (Papers, Tutorial, Manual) है, जो त्रुटियों को ढूँढने के लिए कोड की स्थिर विश्लेषण के लिए एक उपकरण है। इसमें कुछ समरूपता-त्रुटियों का पता लगाने के लिए भी समर्थन है (paper देखें)।

मैंने इनमें से किसी भी परीक्षण का परीक्षण नहीं किया है, हालांकि डायलज़र अपेक्षाकृत परिपक्व सॉफ़्टवेयर प्रतीत होता है। दोनों कार्यक्रमों में परीक्षण के साथ काम करने के लिए एक जीयूआई है।

पीएस। गैर-समवर्ती हिस्सों के लिए, ईयूनीट और क्विक चेक (एक मुफ्त संस्करण भी है) ठीक काम करना चाहिए।

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