2010-04-22 8 views
19

मुझे एक बड़ी और काफी जटिल राज्य मशीन विरासत में मिली। इसमें 31 संभावित राज्य हैं, सभी की वास्तव में आवश्यकता है (बड़ी व्यावसायिक प्रक्रिया)।बड़ी राज्य मशीनों का परीक्षण करने के लिए कुछ रणनीतियां क्या हैं?

  • Enum: वर्तमान स्थिति (ताकि 0 -> 30)
  • Enum: यह निम्नलिखित आदानों है स्रोत (वर्तमान में केवल 2 प्रविष्टियों)
  • बूलियन: अनुरोध
  • बूलियन: प्रकार
  • enum: स्थिति (3 राज्यों)
  • enum: हैंडलिंग (3 राज्यों)
  • बूलियन: पूर्ण

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

[Subject("Application Process States")] 
public class When_state_is_meeting2Requested : AppProcessBase 
{ 
    Establish context =() => 
    { 
     //Setup.... 
    }; 

    Because of =() => process.Load(jas, vac); 

    It Current_node_should_be_meeting2Requested =() => process.CurrentNode.ShouldBeOfType<meetingRequestedNode>(); 
    It Can_move_to_clientDeclined =() => Check(process, process.clientDeclined); 
    It Can_move_to_meeting1Arranged =() => Check(process, process.meeting1Arranged); 
    It Can_move_to_meeting2Arranged =() => Check(process, process.meeting2Arranged); 
    It Can_move_to_Reject =() => Check(process, process.Reject); 
    It Cannot_move_to_any_other_state =() => AllOthersFalse(process); 
} 

कोई भी पूरी तरह से सुनिश्चित नहीं है कि आउटपुट प्रत्येक राज्य और इनपुट के सेट के लिए क्या होना चाहिए। मैंने इसके लिए परीक्षण लिखना शुरू कर दिया है। हालांकि, मुझे परीक्षण (30 * 2 * 2 * 2 * 3 * 3 * 2) जैसे कुछ लिखने की आवश्यकता होगी।

राज्य मशीनों के परीक्षण के लिए आपके पास क्या सुझाव हैं?


संपादित करें: मैं सभी सुझावों के साथ खेल रहा हूँ, और जब मैं एक है कि सबसे अच्छा काम करता एक जवाब का प्रतीक होगा।

+0

क्या आपने किसी भी मौके पर अभी तक सभी जोड़े की कोशिश की? क्या आपको एक और तरीका मिला है जो आपको चाहिए? –

+0

दुर्भाग्यवश मेरे काम का समय इस समय काफी तंग है - मुझे इस सप्ताह के दौरान इसमें देखने के लिए कुछ और समय मिलना चाहिए। वर्तमान में राज्य मानचित्र सबसे अच्छा समाधान (h2g2java) जैसा दिखता है, हालांकि मैंने अभी तक उन सभी में पूरी तरह से ध्यान नहीं दिया है। – Pondidum

+0

मुझे यकीन नहीं है कि मैं पूरी तरह से * राज्य मैप्स * की अवधारणा को समझता हूं (वास्तव में मैं * मुझे यकीन है कि मुझे समझ में नहीं आता है) –

उत्तर

6

मुझे समस्या दिखाई देती है, लेकिन मैं निश्चित रूप से तर्क को विभाजित करने का प्रयास करता हूं।

बड़ी समस्या क्षेत्र मेरी आँखों में है:

  • यह 31 संभव राज्यों में हो गया है
  • यह है निम्नलिखित आदानों:।
    • Enum: वर्तमान स्थिति (ताकि 0 -> 30)
    • एनम: स्रोत (वर्तमान में केवल 2 प्रविष्टियां)
    • बूलियन: अनुरोध
    • बूलियन: प्रकार
    • Enum: स्थिति (3 राज्यों)
    • Enum: हैंडलिंग (3 राज्यों)
    • बूलियन: पूर्ण

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

यह question I asked about testing large methods प्रकृति में समान है, मैंने पाया कि मेरी इकाइयां बहुत बड़ी थीं। आप अभी भी कई परीक्षणों के साथ समाप्त हो जाएंगे, लेकिन वे कम जमीन को कवर करने वाले छोटे और अधिक प्रबंधनीय होंगे। हालांकि यह केवल एक अच्छी बात हो सकती है।

