डिफ़ॉल्ट रूप से ननिट परीक्षण वर्णानुक्रम में चलते हैं। क्या किसी को निष्पादन आदेश निर्धारित करने का कोई तरीका पता है? क्या इसके लिए एक विशेषता मौजूद है?
डिफ़ॉल्ट रूप से ननिट परीक्षण वर्णानुक्रम में चलते हैं। क्या किसी को निष्पादन आदेश निर्धारित करने का कोई तरीका पता है? क्या इसके लिए एक विशेषता मौजूद है?
जवाबों:
आपकी इकाई परीक्षण प्रत्येक को स्वतंत्र रूप से चलाने और अकेले खड़े होने में सक्षम होना चाहिए। यदि वे इस कसौटी पर खरे उतरते हैं तो आदेश कोई मायने नहीं रखता।
हालांकि ऐसे मौके हैं जहां आप पहले कुछ परीक्षण चलाना चाहेंगे। एक विशिष्ट उदाहरण एक निरंतर एकीकरण स्थिति में है जहां कुछ परीक्षण दूसरों की तुलना में लंबे समय तक चल रहे हैं। हम श्रेणी विशेषता का उपयोग करते हैं ताकि हम उन परीक्षणों को चला सकें जो डेटाबेस का उपयोग करने वाले परीक्षणों के आगे मॉकिंग का उपयोग करते हैं।
यानी इसे अपने त्वरित परीक्षणों की शुरुआत में रखें
[Category("QuickTests")]
जहां आपके पास परीक्षण हैं जो कुछ पर्यावरणीय परिस्थितियों पर निर्भर हैं, TestFixtureSetUp और TestFixtureTearDown विशेषताओं पर विचार करें , जो आपको अपने परीक्षणों से पहले और बाद में निष्पादित होने वाले तरीकों को चिह्नित करने की अनुमति देते हैं।
मैं केवल यह बताना चाहता हूं कि जब अधिकांश उत्तरदाताओं ने मान लिया था कि ये यूनिट परीक्षण थे, तो सवाल यह नहीं था कि वे थे।
nUnit एक बेहतरीन उपकरण है जिसका उपयोग विभिन्न प्रकार की परीक्षण स्थितियों के लिए किया जा सकता है। मैं परीक्षण के आदेश को नियंत्रित करने के इच्छुक कारणों को देख सकता हूं।
उन स्थितियों में मुझे टेस्ट नाम में रन ऑर्डर शामिल करने का सहारा लेना पड़ा है। एक विशेषता का उपयोग करके रन ऑर्डर निर्दिष्ट करने में सक्षम होना बहुत अच्छा होगा।
001_first_test
002_second_test
और इतने पर बुलाया ?
NUnit 3.2.0 ने एक जोड़ा OrderAttribute
, देखें:
https://github.com/nunit/docs/wiki/Order-Attribute
उदाहरण:
public class MyFixture
{
[Test, Order(1)]
public void TestA() { ... }
[Test, Order(2)]
public void TestB() { ... }
[Test]
public void TestC() { ... }
}
एक विशिष्ट क्रम में चलाने के लिए परीक्षणों को चाहने का मतलब यह नहीं है कि परीक्षण एक-दूसरे पर निर्भर हैं - मैं इस समय एक TDD प्रोजेक्ट पर काम कर रहा हूं, और एक अच्छा TDDer होने के नाते मैंने सब कुछ मॉकडाउन / स्टब किया है, लेकिन यह होगा यह अधिक पठनीय है यदि मैं उस आदेश को निर्दिष्ट कर सकता हूं जो परीक्षण के परिणाम प्रदर्शित किए जाते हैं - वर्णानुक्रम के बजाय। अब तक केवल एक चीज जो मैं सोच सकता हूं, वह है कक्षाओं, नेमस्पेस और विधियों के लिए कक्षाओं में a_ b_ c_ को प्रस्तुत करना। (अच्छा नहीं) मुझे लगता है कि एक [TestOrderAttribute] विशेषता अच्छी होगी - फ्रेमवर्क का सख्ती से पालन नहीं किया जाता है, लेकिन एक संकेत है ताकि हम इसे प्राप्त कर सकें
भले ही टेस्ट ऑर्डर पर निर्भर हो या न हो ... हममें से कुछ लोग एक व्यवस्थित अंदाज में सब कुछ कंट्रोल करना चाहते हैं।
यूनिट परीक्षण आमतौर पर जटिलता के क्रम में बनाए जाते हैं। तो, उन्हें भी जटिलता के क्रम में क्यों नहीं चलाया जाना चाहिए, या वे जिस क्रम में बनाए गए हैं?
व्यक्तिगत रूप से, मैं उन परीक्षणों को देखना पसंद करता हूं, जिनके क्रम में मैंने उन्हें बनाया था। टीडीडी में, प्रत्येक क्रमिक परीक्षण स्वाभाविक रूप से अधिक जटिल होने वाला है, और चलाने के लिए अधिक समय लगता है। मैं पहले सरल परीक्षण को विफल होता देखूंगा क्योंकि यह विफलता का कारण के रूप में एक बेहतर संकेतक होगा।
लेकिन, मैं उन्हें यादृच्छिक क्रम में चलाने का लाभ भी देख सकता हूं, खासकर यदि आप यह परीक्षण करना चाहते हैं कि आपके परीक्षणों का अन्य परीक्षणों पर कोई निर्भरता नहीं है। रनर्स को "रन टेस्ट रेंडमली स्टॉप तक" टेस्ट करने के लिए एक विकल्प जोड़ने के बारे में कैसे?
मैं काफी जटिल वेब साइट पर सेलेनियम के साथ परीक्षण कर रहा हूं और परीक्षणों का पूरा सूट आधे घंटे से अधिक समय तक चल सकता है, और मैं अभी तक पूरे आवेदन को कवर करने के लिए नहीं हूं। अगर मुझे यह सुनिश्चित करना है कि प्रत्येक परीक्षण के लिए पिछले सभी फॉर्म सही तरीके से भरे गए हैं, तो यह समग्र परीक्षण के लिए, समय की एक छोटी राशि ही नहीं, बल्कि कई बार जोड़ता है। यदि परीक्षणों को चलाने के लिए बहुत अधिक ओवरहेड है, तो लोग उन्हें जितनी बार चाहें उतनी बार नहीं चलाएंगे।
इसलिए, मैंने उन्हें क्रम में रखा और पाठ बक्से और इस तरह के पूर्ण होने के लिए पिछले परीक्षणों पर निर्भर रहा। मैं Assert.Ignore () का उपयोग करता हूं, जब पूर्व शर्तें मान्य नहीं हैं, लेकिन मुझे उन्हें क्रम में चलाने की आवश्यकता है।
मुझे वास्तव में पिछला उत्तर पसंद है।
मैंने ऑर्डर रेंज सेट करने के लिए एक विशेषता का उपयोग करने में सक्षम होने के लिए इसे थोड़ा बदल दिया:
namespace SmiMobile.Web.Selenium.Tests
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using NUnit.Framework;
public class OrderedTestAttribute : Attribute
{
public int Order { get; set; }
public OrderedTestAttribute(int order)
{
Order = order;
}
}
public class TestStructure
{
public Action Test;
}
class Int
{
public int I;
}
[TestFixture]
public class ControllingTestOrder
{
private static readonly Int MyInt = new Int();
[TestFixtureSetUp]
public void SetUp()
{
MyInt.I = 0;
}
[OrderedTest(0)]
public void Test0()
{
Console.WriteLine("This is test zero");
Assert.That(MyInt.I, Is.EqualTo(0));
}
[OrderedTest(2)]
public void ATest0()
{
Console.WriteLine("This is test two");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
}
[OrderedTest(1)]
public void BTest0()
{
Console.WriteLine("This is test one");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
}
[OrderedTest(3)]
public void AAA()
{
Console.WriteLine("This is test three");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
}
[TestCaseSource(sourceName: "TestSource")]
public void MyTest(TestStructure test)
{
test.Test();
}
public IEnumerable<TestCaseData> TestSource
{
get
{
var assembly =Assembly.GetExecutingAssembly();
Dictionary<int, List<MethodInfo>> methods = assembly
.GetTypes()
.SelectMany(x => x.GetMethods())
.Where(y => y.GetCustomAttributes().OfType<OrderedTestAttribute>().Any())
.GroupBy(z => z.GetCustomAttribute<OrderedTestAttribute>().Order)
.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
foreach (var order in methods.Keys.OrderBy(x => x))
{
foreach (var methodInfo in methods[order])
{
MethodInfo info = methodInfo;
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
object classInstance = Activator.CreateInstance(info.DeclaringType, null);
info.Invoke(classInstance, null);
}
}).SetName(methodInfo.Name);
}
}
}
}
}
}
OrderedTest
NUnit 3 में अब समर्थित नहीं है
मुझे पता है कि यह एक अपेक्षाकृत पुरानी पोस्ट है, लेकिन यहां परीक्षण के नामों को अजीब बनाने के बिना अपना परीक्षण रखने का एक और तरीका है। TestCaseSource विशेषता का उपयोग करके और जिस ऑब्जेक्ट को आप किसी प्रतिनिधि (क्रिया) में पास करते हैं, उसका उपयोग करके, आप न केवल आदेश को नियंत्रित कर सकते हैं, बल्कि परीक्षण को नाम भी दे सकते हैं कि यह क्या है।
यह काम करता है, क्योंकि प्रलेखन के अनुसार, परीक्षण स्रोत से लौटाए गए संग्रह में आइटम हमेशा उसी क्रम में निष्पादित होंगे जिस क्रम में वे सूचीबद्ध हैं।
यहाँ एक प्रस्तुति से एक डेमो है जो मैं कल दे रहा हूँ:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
namespace NUnitTest
{
public class TestStructure
{
public Action Test;
}
class Int
{
public int I;
}
[TestFixture]
public class ControllingTestOrder
{
private static readonly Int MyInt= new Int();
[TestFixtureSetUp]
public void SetUp()
{
MyInt.I = 0;
}
[TestCaseSource(sourceName: "TestSource")]
public void MyTest(TestStructure test)
{
test.Test();
}
public IEnumerable<TestCaseData> TestSource
{
get
{
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
Console.WriteLine("This is test one");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
}
}).SetName(@"Test One");
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
Console.WriteLine("This is test two");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
}
}).SetName(@"Test Two");
yield return new TestCaseData(
new TestStructure
{
Test = () =>
{
Console.WriteLine("This is test three");
MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
}
}).SetName(@"Test Three");
}
}
}
}
TestCaseSource
आदेशित परीक्षणों को चलाने के तरीके के रूप में उपयोग करना प्रतिभा का एक स्ट्रोक है। बहुत बढ़िया। मैंने इस दृष्टिकोण को नीचे के साथ लिया है और कुछ अतिरिक्त संशोधनों को जोड़ा है ताकि इसका उपयोग करना आसान हो सके। अतिरिक्त जानकारी के लिए मेरे उत्तर में लिंक देखें, लेकिन अंतर्निहित विचार इस महान उत्तर से है!
TestCaseSource
स्थिर होना आवश्यक है, जो पैटर्न का उपयोग करने से रोकता है। ओह।
TestCaseSource
NUnit 3 में एक स्थिर वस्तु होनी चाहिए, या परीक्षण निष्पादित नहीं होंगे। और आप एक स्थिर वस्तु के भीतर गतिशील वस्तुओं का निर्माण नहीं कर सकते। इसलिए यह v में काम नहीं करेगा। 3.
मैं सी # में लिखे गए सेलेनियम वेबड्राइवर एंड-टू-एंड यूआई परीक्षण मामलों के साथ काम कर रहा हूं, जो एनयूएनआर फ्रेमवर्क का उपयोग करके चलाए जाते हैं। (यूनिट मामले नहीं जैसे)
ये यूआई परीक्षण निश्चित रूप से निष्पादन के आदेश पर निर्भर करते हैं, क्योंकि अन्य परीक्षण में एक पूर्व शर्त के रूप में कुछ डेटा जोड़ने की आवश्यकता होती है। (हर परीक्षा में कदम उठाना संभव नहीं है)
अब, 10 वीं परीक्षा के मामले को जोड़ने के बाद, मैं देखता हूं कि Nnnit इस क्रम में चलना चाहता है: Test_1 Test_10 Test_2___
इसलिए मुझे लगता है कि मुझे अभी के लिए परीक्षण मामले के नामों को भी वर्णानुक्रम में बदलना होगा, लेकिन NUnit में जोड़े गए निष्पादन आदेश को नियंत्रित करने की इस छोटी सी विशेषता के लिए अच्छा होगा।
आमतौर पर यूनिट टेस्ट स्वतंत्र होना चाहिए, लेकिन अगर आपको होना चाहिए, तो आप अपने तरीकों को वर्णमाला क्रम में पूर्व नाम दे सकते हैं:
[Test]
public void Add_Users(){}
[Test]
public void Add_UsersB(){}
[Test]
public void Process_Users(){}
या आप कर सकते हैं ..
private void Add_Users(){}
private void Add_UsersB(){}
[Test]
public void Process_Users()
{
Add_Users();
Add_UsersB();
// more code
}
a_
b_
t1_
, t2_
बजाय इसके या अनुगामी पात्रों को याद करने के लिए आसान पर भरोसा करना
टेस्ट ऑर्डरिंग तंत्र का उपयोग करने के बहुत अच्छे कारण हैं। मेरे स्वयं के अधिकांश परीक्षण सेटअप / अशांति जैसे अच्छे अभ्यास का उपयोग करते हैं। दूसरों को भारी मात्रा में डेटा सेटअप की आवश्यकता होती है, जिसका उपयोग कई प्रकार की विशेषताओं का परीक्षण करने के लिए किया जा सकता है। अब तक, मैंने इन (सेलेनियम वेबड्राइवर) एकीकरण परीक्षणों को संभालने के लिए बड़े परीक्षणों का उपयोग किया है। हालाँकि, मुझे लगता है कि उपरोक्त सुझाव पोस्ट https://github.com/nunit/docs/wiki/Order-Attribute में बहुत योग्यता है। यहाँ इस बात का उदाहरण दिया गया है कि ऑर्डर करना कितना मूल्यवान होगा:
यह 10 मिनट प्रतीक्षा समय परीक्षण सूट को धीमा कर देता है। जब आप परीक्षण की एक भीड़ में समान कैशिंग विलंब को गुणा करते हैं, तो इसमें बहुत समय लगता है। ऑर्डर करने वाले परीक्षण डेटा सेटअप को परीक्षण सूट की शुरुआत में "टेस्ट" के रूप में सही तरीके से करने की अनुमति दे सकते हैं, परीक्षण के अंत तक निष्पादित होने के लिए कैश पर भरोसा करने के लिए परीक्षण पर भरोसा करते हैं।
यह प्रश्न वास्तव में अब पुराना है, लेकिन जो लोग खोज से इस तक पहुंच सकते हैं, मैंने user3275462 और PvtVandals / Rico से उत्कृष्ट उत्तर लिए और उन्हें अपने कुछ अपडेट के साथ GitHub रिपॉजिटरी में जोड़ा । मैंने कुछ अतिरिक्त जानकारी के साथ एक संबद्ध ब्लॉग पोस्ट भी बनाई है जिसे आप अधिक जानकारी के लिए देख सकते हैं।
आशा है कि यह आप सभी के लिए उपयोगी है। इसके अलावा, मैं अक्सर अपनी वास्तविक इकाई परीक्षणों से अपने एकीकरण परीक्षणों या अन्य अंत-टू-एंड परीक्षणों को अलग करने के लिए श्रेणी विशेषता का उपयोग करना पसंद करता हूं। अन्य लोगों ने बताया है कि यूनिट परीक्षणों में एक आदेश निर्भरता नहीं होनी चाहिए, लेकिन अन्य परीक्षण प्रकार अक्सर करते हैं, इसलिए यह केवल उन परीक्षणों की श्रेणी को चलाने का एक अच्छा तरीका प्रदान करता है जिन्हें आप चाहते हैं और उन अंत-टू-एंड परीक्षणों का आदेश देते हैं।
मैं NUnit समुदाय से कुछ भी करने के लिए तैयार नहीं हूं, इसलिए मैं खुद इस तरह का कुछ बनाने गया था।
मैं वर्तमान में एक ओपन-सोर्स लाइब्रेरी विकसित कर रहा हूं जो आपको NUnit के साथ अपने परीक्षण का आदेश दे सकती है। आप परीक्षण जुड़नार और "ऑर्डर किए गए परीक्षण विनिर्देशों" को समान रूप से ऑर्डर कर सकते हैं।
पुस्तकालय निम्नलिखित विशेषताएं प्रदान करता है:
लाइब्रेरी वास्तव में प्रेरित है कि कैसे MSTest .orderedtest
फाइलों के साथ परीक्षण के आदेश देता है। कृपया नीचे एक उदाहरण देखें।
[OrderedTestFixture]
public sealed class MyOrderedTestFixture : TestOrderingSpecification {
protected override void DefineTestOrdering() {
TestFixture<Fixture1>();
OrderedTestSpecification<MyOtherOrderedTestFixture>();
TestFixture<Fixture2>();
TestFixture<Fixture3>();
}
protected override bool ContinueOnError => false; // Or true, if you want to continue even if a child test fails
}
यदि आप उपयोग कर रहे हैं [TestCase]
, तो तर्क TestName
परीक्षण के लिए एक नाम प्रदान करता है।
यदि निर्दिष्ट नहीं है, तो एक नाम विधि के नाम और प्रदान किए गए तर्कों के आधार पर उत्पन्न होता है।
आप नीचे दिए गए अनुसार परीक्षण निष्पादन के क्रम को नियंत्रित कर सकते हैं:
[Test]
[TestCase("value1", TestName = "ExpressionTest_1")]
[TestCase("value2", TestName = "ExpressionTest_2")]
[TestCase("value3", TestName = "ExpressionTest_3")]
public void ExpressionTest(string v)
{
//do your stuff
}
यहाँ मैंने "ExpressionTest"
एक संख्या के साथ विधि नाम प्रत्यय का उपयोग किया है ।
आप वर्णमाला देखने के लिए किसी भी नाम का उपयोग कर सकते हैं TestCase विशेषता को देखें
आपको उस आदेश पर निर्भर नहीं होना चाहिए जिसमें परीक्षण रूपरेखा निष्पादन के लिए परीक्षण करता है।टेस्ट अलग-थलग और स्वतंत्र होने चाहिए। इसमें उन्हें कुछ अन्य परीक्षण पर निर्भर नहीं होना चाहिए, उनके लिए मंच की स्थापना करना या उनके बाद सफाई करना। उन्हें परीक्षणों के निष्पादन के आदेश के बावजूद समान परिणाम का उत्पादन करना चाहिए (SUT के दिए गए स्नैपशॉट के लिए)
मैंने थोड़ी गुगली की। हमेशा की तरह, कुछ लोगों ने डराने वाली चालों का सहारा लिया है (बजाय अंतर्निहित परीक्षण क्षमता / डिजाइन मुद्दे को हल करने के
यह भी देखें: एक अच्छे परीक्षण की विशेषताएं
TestCaseSource
कुंजी का उपयोग करने के मामले में override string ToString
, यह कैसे काम करता है:
मान लें कि आपके पास TestCase क्लास है
public class TestCase
{
public string Name { get; set; }
public int Input { get; set; }
public int Expected { get; set; }
}
और टेस्टकेस की सूची:
private static IEnumerable<TestCase> TestSource()
{
return new List<TestCase>
{
new TestCase()
{
Name = "Test 1",
Input = 2,
Expected = 4
},
new TestCase()
{
Name = "Test 2",
Input = 4,
Expected = 16
},
new TestCase()
{
Name = "Test 3",
Input = 10,
Expected = 100
}
};
}
अब इसे एक टेस्ट विधि के साथ उपयोग करें और देखें कि क्या होता है:
[TestCaseSource(nameof(TestSource))]
public void MethodXTest(TestCase testCase)
{
var x = Power(testCase.Input);
x.ShouldBe(testCase.Expected);
}
यह क्रम में परीक्षण नहीं करेगा और आउटपुट इस तरह होगा:
इसलिए अगर हम override string ToString
अपनी कक्षा में शामिल होते हैं जैसे:
public class TestCase
{
public string Name { get; set; }
public int Input { get; set; }
public int Expected { get; set; }
public override string ToString()
{
return Name;
}
}
परिणाम बदल जाएगा और हमें परीक्षण का क्रम और नाम मिलेगा:
ध्यान दें: