2012-05-22 19 views
8

में विधियों को शुरू करें मेरे पास TeamTest में "MyClassTest" नामक इकाई परीक्षण प्रोजेक्ट है। इस परियोजना में तीन टेस्ट मैथ्यू हैं। प्रत्येक विधि को अपने स्वयं के परीक्षण प्रारंभिक चरणों की आवश्यकता होती है। लेकिन जब मैं TestInitializeAttribute को तीन प्रारंभिक तरीकों पर लागू करता हूं, तो यह कहता है कि विशेषता को एक से अधिक बार उपयोग नहीं किया जाना चाहिए। फिर विजुअल स्टूडियो टीम टेस्ट में प्रत्येक टेस्ट विधि को आरंभ करने के लिए उपयोग की जाने वाली विशेषता क्या होनी चाहिए?वीएस टीम टेस्ट: एकाधिक टेस्ट टेस्ट क्लास

संदर्भ:

  1. VS Team Test: .Net Unit Testing with Excel as Data Source: Adapter Failed

  2. How to create Startup and Cleanup script for Visual Studio Test Project?

  3. VS 2010 Load Tests Results with custom counters

  4. How to log unit test entry and leave in MSTest

  5. Can a unit test project load the target application's app.config file?

उत्तर

18

MSDNTestInitializeAttribute के अनुसार:

  • अधिक (AllowMultiple = false), और
  • विरासत में मिला नहीं किया जा सकता अपने खुद के TestInitializeAttribute बनाने के लिए एक बार से नहीं किया जा सकता।

तो, मेरा सुझाव है कि TestInitialize विशेषता के बिना टेस्ट आरंभिक तरीके बनाना है। तब अद्वितीय TestInitialize विधि जांच करते हैं कि वर्तमान निष्पादित TestMethod और कॉल उचित इनिशियलाइज़ विधि है में:

[TestClass] 
public class UnitTest 
{ 
    public TestContext TestContext { get; set; } 

    [TestInitialize] 
    public void Initialize() 
    { 
     switch (TestContext.TestName) 
     { 
      case "TestMethod1": 
       this.IntializeTestMethod1(); 
       break; 
      case "TestMethod2": 
       this.IntializeTestMethod2(); 
       break; 
      default: 
       break; 
     } 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
    } 

    [TestMethod] 
    public void TestMethod2() 
    { 
    } 

    public void IntializeTestMethod1() 
    { 
     //Initialize Test Method 1 
    } 

    public void IntializeTestMethod2() 
    { 
     //Initialize Test Method 2 
    } 
} 
+1

धन्यवाद। यह व्यवहार्य लगता है। क्या यह मानक अभ्यास है कि लोग अनुसरण करते हैं? – Lijo

+0

यह मेरी प्रथा का अभ्यास है। मुझे नहीं पता कि कोई और बेहतर तरीका है :) – Schaliasos

+5

'AllowMultiple = false' केवल उसी तत्व में एकल उपयोग को लागू करता है ... जिसका अर्थ है कि एक ही विधि को एकाधिक' TestInitializeAttribute' के साथ चिह्नित नहीं किया जा सकता है। नियम जो इसे विभिन्न तरीकों से उपयोग नहीं किया जा सकता है, 'AllowMultiple = false' के साथ कुछ लेना देना नहीं है। –

3

वे तीन inits अलग की जरूरत है; तो वे शायद अपने स्वयं के init के साथ तीन अलग जुड़नार में होना चाहिए!

+0

शियालासोस ने ऊपर एक विधि का सुझाव दिया। उसे ठीक होना चाहिए। क्या आप कोई कमी देखते हैं? – Lijo

+2

नहीं .. वास्तव में नहीं। जब तक तीन परीक्षण तार्किक रूप से संबंधित होते हैं। मैं व्यक्तिगत रूप से .. मैं इसे तीन फिक्स्चर में विभाजित कर दूंगा लेकिन यह एक निजी वरीयता है। उपरोक्त दिखता है ठीक है। क्या आपको परीक्षण के बाद भी सफाई की आवश्यकता है? क्या एक ही दृष्टिकोण का उपयोग किया जा सकता है? –

11

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

बस संदर्भ निर्माण को प्रत्येक विधि के arrange भाग में ले जाएं।