परीक्षण परंपरागत कोड

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

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

+0

प्रबंधनीय क्षेत्रों में विभाजित होने के साथ ही एकमात्र समस्या यह है कि यह एक राज्य मशीन है। यह राज्य से राज्य में जाने के लिए निर्णयों का संग्रह है - मैं वास्तव में नहीं देखता कि मैं इसे कैसे विभाजित कर सकता हूं। हालांकि मैं Pex के रूप में दिखता हूं, कुछ मदद की हो सकती है, भले ही केवल एक प्रारंभिक बिंदु हो। – Pondidum

+0

राज्य डिजाइन पैटर्न बताता है कि प्रत्येक राज्य कोड का एक स्वतंत्र, तार्किक क्षेत्र होना चाहिए। राज्य मशीन को स्वयं परवाह नहीं करना चाहिए कि उसके कितने राज्य हैं। http://en.wikipedia.org/wiki/State_pattern यदि यह राज्य मशीन इसका पालन नहीं करती है, या राज्यों को एम्बेड किया गया है (स्विच स्टेटमेंट के माध्यम से कहें) यह एक समस्या है। – Finglas

+0

ऐसा नहीं है - अन्य कोड केवल राज्य मशीन से पूछताछ करता है कि यह किस स्थिति में है, और इस प्रकार कौन से विकल्प प्रदर्शित किए जाने चाहिए। – Pondidum

2

मैं मशीन सीखने की तकनीक या ब्रूट फोर्स का उपयोग करके वास्तव में पैडेंटिक और प्रमाणों को नियोजित करने के साथ इस तरह एक एफएसएम परीक्षण करने का कोई आसान तरीका नहीं सोच सकता।

ब्रूट फोर्स: कुछ ऐसा लिखें जो 4320 परीक्षण मामलों को कुछ घोषणात्मक तरीके से अधिकतर गलत डेटा के साथ उत्पन्न करेगा। मैं इसे एक CSV फ़ाइल में डालने की अनुशंसा करता हूं और फिर सभी परीक्षण मामलों को लोड करने के लिए NUnits पैरामीटर परीक्षण जैसे कुछ का उपयोग करता हूं। अब इनमें से अधिकतर परीक्षण मामले विफल हो जाएंगे, इसलिए आपको सही होने के लिए घोषणात्मक फ़ाइल को मैन्युअल रूप से अपडेट करना होगा और ठीक करने के लिए परीक्षण मामलों का नमूना यादृच्छिक रूप से लेना होगा।

मशीन लर्निंग तकनीक: आप नमूना आप क्या हम ऊपर उल्लेख किया है से ले लिया पर जानने के लिए और अपने एमएल कार्यक्रम अपने FSM को पढ़ाने के लिए प्रयास करने के लिए कुछ वेक्टर मशीनों या एमडीए एल्गोरिदम/heuristics रोजगार सकता है। फिर सभी 4320 इनपुट पर एल्गोरिदम चलाएं और देखें कि दोनों असहमत हैं।

0

कवरेज परीक्षणों के साथ ब्रूट फोर्स एक बहुत ही शुरुआत प्रतीत होता है।

3

"पूरी तरह से" परीक्षण कार्य योग (int a, int b) के लिए आपको कितने परीक्षण की आवश्यकता है? सी # में यह 18446744056529682436 परीक्षणों की तरह कुछ होगा ... आपके मामले की तुलना में बहुत खराब है।

मैं निम्नलिखित सुझाव है:

  1. टेस्ट सबसे संभव स्थितियों, सीमा की स्थिति।
  2. अलग से अपने SUT के कुछ महत्वपूर्ण भागों का परीक्षण करें।
  3. क्यूए या उत्पादन में बग मिलने पर परीक्षण के मामले जोड़ें।

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

Start 
    .UploadDocument("name1") 
    .SendDocumentOnReviewTo("user1") 
    .Review() 
    .RejectWithComment("Not enough details") 
    .AssertIsCompleted() 

प्रवाह के लिए सरल परीक्षण बनाने के उदाहरण यहाँ है: http://slmoloch.blogspot.com/2009/12/design-of-selenium-tests-for-aspnet_09.html

