2010-01-14 12 views
10

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

[TestFixture] 
public class GridControllerTests 
{ 
    protected readonly string RequestedViewId = "A1"; 

    protected GridViewModel Result { get; set;} 

    [TestFixtureSetUp] 
    public void Get_UsingStaticSettings_Assign() 
    { 
     var dataRepository = new XmlRepository("test.xml"); 

     var settingsRepository = new StaticViewSettingsRepository(); 

     var controller = new GridController(dataRepository, settingsRepository); 

     this.Result = controller.Get(RequestedViewId); 

    } 

    [Test] 
    public void Get_UsingStaticSettings_NotNull() 
    { 
     Assert.That(this.Result,Is.Not.Null); 
    } 

    [Test] 
    public void Get_UsingStaticSettings_HasData() 
    { 
     Assert.That(this.Result.Data,Is.Not.Null); 
     Assert.That(this.Result.Data.Count,Is.GreaterThan(0)); 
    } 

    [Test] 
    public void Get_UsingStaticSettings_IdMatches() 
    { 
     Assert.That(this.Result.State.ViewId,Is.EqualTo(RequestedViewId)); 
    } 

    [Test] 
    public void Get_UsingStaticSettings_FirstTimePageIsOne() 
    { 
     Assert.That(this.Result.State.CurrentPage, Is.EqualTo(1)); 
    } 
} 

उत्तर

3

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

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

मुझे एक ही परीक्षण में एकाधिक आवेषण डालने में कोई समस्या नहीं है, जब तक वे एक ही चीज़ का परीक्षण करने में योगदान देते हैं (यानी वे "लॉजिकल एसेशन" का हिस्सा हैं)। इस मामले में, इसकी सामग्री पर किसी भी संख्या में आवेषण। Reesult.Data मेरे द्वारा ठीक होगा - वे सभी एक ही परिणाम मूल्य का निरीक्षण करेंगे। आपका Get_UsingStaticSettings_HasData यह बहुत स्पष्ट रूप से करता है। प्रत्येक assert पर एक अद्वितीय विफलता संदेश का उपयोग करना सबसे अच्छा है ताकि यह बताना आसान हो कि कौन सा जोर विफल हुआ।

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

सारांश में
*
* कार्रवाई के बाद परीक्षण प्रति एक कार्रवाई करते हैं, तो आप एक बात का परीक्षण करने की जरूरत के रूप में कई संबंधित दावा का उपयोग
* वहाँ परीक्षण समाप्त करें।

15

एक ही परीक्षण में कई दावे होने से Assertion Roulette हो सकता है, इसलिए यह कुछ है जिसे आपको हमेशा सावधान रहना चाहिए।

हालांकि, सम्मिलन रूले ज्यादातर समस्या है जब दावा असंबद्ध हैं। यदि वे अवधारणात्मक रूप से निकटता से संबंधित हैं, तो कई दावों को अक्सर एक लॉजिकल एसेशन के रूप में देखा जा सकता है।

कई मामलों में आप एक कस्टम प्रकार या विधि में ऐसे लॉजिकल एसेशन को स्पष्ट रूप से encapsulating द्वारा दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर सकते हैं।

[TestFixture] 
public class GridControllerTests 
{ 
    [TestCase, ForEachAssert] 
    public void Get_UsingStaticSettings_Assign() 
    { 
     var dataRepository = new XmlRepository("test.xml"); 
     var settingsRepository = new StaticViewSettingsRepository(); 
     var controller = new GridController(dataRepository, settingsRepository); 

     var result = controller.Get("A1"); 

     AssertOne.From(
     () => Assert.That(this.Result,Is.Not.Null), 
     () => Assert.That(this.Result.Data,Is.Not.Null), 
     () => Assert.That(this.Result.Data.Count,Is.GreaterThan(0)), 
     () => Assert.That(this.Result.State.ViewId,Is.EqualTo(RequestedViewId)), 
     () => Assert.That(this.Result.State.CurrentPage, Is.EqualTo(1))); 
    } 
} 

यह 5 अलग अलग परीक्षण मामलों, प्रत्येक ज़ोर के लिए बना दिया जाएगा: चल रहा है एक जोर प्रति टेस्ट के लिए एक NUnit ऐड -

+0

"लॉजिकल एसेशन" इसके लिए एक अच्छा शब्द है। यह दिलचस्प है कि एसेरशन रूले उदाहरण अनिवार्य रूप से "व्यवस्था-अधिनियम-कार्य न करने से गलत कैसे हो सकता है" का एक उदाहरण है। क्या अवधारणाएं अलग हैं? – Anthony

+0

@ एंथनी: अवधारणाएं अलग-अलग हैं, हालांकि वे निकट से संबंधित हैं। यदि आप एएए (या चार चरण परीक्षण xUnit टेस्ट पैटर्न के रूप में इसे कॉल करते हैं) का पालन करते हैं तो आप एसेरशन रूले के दर्द को महसूस करने की बहुत कम संभावना रखते हैं, लेकिन मैं अभी भी उसी आर्ट ब्लॉक में पूरी तरह से असंबंधित प्रविष्टियों के भिन्न होने के अलग-अलग होंगे। –

+3

सम्मिलन रूले का विचार एनर्ट में कम से कम कथन में टिप्पणी निर्दिष्ट करके कम किया जा सकता है। "Assert.That (condition)" का उपयोग करने के बजाय "Assert.That (condition, failessMessage)" जहां 'विफलता संदेश' आर्ट की जांच के बारे में जानकारी है। इससे आपको पता चल जाएगा कि यूनिट परीक्षण में कौन सा आश्वासन विफल रहा। – Pedro

2

आप Oapt उपयोग कर सकते हैं।

0

मैं अपने आप पर दावे डालता हूं अगर वे अपने आप मूल्यवान हैं। अगर मैं अपने आप ही एक अभिकथन चाहते हैं, मैं एक कस्टम दावा करते हैं:

AssertThatMyObjectMatches(field1, field2, field3, field4, myObject); 

कभी कभी, हालांकि, मैं एक परीक्षण में एक से अधिक उदाहरण के लिए पसंद करते हैं। मैं ऐसा करता हूं जब आधे व्यवहार के दूसरे आधा के बिना कोई मूल्य नहीं होता है।

Assert.True(list.IsEmpty()); 

list.Add(new Thing()); 
Assert.False(list.IsEmpty()); 

अन्य रूबी समुदाय समेत अन्य लोगों के बारे में अलग राय है।यह मुख्य रूप से, डेव Astels 'ब्लॉग पोस्ट के द्वारा संचालित है यहां:

http://www.artima.com/weblogs/viewpost.jsp?thread=35578

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

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

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