यदि आपके पास कई विधियां हैं, जो सामान्य संदर्भ का उपयोग करती हैं, तो बस विधि निकालें, जो उनके लिए संदर्भ स्थापित करेगी, और इसे arrange भाग पर कॉल करें। आप प्रत्येक संदर्भ सेटअप को कई चरणों में विभाजित कर सकते हैं और उन चरणों का पुन: उपयोग कर सकते हैं (जैसे यह Specflow जैसे दिए गए-टू-टू टूल्स में किया गया है)।

और, ज़ाहिर है, विभिन्न फिक्स्चर भी विकल्प बनाते हैं।

+1

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

+1

@ डेविड रेड्रिग्स न केवल। आप परीक्षण कर रहे प्रत्येक फीचर के लिए अलग टेस्टफिक्स्चर क्लास बना सकते हैं। यह बहुत आसान होगा और सेटअप विधि में कोई स्विच ब्लॉक नहीं होगा। इसके अलावा मैं स्वीकृति परीक्षण के लिए SpecFlow जैसे कुछ के साथ जाऊंगा। अच्छी तरह से दी गई विधियां हैं जो अच्छी तरह व्यवस्थित हैं और पुन: उपयोग की जा सकती हैं। SpecFlow आउटपुट विंडो में सभी चरणों निष्पादन समय लिखता है –

4

यह एक पुरानी पोस्ट का एक सा है, लेकिन मैं जिसके बाद काम करने के लिए ठीक लगता है के साथ आया था: सबसे पहले, एक विशेषता वर्ग को परिभाषित:

[AttributeUsage(AttributeTargets.Method, Inherited = true)] 
public class InitialiseWithAttribute : Attribute 
{ 
    public string Id { get; private set; } 

    public InitialiseWithAttribute(string id) 
    { 
     Id = id; 
    } 
} 

फिर कुछ सुविधाजनक उपयोगिताओं कक्षा में एक विस्तार विधि को परिभाषित :

public static bool IsInitialisedWith(this string testName, string value) 
    { 
     bool result = false; 
     Type testClassType = new StackFrame(1).GetMethod().DeclaringType; 
     MethodInfo methodInfo = testClassType.GetMethod(testName); 
     if (methodInfo != null) 
     { 
      InitialiseWithAttribute initialiseWithAttribute = 
       methodInfo.GetCustomAttribute<InitialiseWithAttribute>(true); 
      if (initialiseWithAttribute != null) 
      { 
       result = initialiseWithAttribute.Id == value; 
      } 
     } 
     return result; 
    } 

अब आप अपने परीक्षण लिखते हैं, इस प्रकार:

public TestContext TestContext {get; set;} 
    [TestInitialize] 
    public void TestInitialise() 
    { 
     if (TestContext.TestName.IsInitalisedWith("DoSomethingSpecial") 
     { 
      // ... Do something special 
     } 
     else 
     { 
      // ... Do something normal 
     } 
    } 

    [TestMethod] 
    [InitialiseWith("DoSomethingSpecial")] 
    public void MySpecialTest() 
    { 
     // The test 
    } 
2

मेरे काम पर हम यह निर्धारित करने के लिए testInitialize विधि के लिए एक तर्क में गुजरते हैं कि हम कैसे प्रारंभ करना चाहते हैं।

public partial class CommonActions 
{ 
    public void TestInitialize(bool adminTest) 
    { 
     try 
     { 
     if (adminTest) 
     { 
      //do stuff 
     } 

हमारे पास कक्षा परिभाषा में मानक प्रारंभिकता है, जो गलत पर डिफ़ॉल्ट है।

[TestClass] 
public class ProjectTestBase : FrameworkTestBase 
{ 
    public CommonActions common { get; set; } = new CommonActions(); 

    [TestInitialize] 
    public void TestInitialize() => common.TestInitialize(false); 

फिर टेस्ट मामलों में स्वयं आप किसी भी परीक्षण के लिए टेस्ट आरंभिक ओवरराइड कर सकते हैं।

[TestClass] 
public class SetReportsInAdmin : ProjectTestBase 
{ 
    [TestInitialize] 
    public new void TestInitialize() => common.TestInitialize(true); 

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

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