1

टेस्ट आवश्यकताओं के आधार पर। यदि किसी निश्चित स्थिति को किसी भी अन्य राज्य में जाने के लिए किसी भी अन्य राज्य में जाने की आवश्यकता होती है, तो एक परीक्षण लिखें जो अन्य इनपुट के सभी संयोजनों के माध्यम से स्वचालित रूप से चक्र चलाता है (यह केवल लूप के लिए एक जोड़े होना चाहिए) साबित करने के लिए कि अन्य इनपुट हैं सही ढंग से अनदेखा किया। आपको प्रत्येक संक्रमण चाप के लिए एक परीक्षण के साथ समाप्त होना चाहिए, जिसका अनुमान है कि यह 100 या 150 परीक्षणों के क्रम में कहीं भी होगा, 4000 नहीं।

3

मैंने चिकित्सा उपकरणों के एक टुकड़े के लिए एक सीमित राज्य मशीन का निर्माण किया था। एफएसएम परिभाषित एक एक्सएमएल प्रारूप के माध्यम से विन्यास योग्य था।

एक राज्य मशीन को परिभाषित करने के लिए, एक राज्य के नक्शे का उपयोग करने का डिजिटल सर्किट डिजाइन पर अनुभव पर भरोसा करना पड़ता है,

आप एक शुल्क मार्ग संक्रमण नक्शे के रूप में मैं क्या शब्द का प्रयोग किया है। संयुक्त राज्य अमेरिका के पूर्वी तट में, अधिकांश राजमार्गों को उपनाम टर्नपीक्स हैं। टर्नपाइक प्राधिकरण टर्नपीक टोल मूल्य निर्धारण मानचित्र जारी करते हैं। यदि एक टोल अनुभाग में 50 निकास होते हैं, तो मूल्य निर्धारण मानचित्र में 50rows x 50cols तालिका होगी, जो पंक्तियों और स्तंभ दोनों के रूप में निकास को सूचीबद्ध करती है। बाहर निकलने के लिए 20 से बाहर निकलने के लिए टोल चार्ज का पता लगाने और 30 से बाहर निकलने के लिए, आप बस पंक्ति 20 और कॉलम 30 के छेड़छाड़ की तलाश करते हैं।

30 राज्यों की एक राज्य मशीन के लिए, टर्नपाइक संक्रमण मानचित्र 30 x 30 होगा मैट्रिक्स सभी 30 संभावित राज्यों पंक्ति और कॉलम के अनुसार लिस्टिंग। आइए हम पंक्तियों को वर्तमान राज्यों और स्तंभों को अगले राज्य होने का निर्णय लेते हैं।

प्रत्येक छेड़छाड़ सेल एक वर्तमान स्थिति (पंक्ति) से एक अगला राज्य (कॉल) में संक्रमण की "कीमत" सूचीबद्ध करेगा। हालांकि एक $ मूल्य के बजाय, सेल इनपुट तालिका में एक पंक्ति का संदर्भ देगा, जिसे हम संक्रमण आईडी के रूप में टर्म कर सकते हैं।

मेडिकल उपकरण में एफएसएम I विकसित हुआ, वहां स्ट्रिंग, एनम्स, इंट इत्यादि इनपुट थे। इनपुट तालिका में इन इनपुट उत्तेजना कॉलम-वार सूचीबद्ध थे।

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

इन दो तालिकाओं के निर्माण में दो दिशाएं हैं।

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

  2. परीक्षण दिशा विपरीत है, जहां आप इनपुट तालिका बनाते हैं। आपको संपूर्ण संक्रमण परीक्षण के लिए एक सामान्य दिनचर्या लिखनी है।
    दिनचर्या पहले टेस्ट चक्र शुरू करने के लिए राज्य-मशीन को एंट्रीपॉइंट स्थिति में लाने के लिए एक संक्रमण अनुक्रम तालिका पढ़ेगी। प्रत्येक वर्तमान स्थिति में, यह सभी 4320 संक्रमण आईडी के माध्यम से चलाने के लिए तैयार है। टर्नपाइक संक्रमण मानचित्र में वर्तमान राज्यों की प्रत्येक पंक्ति पर, सीमित संख्या में कॉलम मान्य संख्याएं होंगी।

