2009-01-28 6 views
5

मैं xUnit.NET ढांचे का एक बड़ा प्रशंसक हूं; मुझे यह हल्का, सरल, साफ और एक्स्टेंसिबल लगता है।कक्षा को संसाधित करते समय कस्टम कोड का उपयोग करने और परीक्षण विधियों का पता लगाने के लिए xUnit.NET बढ़ाएं

अब मान लीजिए कि मैं बहुत की तरह एक वर्ग है कि करते हैं:

public class AdditionSpecification 
{ 
    static int result; 

    public void Because() 
    { 
    result = 2 + 2; 
    } 

    public void Result_is_non_zero() 
    { 
    Assert.True(result <> 0); 
    } 

    public void Result_is_correct() 
    { 
    Assert.Equal(4, result); 
    } 
} 
परीक्षण वर्ग के साथ

ऊपर मैं xUnit.NET 2 परीक्षण मामलों को देखने के लिए और उनमें से प्रत्येक से पहले क्योंकि() विधि चलाना चाहते हैं।

मैं XUnit बता सकते हैं कैसे:

किसी भी समस्या मेरी कक्षा या विधि के नाम के साथ हो सकता है एक तरफ छोड़कर, इस परीक्षण/विनिर्देश, xUnit.NET ढांचे, या BDD की संरचना, यहाँ मेरे सवाल है। नेट जो मैं अनुकूलित करना चाहता हूं कि यह प्रत्येक लक्ष्य परीक्षण विधि पर एक कस्टम [तथ्य] जैसी विशेषता का उपयोग करके इस वर्ग के बिना के परीक्षण विधियों को कैसे पहचानता है और निष्पादित करता है?

मुझे पता है कि मैं पहले से पहले निष्पादन के बाद और बाद में कस्टम के साथ प्रत्येक परीक्षण विधि को सजाने के लिए पहलेAfterAttribute से प्राप्त कर सकता हूं। कक्षा स्तर पर मैं यह कैसे कर सकता हूं? क्या मुझे एक कस्टम धावक लिखना है?

उत्तर

9

तो यह पता चला है कि मैं ITestClassCommand.EnumerateTestMethods() विधि की तलाश में था।

  1. डिफ़ॉल्ट xUnit.NET परीक्षण धावक अपने परीक्षण विधानसभा में सभी वर्गों से अधिक पुनरावृति होगी।
  2. प्रत्येक के लिए यह RunWithAttribute की जांच करेगा; ITestClassCommand कार्यान्वयन का ओवरराइड करने का आपका मौका है जिसका प्रयोग विधियों को पहचानने के लिए किया जाता है। (RunWithNUnit एक अच्छा उदाहरण है)
  3. ITestClassCommand.EnumerateTestMethods() को टेस्ट क्लास को संसाधित करने और परीक्षण विधियों के एक आईनेमरेबल को वापस करने के लिए कहा जाता है।
  4. प्रत्येक परीक्षा IMethodInfo तो ITestClassCommand.EnumerateTestCommands (IMethodInfo testMethod) को पारित कर दिया है ITestCommands
  5. प्रत्येक ITestCommand तो मार डाला और एक परिणाम के वापस जाने के लिए अवसर दिया है IEnumerable मिलता है।

ऊपर मेरी उदाहरण के मामले में, मैं की तरह कुछ की आवश्यकता होगी:

[RunWithMyTestClassCommand] 
public class AdditionSpecification 
{ 
    static int result; 

    public void Because() 
    { 
    result = 2 + 2; 
    } 

    public void Result_is_non_zero() 
    { 
    Assert.True(result <> 0); 
    } 

    public void Result_is_correct() 
    { 
    Assert.Equal(4, result); 
    } 
} 

अंत में, MyTestClassCommand में, मैं मिलता है:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class RunWithMyTestClassCommandAttribute : RunWithAttribute 
{ 
    public RunWithMyTestClassCommandAttribute() 
       : base(typeof(MyTestClassCommand)) {} 
} 

तो मैं के साथ मेरी ऊपर के उदाहरण को सजाने सकता है जो भी तर्क मैं ढूंढना चाहता हूं उसका उपयोग करने के लिए EnumerateTestMethods() और EnumerateTestCommands (IMethodInfo testMethod) के बीच अवसर के लिए और व्यक्तिगत परीक्षण के रूप में निष्पादित ITestCommand उदाहरणों का निर्माण करने के लिए।

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

मैं codeplex पर XUnit परियोजना के लिए this issue प्रस्तुत की है और यह corrected on May 30th, 2009 xUnit.NET 1.5 के लिए CTP 2 था

9

xUnit.net का IUseFixture आपको प्रति स्थिरता सेटअप करने की अनुमति देता है। (SetFixture को लागू करने की आवश्यकता के साथ)

public class AdditionFixture : IDisposable 
{ 
    public int Because() 
    { 
    return 2 + 2; 
    } 

    public void Dispose() 
    { 
    //test tear down code 
    }  
} 

आपका परीक्षण वर्ग तो यह लागू कर सकते हैं: हो सकता है कि अपनी खुद की स्थिरता वर्ग को परिभाषित कर सकता है

public class AdditionSpecification : IUseFixture<AdditionFixture> 
{ 
    int result; 

    public void SetFixture(AdditionFixture Fixture) 
    { 
    result = Fixture.Because(); 
    } 

    [Fact] 
    public void Result_is_non_zero() 
    { 
    Assert.True(result <> 0); 
    } 

    [Fact] 
    public void Result_is_correct() 
    { 
    Assert.Equal(4, result); 
    } 
} 

XUnit धावक अपनी स्थिरता का एक उदाहरण पैदा करेगा, और प्रत्येक परीक्षण चलाने से पहले इसे सेटफिक्चर में पास करें। अपने सभी परीक्षणों को चलाने के बाद, धावक तब स्थिरता का निपटान करेगा यदि यह IDISposable लागू करता है। मुझे आशा है कि वह मदद करेंगे!

कोडप्लेक्स पर xUnit विकी में अधिक जानकारी है, जिसमें परीक्षण फिक्स्चर के लिए डेटाबेस कनेक्शन प्रबंधित करने के लिए IUseFixture को कार्यान्वित करने का एक अच्छा उदाहरण शामिल है।

+1

तुम्हारी मदद करने की कोशिश कर के लिए धन्यवाद, लेकिन इस प्रतिक्रिया सवाल है कि मैंने पूछा उत्तर नहीं मिलता है; मैं xUnit.NET को कैसे बता सकता हूं कि मैं कौन सा तरीकों को [फैक्ट] विशेषता का उपयोग किए बिना कुछ सम्मेलन के आधार पर निष्पादित करना चाहता हूं। –

+0

मैंने जो समाधान प्रस्तावित किया है, वह प्रत्येक परीक्षण चलाने से पहले निष्पादित()) होने का प्रभाव प्राप्त करता है। मुझे एहसास है कि मैं अभी भी इसे प्राप्त करने के लिए [तथ्य] विशेषता का उपयोग कर रहा हूं। क्या मैं पूछ सकता हूं कि आप [तथ्य] का उपयोग क्यों नहीं करना चाहते हैं? – BenA

+0

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

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