मैं समानांतर में NUnit परीक्षण कैसे चला सकता हूं?


83

मुझे NUnit का उपयोग करके लिखा गया एक बड़ा स्वीकृति परीक्षण (~ 10 सेकंड प्रति परीक्षण) टेस्ट सूट मिला है। मैं इस तथ्य का उपयोग करना चाहूंगा कि मेरी मशीनें सभी मल्टीपल कोर बॉक्स हैं। आदर्श रूप में, मैं एक परीक्षण प्रति कोर, अन्य परीक्षणों के स्वतंत्र रूप से चलाने में सक्षम होगा।

वहाँ PNUnit है, लेकिन यह तुल्यकालन मुद्दों और इस तरह की चीजों को फैलाने के लिए परीक्षण के लिए डिज़ाइन किया गया है, और मैंने इसे पूरा करने का एक स्पष्ट तरीका नहीं देखा।

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


यहां तक ​​कि मैं इस बारे में और जानना चाहूंगा। @ बिली ओनली कृपया एक उत्तर दें अगर आपको एक मिल जाए।
PK

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

@ मैटियास: हां, परीक्षण सीपीयू गहन हैं।
बिली ओलेल

जवाबों:


52

यदि आप समानांतर में NUnit परीक्षण चलाना चाहते हैं, तो कम से कम 2 विकल्प हैं:

  • NCrunch इसे बॉक्स से बाहर प्रदान करता है (बिना कुछ बदले, लेकिन एक व्यावसायिक उत्पाद है)
  • NUnit 3 एक समानांतर विशेषता प्रदान करता है , जिसका उपयोग यह बताने के लिए किया जा सकता है कि समानांतर में कौन से परीक्षण चलाए जा सकते हैं

यह उत्तर गलत दिया गया लगता है कि यह प्रश्न सही उत्तर से अधिक अच्छा सुझाव है। मेरे दिमाग में NCrunch को आपके उत्थान की आवश्यकता है और शीर्ष उत्तर होना चाहिए क्योंकि यह (NUnit) परीक्षण समान या कई प्रक्रियाओं के भीतर और एक या कई मशीनों में चल सकता है और VS या बिल्ड सर्वर से ऐसा करेगा।
चिल्लीटॉम

2
@chillitom NCrunch को इस सवाल का जवाब दिए जाने के बाद जारी किया गया था, और यह एक अच्छा विकल्प है (क्योंकि यह सिर्फ बॉक्स से बाहर काम करना चाहिए, हालांकि यह कुछ के लिए बहुत महंगा है)। भविष्य में अन्य विकल्पों में NUnit 3 शामिल हो सकता है, जो परीक्षण के समानांतर चलने की पेशकश कर सकता है ( github.com/nunit/dev/wiki/Roadmap के अनुसार )।
डेविड_001

3
यद्यपि यह शीर्ष उत्तर है, यह अब उतना सही नहीं है जितना एक बार था। नुनिट 3.0 को 2015 के टेल एंड में जारी किया गया था जिसमें अब एक समानांतर विशेषता है। Ref: github.com/nunit/nunit/wiki/Parallelizable-Attribute
pb

36

NUnit संस्करण 3 समानांतर में चल रहे परीक्षणों का समर्थन करेगा:

एक वर्ग के लिए विशेषता जोड़ना: [Parallelizable(ParallelScope.Self)]समानांतर में अपने परीक्षण चलाएगा।

• ParallelScope.None इंगित करता है कि परीक्षण अन्य परीक्षणों के समानांतर नहीं चलाया जा सकता है।

• ParallelScope.Self इंगित करता है कि परीक्षण अन्य परीक्षणों के साथ समानांतर में चलाया जा सकता है।

• ParallelScope.Children इंगित करता है कि परीक्षण के वंशजों को एक दूसरे के संबंध में समानांतर में चलाया जा सकता है।

• ParallelScope.Fixtures इंगित करता है कि जुड़नार एक दूसरे के समानांतर चल सकते हैं।

NUnit फ्रेमवर्क-समानांतर-परीक्षण-निष्पादन


10

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

8 कोर के साथ चलने के लिए: c:\proj> msbuild /m:8 RunTests.xml

RunTests.xml

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="RunTestsInParallel" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <Nunit Condition=" '$(Nunit)' == '' ">$(MSBuildProjectDirectory)\..\tools\nunit-console-x86.exe</Nunit>
  </PropertyGroup>

  <!-- see http://mikefourie.wordpress.com/2010/12/04/running-targets-in-parallel-in-msbuild/ -->

  <Target Name="RunTestsInParallel">
    <ItemGroup> 
      <TestDlls Include="..\bin\Tests\$(Configuration)\*.Tests.dll" />
    </ItemGroup>

    <ItemGroup> 
      <TempProjects Include="$(MSBuildProjectFile)" > 
        <Properties>TestDllFile=%(TestDlls.FullPath)</Properties> 
      </TempProjects> 
    </ItemGroup> 

    <MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="RunOneTestDll" /> 
  </Target>

  <Target Name="RunOneTestDll"> 
    <Message Text="$(TestDllFile)" />
    <Exec Command="$(Nunit) /exclude=Integration $(TestDllFile)  /labels /xml:$(TestDllFile).results.xml"
      WorkingDirectory="$(MSBuildProjectDirectory)\..\bin\Tests\$(Configuration)" /> 
  </Target>

</Project>

अपडेट अगर मैं इस सवाल का जवाब दे रहा था तो मैं अधिकतम टेस्ट रन प्रदर्शन के लिए NCrunch और उसके कमांड लाइन टेस्ट रनिंग टूल की अत्यधिक अनुशंसा करूंगा । इसमें ऐसा कुछ नहीं है और यह एक ही समय में आपके कोड-टेस्ट-डीबग चक्र में क्रांति लाएगा।


1
इससे मुझे यूनिट परीक्षणों को 3 मिनट से 2 मिनट तक कम करने में मदद मिली। मैंने 2-कोर सीपीयू पर परीक्षण किया है।
दिमित्रि लोबानोव

4

में इस लेख यह है कि आदेश परीक्षण तेजी लाने के लिए में पोस्टर आदेश मापदंडों को निर्दिष्ट जो परीक्षण प्रत्येक उदाहरण चलाना चाहिए साथ NUnit के कई उदाहरण चलाता उल्लेख किया है।

एफटीए:

मैं एक अजीब समस्या में भाग गया।

हम अपने निरंतर एकीकरण सर्वर पर परीक्षण चलाने के लिए ननिट-कंसोल का उपयोग करते हैं। हाल ही में हम Nunit 2.4.8 से 2.5.5 और .Net 3.5 से 4.0 तक बढ़ रहे थे। परीक्षण निष्पादन को गति देने के लिए हम विभिन्न कमांड लाइन तर्कों के साथ नुनिट के कई उदाहरण चलाते हैं

  • हमारे पास हमारी परीक्षा असेंबली की दो प्रतियां हैं और फ़ोल्डर ए और बी में ननिट बायनेरिज़ हैं।
  • फ़ोल्डर ए में हम निष्पादित करते हैं

nunit-कंसोल-x86.exe Model.dll Test.dll / बहिष्कृत: MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

  • फ़ोल्डर B में हम निष्पादित करते हैं

nunit-कंसोल-x86.exe Model.dll Test.dll / में शामिल हैं: MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

यदि हम आदेशों को क्रम से निष्पादित करते हैं तो दोनों सफलतापूर्वक चलते हैं। लेकिन अगर हम उन्हें समानांतर में निष्पादित करते हैं तो केवल एक ही सफल होता है। जहाँ तक मैं बता सकता हूँ कि यह वही है जो पहले परीक्षण फिक्स्चर को लोड करता है। दूसरा "स्थिरता का पता लगाने में असमर्थ" संदेश के साथ विफल रहता है।

