xUnit

2012-02-09 12 views
12

में परीक्षण केस अनुक्रम कैसे सेट करें मैंने सी # में xUnit परीक्षण केस लिखे हैं। उस टेस्ट क्लास में कई विधियां हैं। मुझे पूरे परीक्षण मामलों को अनुक्रम में चलाने की जरूरत है। मैं xUnit में टेस्ट केस अनुक्रम कैसे सेट कर सकता हूं?xUnit

+5

आप जिस क्रम में परीक्षण क्रियान्वित कर रहे हैं के बारे में क्यों महत्वपूर्ण है? परीक्षणों के लिए आम तौर पर एक दूसरे पर निर्भर रहने के लिए यह एक बुरा विचार है - वे एक-दूसरे से स्वतंत्र होना चाहिए। –

+7

हालांकि यह यूनिट परीक्षणों के लिए वास्तव में सच है जो एकीकरण परीक्षणों का मामला नहीं है। –

उत्तर

0

आप डिज़ाइन द्वारा नहीं कर सकते हैं। यह किसी भी व्यक्ति को इच्छा या दुर्घटना से प्राप्त करने से रोकने के लिए जानबूझकर यादृच्छिक है।

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

यदि आप फिक्स्चर या संदर्भ के निर्माण को प्रबंधित करने का प्रयास कर रहे हैं, तो अंतर्निहित IUseFixture<T> तंत्र उचित हो सकता है। उदाहरण के लिए xUnit Cheat Sheet देखें।

लेकिन आपको वास्तव में हमें जो कुछ करने की कोशिश कर रहा है उसके बारे में हमें बताने की आवश्यकता है या हमें केवल सट्टा प्राप्त करना होगा।

14

टेस्टप्रोरिटी: this पृष्ठ के नीचे।

[PrioritizedFixture] 
public class MyTests 
{ 
    [Fact, TestPriority(1)] 
    public void FirstTest() 
    { 
     // Test code here is always run first 
    } 
    [Fact, TestPriority(2)] 
    public void SeccondTest() 
    { 
     // Test code here is run second 
    } 
} 

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

+0

बिल्कुल जवाब जो मैंने दिया होगा। ;) – bricelam

+0

दरअसल, अब मैं आपकी टिप्पणी देखता हूं .. मुझे याद है। :) TestPriorority केवल प्रति मॉड्यूल/कक्षा के आधार पर काम करता है। तो यादृच्छिक क्रम में अभी भी विभिन्न वर्गों को निष्पादित किया जाता है। (सी # कंपाइलर असेंबली में गैर-संभावित क्रम में कक्षाओं को एम्बेड करता है।) परीक्षण अनुक्रम (परीक्षकों के पास एक परीक्षण प्रोटोकॉल है) को आसान और दोहराने योग्य बनाने के लिए, मैंने वर्णानुक्रम सॉर्टिंग जोड़ा। इसलिए मैंने xunit 1.9 का एक संशोधित संस्करण बनाया जो वर्णमाला क्रम में परीक्षण कक्षाओं को निष्पादित करता है। Http://www.andreas-reiff.de/2012/06/xunit-with-alphabetically-sorted-classes-and-proper-display-list-matching-execution-order/ पर एक नज़र डालें। –

+0

@ ब्रिकेलम, वह लिंक टूटा हुआ लगता है, यह कुछ रीडायरेक्ट लूप में जाता है। –

12

xUnit 2. में यह ऑर्डरिंग रणनीति को नामित करने के लिए TestCaseOrderer विशेषता का उपयोग करके हासिल किया जा सकता है, जिसका उपयोग ऑर्डर को दर्शाने के लिए प्रत्येक परीक्षण पर एनोटेटेड विशेषता को संदर्भित करने के लिए किया जा सकता है।

उदाहरण के लिए:

रणनीति

public class PriorityOrderer : ITestCaseOrderer 
{ 
    public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase 
    { 
     var sortedMethods = new SortedDictionary<int, List<TTestCase>>(); 

     foreach (TTestCase testCase in testCases) 
     { 
      int priority = 0; 

      foreach (IAttributeInfo attr in testCase.TestMethod.Method.GetCustomAttributes((typeof(TestPriorityAttribute).AssemblyQualifiedName))) 
       priority = attr.GetNamedArgument<int>("Priority"); 

      GetOrCreate(sortedMethods, priority).Add(testCase); 
     } 

     foreach (var list in sortedMethods.Keys.Select(priority => sortedMethods[priority])) 
     { 
      list.Sort((x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.TestMethod.Method.Name, y.TestMethod.Method.Name)); 
      foreach (TTestCase testCase in list) 
       yield return testCase; 
     } 
    } 

    static TValue GetOrCreate<TKey, TValue>(IDictionary<TKey, TValue> dictionary, TKey key) where TValue : new() 
    { 
     TValue result; 

     if (dictionary.TryGetValue(key, out result)) return result; 

     result = new TValue(); 
     dictionary[key] = result; 

     return result; 
    } 
} 

आदेश गुण

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class TestPriorityAttribute : Attribute 
{ 
    public TestPriorityAttribute(int priority) 
    { 
     Priority = priority; 
    } 

    public int Priority { get; private set; } 
} 

परीक्षण मामलों

[TestCaseOrderer("FullNameOfOrderStrategyHere", "OrderStrategyAssemblyName")] 
public class PriorityOrderExamples 
{ 
    [Fact, TestPriority(5)] 
    public void Test3() 
    { 
     //called third 
    } 

    [Fact, TestPriority(0)] 
    public void Test2() 
    { 
     //called second 
    } 

    [Fact, TestPriority(-5)] 
    public void Test1() 
    { 
     // called first 
    } 

} 

XUnit 2. * आदेश नमूने here

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