आप आदानों कि यह इनपुट मेज से पढ़ता है, यह सुनिश्चित करने के अप्रयुक्त संक्रमण आईडी एक वर्तमान स्थिति पर कोई प्रभाव नहीं के सभी 4320 पंक्तियों अपरोक्ष चक्र को नियमित करना चाहेंगे। आप परीक्षण करना चाहते हैं कि सभी प्रभावशाली संक्रमण आईडी मान्य संक्रमण हैं।

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

संक्रमण पथ चक्रीय या अपरिवर्तनीय या पथ के साथ चक्रीय और अपरिवर्तनीय वर्गों का संयोजन हो सकता है।

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

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

सौभाग्य से, एफएसएम प्रभावी संक्रमणों के स्पैर मैट्रिस हैं क्योंकि संपूर्ण परीक्षण संभावित राज्यों के संक्रमण आईडी आईडी संख्या के पूर्ण संयोजन का उपभोग नहीं करेगा। हालांकि, कठिनाई होती है यदि आप विरासत एफएसएम से निपट रहे हैं जहां दृश्य या तापमान राज्यों को परीक्षण प्रणाली में वापस नहीं खिलाया जा सकता है, जहां आपको प्रत्येक राज्य को नजरअंदाज करना है। वह बदसूरत होगा, लेकिन फिर भी हमने दो हफ्तों तक अतिरिक्त रूप से प्रभावशाली संक्रमणों के माध्यम से दृष्टि से उपकरणों का परीक्षण किया।

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

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

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

परिमित राज्य मशीन नियंत्रक की जावा सूची के लिए http://code.google.com/p/synthfuljava/source/browse/#svn/trunk/xml/org/synthful। टेस्ट दिनचर्या शामिल नहीं है।

1

आप Model Based Testing की जांच करने पर विचार कर सकते हैं। इस तरह की स्थितियों में परीक्षण पीढ़ी के साथ मदद करने के लिए कुछ उपकरण उपलब्ध हैं। मैं आमतौर पर MBT की सलाह देते हैं।

3

सभी जोड़ी परीक्षण

संयोजनों की राशि का परीक्षण करने और उचित आश्वासन दिया आप सबसे महत्वपूर्ण संयोजन शामिल किए गए होने के लिए रोके करने के लिए, आप एक बार देख सब-जोड़ी परीक्षण लेना चाहिए।

सभी जोड़े परीक्षण के पीछे तर्क यह है: एक कार्यक्रम में सबसे सरल कीड़े आम तौर पर एक एकल इनपुट पैरामीटर द्वारा ट्रिगर कर रहे। कीड़े के अगले सरलतम श्रेणी उन मापदंडों के जोड़ों के बीच बातचीत पर निर्भर है, जो , सभी जोड़े के साथ पकड़ा जा सकता है testing.1 तीन या अधिक मापदंडों के बीच संबंधों को शामिल बग्स उत्तरोत्तर कम common2 हैं पर whilst के होते हैं एक ही समय में प्रगतिशील महंगा परीक्षण द्वारा महंगा पाया जा रहा है, जो इसकी संभावित सभी संभावित इनपुट के संपूर्ण परीक्षण के रूप में है।

इसके अलावा अतिरिक्त जानकारी और उपकरण के रूप में दोनों सब-जोड़ी & pict के लिंक के लिए a previous answer here (बेशर्म प्लग) पर एक नज़र डालें।

उदाहरण Pict मॉडल फ़ाइल

को देखते हुए मॉडल 93 testcases उत्पन्न करता है, इनपुट पैरामीटर के सभी जोड़े को कवर।

# 
# This is a PICT model for testing a complex state machine at work 
# 

CurrentState :0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 
Source  :1,2 
Request  :True, False 
Type   :True, False 
Status  :State1, State2, State3 
Handling  :State1, State2, State3 
Completed  :True,False 

# 
# One can add constraints to the model to exclude impossible 
# combinations if needed. 
# 
# For example: 
# IF [Completed]="True" THEN CurrentState>15; 
# 

# 
# This is the PICT output of "pict ComplexStateMachine.pict /s /r1" 
# 
# Combinations: 515 
# Generated tests: 93 
संबंधित मुद्दे

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