क्या यह समस्या पहले से ही ज्ञात है? मुझे लॉन्चपैड पर बग सूची में संबंधित कुछ भी नहीं मिला। BTW हमारा सर्वर विंडोज सर्वर 2008 64-बिट चलाता है। मैं भी विंडोज 7 64-बिट पर समस्या को पुन: उत्पन्न कर सकता था।

मान लें कि यह बग ठीक हो गया है या आप उल्लेखित सॉफ़्टवेयर का नया संस्करण नहीं चला रहे हैं, तो आपको उनकी तकनीक को दोहराने में सक्षम होना चाहिए।

अपडेट करें

टीमसिटी एक उपकरण की तरह दिखता है जिसका उपयोग आप स्वचालित रूप से NUnit परीक्षण चलाने के लिए कर सकते हैं। उनके यहाँ एक NUnit लांचर की चर्चा है जिसका उपयोग कई NUnit इंस्टेंसेस लॉन्च करने के लिए किया जा सकता है। यहाँ एक ब्लॉग पोस्ट है जिसमें एकाधिक NUnit XML परिणामों के एकल परिणाम फाइल में विलय की चर्चा है।

तो सैद्धांतिक रूप से आप टीमकैट को स्वचालित रूप से कई NUnit परीक्षण लॉन्च कर सकते हैं, जिसके आधार पर आप कार्यभार को विभाजित करना चाहते हैं और फिर पोस्ट टेस्ट प्रोसेसिंग के लिए परिणामों को एक फाइल में मर्ज कर सकते हैं।

क्या यह आपकी आवश्यकताओं के लिए पर्याप्त स्वचालित है?


यह वही विचार है जो पहले से ही श्रेणियों के बारे में पोस्ट किया गया है ... मैं यहां के उदाहरणों के बीच यथोचित समान रनटाइम बनाए रखना नहीं चाहता। इससे पहले कि मैं ऐसा करता मैं अपने NUnit धावक लिखना चाहता था।
बिली ओनेल

जहाँ तक मुझे पता है कि NUnit वर्कअराउंड के बिना इसका समर्थन नहीं करता है जैसे कि कई उदाहरणों को चलाना। यदि आप चाहते हैं कि मुझे लगता है कि आप एक ऐसा उपकरण बना सकते हैं जो परीक्षणों को N सेटों में विभाजित करता है और NUnit के N उदाहरणों को स्वचालित रूप से चलाता है जहाँ N आपके पास प्रोसेसर / कोर की संख्या है। यह एकमात्र तरीका होगा कि कुछ प्रकार की स्वचालित समानांतर परीक्षण हो जो मैं NUnit के साथ सोच सकता हूं।
kniemczak

मैंने टीमसिटी के निरंतर एकीकरण टूल पर चर्चा करते हुए एक अपडेट जोड़ा और इसमें कुछ पोस्ट्स को शामिल किया कि कैसे अपने ऑटोमेशन की जरूरतों को हल करने के लिए उस टूल का उपयोग किया जाए।
kniemczak

3

सिर्फ इसलिए कि PNUnit परीक्षण कोड के अंदर सिंक्रनाइज़ेशन कर सकता है इसका मतलब यह नहीं है कि आपको वास्तव में उस पहलू का उपयोग करना होगा। जहाँ तक मैं देख सकता हूँ कि आपको एक सेट को स्पॉइंग करने और बाकी की अनदेखी करने से रोकने के लिए तब तक कुछ नहीं करना चाहिए जब तक आपको इसकी आवश्यकता न हो।

