2015-09-21 6 views
6

मुझे एक परीक्षण (सिद्धांत) मिला है जो धीमा है और इसके लिए परीक्षण मामलों का एक गुच्छा है। तो मैं उन्हें एक साथ चलाने के लिए चाहता हूँ।सिद्धांत को समानांतर चलाने के लिए xUnit कैसे बनाएं?

"\packages\xunit.runner.console.2.0.0\tools\xunit.console" "\Projects\xUnitTest\xUnitTest\bin\Debug\xUnitTest.dll" -parallel all > xUnitResult.txt 

और परिणाम:

xUnit.net console test runner(64-bit.NET 4.0.30319.42000) 
Copyright(C) 2015 Outercurve Foundation. 

Discovering: xUnitTest 
Discovered: xUnitTest 
Starting: xUnitTest 
21:55:39.0449 - Starting 2 - Sleeping 2000 
21:55:41.0627 - Finished 2 - Sleeping 2000 
21:55:41.0783 - Starting 1 - Sleeping 5000 
21:55:46.0892 - Finished 1 - Sleeping 5000 
21:55:46.0892 - Starting 3 - Sleeping 4000 
21:55:50.0989 - Finished 3 - Sleeping 4000 
Finished: xUnitTest 

=== TEST EXECUTION SUMMARY === 
    xUnitTest Total: 3, Errors: 0, Failed: 0, Skipped: 0, Time: 11,137s 

कौन सा सुंदर धारावाहिक है

[Theory] 
[MyTestData] 
public void MyTheory(int num, int sleep) 
{ 
    Console.WriteLine("{0:HH:mm:ss.ffff} - Starting {1} - Sleeping {2}", DateTime.Now, num, sleep); 
    Thread.Sleep(sleep); 
    Console.WriteLine("{0:HH:mm:ss.ffff} - Finished {1} - Sleeping {2}", DateTime.Now, num, sleep); 
} 

[AttributeUsage(AttributeTargets.Method)] 
public class MyTestDataAttribute : DataAttribute 
{ 
    public override IEnumerable<object[]> GetData(MethodInfo testMethod) 
    { 
     yield return new object[2] { 1, 5000 }; 
     yield return new object[2] { 2, 2000 }; 
     yield return new object[2] { 3, 4000 }; 
    } 
} 

कमांड लाइन परीक्षण चलाने के लिए:

मैं एक साधारण उदाहरण बना लिया है। मुझे यकीन है कि इसे समानांतर बनाना संभव है।

+6

https://xunit.github.io/docs/running-tests-in-parallel.html –

+1

बीटीडब्ल्यू, '[सदस्यदाटा (नाम (MyTestData))]' मेरी राय में कस्टम विशेषता बनाने से क्लीनर है। –

उत्तर

5

यह वर्तमान में xUnit 2.1 के रूप में संभव नहीं है। parallelization docs के अनुसार,

डिफ़ॉल्ट रूप से, प्रत्येक टेस्ट क्लास एक अद्वितीय परीक्षण संग्रह है। एक ही टेस्ट क्लास के भीतर टेस्ट एक दूसरे के खिलाफ समानांतर में नहीं चलेंगे।

क्या डॉक्स स्पष्ट रूप से स्पष्ट नहीं कर सकता है:

  • XUnit में सबसे छोटी "में चलाने योग्य" इकाई एक संग्रह
  • वहाँ एक ही कक्षा में परीक्षण अलग में होने के लिए कोई रास्ता नहीं है है संग्रह

विस्तार से, समांतर सिद्धांतों को असंभव करना है क्योंकि सिद्धांतों को कई कक्षाओं में विभाजित नहीं किया जा सकता है।

  • परीक्षण के अंतर्गत अपने कोड refactor ताकि जो कुछ दूर निकाला है इतना समय ले जा रहा है:


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

  • यदि आपके पास पर्याप्त परीक्षण मामले हैं, तो प्रति टेस्ट केस में एक नया वर्ग बनाएं और के बजाय Fact का उपयोग करें। आप उन्हें एक ही फाइल में भी डाल सकते हैं। यह अधिक verbose है, और आप सिद्धांतों का उपयोग करने के "शांत" कारक खो देते हैं, लेकिन आप समानांतर निष्पादन प्राप्त करेंगे।

3

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

public abstract class ParellelTheoryBase 
{ 
    public static List<int> testValues = new List<int> {1, 2, 3, 4, 5, 6}; 
} 

public class ParallelTheory_1of2 : ParellelTheoryBase 
{ 
    public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 0).Select(data => new object[] { data }).ToList(); 

    [Theory] 
    [MemberData(nameof(theoryData))] 
    public void DoSomeLongRunningAddition(int data) 
    { 
     Assert.True(data < 7); 
     Thread.Sleep(5000); 
    } 
} 

public class ParallelTheory_2of2 : ParellelTheoryBase 
{ 
    public static List<object[]> theoryData = testValues.Where((data, index) => index % 2 == 1).Select(data => new object[] { data }).ToList(); 

    [Theory] 
    [MemberData(nameof(theoryData))] 
    public void DoSomeLongRunningAddition(int data) 
    { 
     Assert.True(data < 7); 
     Thread.Sleep(5000); 
    } 
} 

इस उदाहरण में, मैं ParellelTheoryBase में संपत्ति है, जो वास्तविक परीक्षा वर्गों के लिए एक आधार वर्ग है परिभाषित किया है। फिर, ParallelTheory_1of2 और ParallelTheory_2of2 उस कक्षा से testValues तक पहुंच प्राप्त करने के लिए उत्तराधिकारी है।अब, Theory परीक्षण निष्पादन के लिए इस theoryData का उपयोग करता है, और यह सूची से डेटा केवल अजीब या यहां तक ​​कि (index % 2 == 1 या index % 2 == 0) का चयन करता है।

यह हो जाता है दृश्य स्टूडियो परीक्षण एक्सप्लोरर में उठाया: Visual Studio test explorer

और समानांतर में चलता है:

[xUnit.net 00:00:00.3397963] Starting 
[xUnit.net 00:00:15.5696617] Finished 

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

आपके उदाहरण में, मुझे लगता है कि आप आसानी से MyTestData विशेषता totalCountParallels और currentIndex के मानकों को स्वीकार करने के लिए आसानी से संशोधित कर सकते हैं।

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