2012-05-17 9 views
7

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

मैंने सुविधाओं पर पूंजीकरण करने और NUnit 2.6 थ्योरी सुविधा के भीतर सीमाओं के अनुरूप इस तरह से अपनी स्थिरता लिखी। विशेष रूप से, मुझे लगा कि मुझे उस सुविधा के आसपास काम करने के लिए घंटे और मिनट जैसी कक्षाएं बनाना था, जो डेटापॉइंट्स सटीक प्रकार से तर्कों से मेल खाते हैं।

[TestFixture] 
public class TimeWindowParserTheoryFixture 
{ 
    public class Hour 
    { 
     public int Value; 
    } 

    public class Minute 
    { 
     public int Value; 
     public string AsString { get { return Value.ToString("00"); } } 
    } 

    [Datapoints] 
    public IEnumerable<Hour> Hours 
    { 
     get 
     { 
      return Enumerable 
       .Range(0, 25) 
       .Select(v => new Hour() { Value = v }) 
       .Union(Enumerable.Repeat((Hour)null, 1)); 
     } 
    } 

    [Datapoints] 
    public IEnumerable<Minute> Minutes 
    { 
     get 
     { 
      return Enumerable 
       .Range(0, 60) 
       .Select(v => new Minute() { Value = v }) 
       .Union(Enumerable.Repeat((Minute)null, 1)); 
     } 
    } 

    [Datapoints] 
    public IEnumerable<string> Separators 
    { 
     get { return new[] { " ", "-" }; } 
    } 

    [Theory] 
    public void ValidHours(Hour startHour, 
     Minute startMinute, 
     Hour endHour, 
     Minute endMinute, 
     string separator) 
    { 
     Assume.That(startHour != null); 
     Assume.That(endHour != null); 

     var parser = new TimeWindowParser(); 
     var startMinutesString = String.Format("{0}{1}", startMinute == null ? "" : ":", startMinute == null ? "" : startMinute.AsString); 
     var endMinutesString = String.Format("{0}{1}", endMinute == null ? "" : ":", endMinute == null ? "" : endMinute.AsString); 
     var pattern = String.Format("{0}{1}{2}{3}{4}{5}{6}", startHour, startMinutesString, "", separator, endHour, endMinutesString, ""); 
     //Console.WriteLine(pattern); 
     var result = parser.Parse(pattern); 
     Assert.That(result, Is.Not.Null); 
     Assert.That(result.Start, Is.EqualTo(startHour)); 
     Assert.That(result.End, Is.EqualTo(endHour)); 
    } 
} 

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

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount) 
at System.Text.StringBuilder.Append(Char* value, Int32 valueCount) 
at System.Text.StringBuilder.AppendHelper(String value) 
at System.Text.StringBuilder.Append(String value) 
at NUnit.Core.MethodHelper.GetDisplayName(MethodInfo method, Object[] arglist) 
at NUnit.Core.Builders.NUnitTestCaseBuilder.BuildSingleTestMethod(MethodInfo method, Test parentSuite, ParameterSet parms) 

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

उत्तर

10

आपका प्रश्न सिद्धांतों का उपयोग करने के यांत्रिकी के बारे में है, लेकिन मैं पहले "सिद्धांतों के सिद्धांत" के बारे में बात करना चाहता हूं, तो मैं कार्यान्वयन विवरण पर वापस आऊंगा। सिद्धांतों

आप केवल एक सिद्धांत का उपयोग करना चाहिए अगर आप एक सिद्धांत के साथ बाहर शुरू कर दिया है की

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

अपने परीक्षण को देखते हुए, मैं यह नहीं समझ सकता कि आपका सिद्धांत कौन सा सिद्धांत साबित करने की कोशिश कर रहा है यह एक मानक पैरामीटर परीक्षण की तरह लगता है, आप अपवाद के साथ डेटापॉइंट्स का उपयोग कर रहे हैं। केवल एक ही धारणा है जिसे आपको बनाने की आवश्यकता है कि minuts शून्य नहीं हैं, जो कि आप पहली बार मिनट प्रदान करते हैं।

निष्कर्ष: किसी भी मुझे नहीं लगता कि इस सिद्धांत का अच्छा उपयोग है

यांत्रिकी

। आप 24 * 24 * 60 * 60 * 2 डेटा पॉइंट्स उत्पन्न कर रहे हैं। यह बहुत सारे डेटा का एक बिल्ली है। क्या आपके पास यह मानने का कोई कारण है कि आपका पार्सिंग एल्गोरिदम काम कर सकता है - कहें - 24:13 लेकिन 24:14 के लिए विफल?

यह सच है कि डेटापॉइंट्स को संयोजक रूप से उपयोग किया जाता है और यदि वे जोड़ी का उपयोग किया जाता है तो यह बेहतर हो सकता है। लेकिन याद रखें कि डेटापॉइंट्स थ्योरी में डेटा फेंकने के कई तरीकों में से एक हैं। विचार यह है कि सिद्धांतों को जो भी डेटा आप उन्हें देते हैं उन्हें संभालना चाहिए।

वैकल्पिक

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

चार्ली

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