BTW मैं उनके स्रोत के सभी पढ़ने के लिए समय नहीं है, लेकिन बैरियर वर्ग की जाँच करने के लिए उत्सुक था और यह एक बहुत ही सरल ताला काउंटर है। यह केवल एन थ्रेड्स के प्रवेश करने तक प्रतीक्षा करता है और फिर उन सभी को उसी समय चालू रखने के लिए पल्स भेजता है। बस इतना ही है - अगर आप इसे नहीं छूते हैं, तो यह आपको नहीं काटेगा।

एक सामान्य पिरोया विकास के लिए थोड़ा सा काउंटर सहज हो सकता है (ताले आमतौर पर उपयोग को क्रमबद्ध करने के लिए उपयोग किया जाता है - 1 से 1) लेकिन यह काफी उत्साही मोड़ है।


3

अब आप अपने यूनिट परीक्षणों को समानांतर करने के लिए NCrunch का उपयोग कर सकते हैं और आप यह भी कॉन्फ़िगर कर सकते हैं कि NCrunch द्वारा कितने कोर का उपयोग किया जाना चाहिए और कितने का उपयोग Visual Studio द्वारा किया जाना चाहिए।

साथ ही आपको बोनस के रूप में निरंतर परीक्षण मिलता है :)


3
जब आप Visual Studio के भीतर इसका उपयोग कर रहे हैं तो NCrunch बहुत अच्छा है, लेकिन जब आप अपने बिल्ड सर्वर पर अपने परीक्षणों को समानांतर बनाने की कोशिश कर रहे हैं तो यह मदद नहीं करता है।
पचक

3
NCrunch में अब एक कमांड लाइन टूल उपलब्ध है जो बिल्ड सर्वर पर वास्तव में अच्छी तरह से काम करता है।
चिल्लीटॉम

3

हर परीक्षण वर्ग में समानांतर विशेषता जोड़ने के विकल्प के रूप में:

Nunit3 या अधिक के लिए टेस्ट प्रोजेक्ट असेंबलीइन्फो.केसी क्लास में इसे जोड़ें:

// Make all tests in the test assembly run in parallel
[assembly: Parallelizable(ParallelScope.Fixtures)]

2

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

संपादित करें: ऐसा लगता है कि उन्होंने कंसोल ऐप में एक / प्रक्रिया विकल्प जोड़ा है। कमांड-लाइन मदद बताती है कि यह "परीक्षण के लिए प्रक्रिया मॉडल: एकल, अलग, एकाधिक" है। टेस्ट रनर के पास भी यह सुविधा है।

संपादित करें 2: दुर्भाग्य से, हालांकि यह प्रत्येक विधानसभा के लिए अलग-अलग प्रक्रियाएं बनाता है, प्रक्रिया अलगाव विकल्प (/ कमांड लाइन से प्रक्रिया) एक समय में एजेंटों को चलाता है।


2

चूंकि इस परियोजना का उल्लेख यहां नहीं किया गया है, इसलिए मैं NUnit.Multicore को लाना चाहूंगा । मैंने खुद इस परियोजना की कोशिश नहीं की है, लेकिन यह NUnit के साथ समानांतर परीक्षण समस्या के लिए एक दिलचस्प दृष्टिकोण है।


2

आप मेरे छोटे टूल टीबीक्स या कंसोल समानांतर रनर या यहां तक ​​कि वितरित वितरण को करने के लिए प्लगइन की कोशिश कर सकते हैं, जो पीसी स्काईनेट के सेट पर इकाई परीक्षण भी चला सकता है।

टीबीओक्स बड़े समाधान के साथ काम को आसान बनाने के लिए बनाया गया है, जिसमें कई परियोजनाएं शामिल हैं। यह कई प्लगइन्स का समर्थन करता है और उनमें से एक समानांतर में NUnit परीक्षण चलाने की क्षमता प्रदान करता है। इस प्लगइन को आपके मौजूदा परीक्षणों में किसी भी बदलाव की आवश्यकता नहीं है।

यह भी समर्थन:

  • इकाई परीक्षण के साथ फ़ोल्डर का क्लोनिंग (यदि आपके परीक्षण स्थानीय डेटा को बदलते हैं),

  • परीक्षणों की सिंक्रोनाइज़ेशन (उदाहरण के लिए यदि आपके परीक्षण पर परीक्षण उपसंहार सभी देव सर्वर या qitit के लिए क्रोमरनर को मारता है)

  • x86 मोड और परीक्षण चलाने के लिए व्यवस्थापक विशेषाधिकार

  • बैच रन - आप समानांतर में कई विधानसभाओं के लिए परीक्षण चला सकते हैं

  • यहां तक ​​कि एकल थ्रेड रन के लिए, यदि आप बहुत छोटे परीक्षण करते हैं, तो फ्रेड नूनिट धावक की तुलना में तेजी से काम करता है।

साथ ही यह टूल कमांड लाइन टेस्ट रनर (समानांतर रन के लिए) का समर्थन करता है और आप इसे निरंतर एकीकरण के साथ उपयोग कर सकते हैं।


यदि आप इस उत्पाद से जुड़े हैं, तो कृपया इसका खुलासा करें। आपने इस ओर इशारा करते हुए कई चीजें पोस्ट की हैं।
ब्रैड लार्सन

ज़रूर, TBox - मेरा अपना उपकरण है। मैंने इसे अपने खाली समय में अकेले लिखा है। अगर यह मुफ़्त साधनों के बारे में कहने के लिए यहाँ बुरा व्यवहार है, तो मैं इस जवाब को हटा दूँगा, यह कोई समस्या नहीं है :)
एलेक्स एच।

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

@ ब्रैड यह कोडप्लेक्स पर खुला स्रोत है, यह सुनिश्चित नहीं है कि यहां कोई समस्या क्यों है।

@DanVallejo - एक ओपन सोर्स प्रोजेक्ट होने का कारण यही है कि इसे पोस्ट करने पर समुदाय द्वारा हटाया नहीं गया था। हम वहां थोड़ा और अधिक रास्ता देते हैं, लेकिन हम फिर भी पूछते हैं कि आप परियोजना से अपनी संबद्धता का खुलासा करते हैं ताकि लोग आपकी सिफारिश के पीछे के संदर्भ को समझ सकें। एलेक्स ने यहां ऐसा किया, इसलिए उसका जवाब पूरी तरह से ठीक है क्योंकि यह अब खड़ा है।
ब्रैड लार्सन

1

मैंने समानांतर रूप से परीक्षण चलाने के लिए NUnit 3.0.0 बीटा -4 का सफलतापूर्वक उपयोग किया है

  • बिल्ड सर्वर पर चलता है
  • सेलेनियम परीक्षण चलाता है
  • विजुअल स्टूडियो सपोर्ट है
  • अभी तक कोई भी रिचार्पर सपोर्ट नहीं

साथियों उत्तर के लिए धन्यवाद ।

gotchas:

  • समानांतर विशेषता विरासत में नहीं मिली है, इसलिए इसे परीक्षण वर्ग पर निर्दिष्ट करना होगा।

1
NUnit 3.0 अब बाहर है
राल्फ विलगॉस

0

आप PowerShell कमांड (NUnit3 के लिए, NUnit2 परिवर्तन धावक नाम के लिए) का उपयोग कर सकते हैं:

PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique)

प्रस्तुत आदेश सभी परीक्षण असेंबली को एकल ननिट आवृत्ति में चलाता है, जो इंजन को समानांतर परीक्षण रन में इंजन का लाभ उठाने की अनुमति देता है ।

टिप्पणियों

  1. निर्देशिका खोज पैटर्न को ट्वीक करना याद रखें। दिया गया उदाहरण केवल निर्देशिकाओं के साथ .Tests.dllऔर अंदर \bin\Debugनिर्देशिकाओं को समाप्त करता है ।

  2. Uniqueछानने के बारे में जागरूक रहें - आप ऐसा नहीं करना चाह सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.