क्या सभी परीक्षण चलने से पहले एक बार कोड निष्पादित करना संभव है?


112

मूल रूप से मैं टेस्ट रन की श्रृंखला में लॉन्च करने से पहले MSTest को थोड़ा सा कोड निष्पादित करने के लिए कहना चाहूंगा, अनिवार्य रूप से मैं जो करना चाहता हूं वह वही है जिसमें कुछ कोड चिपका दिए गए हैं Main()

ऐसा करने का कारण यह है कि मैं अपने एकीकरण परीक्षण रन के दौरान log4net के साथ कुछ लॉगिंग करना चाहूंगा। मैं केवल तब तक log4net.Config.XmlConfiguratorविधानसभा विशेषता का उपयोग नहीं कर सकता , जब तक कि यह मेरी टेस्ट असेंबली में इसे पहले से ही नहीं बुला लेता LoggerManager। प्रलेखन कोड प्रविष्टि बिंदु पर स्पष्ट रूप से log4net को कॉन्फ़िगर करने की सिफारिश करता है - लेकिन मेरे परीक्षणों में वह कहां है?

मुझे TestDriven.NET और MSTest धावक में अपने परीक्षण चलाने में सक्षम होने की आवश्यकता है।

जवाबों:


153

FWIW, आप असेंबली में सभी इकाई परीक्षणों से पहले कोड चलाने के लिए असेंबलीइंटरलाइज़ विशेषता का उपयोग कर सकते हैं :

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

यदि आपके पास एक से अधिक यूनिट टेस्ट असेंबली है, तो मुझे ऐसी किसी भी चीज़ के बारे में पता नहीं है, जिसमें एक से अधिक विधानसभा शामिल हैं।

जहां तक ​​मुझे जानकारी है, यह उतना ही करीब है जितना कि आप एक मुख्य समकक्ष को प्राप्त कर सकते हैं।

ध्यान दें कि AssemblyInitialize-decorated पद्धति एक -decorated वर्ग में होनी चाहिए, TestClassजिसमें कम से कम एक TestMethod-decorated पद्धति शामिल है, अन्यथा इसे निष्पादित नहीं किया जाएगा!


1
मुझे भी ऐसी ही समस्या थी (केवल MSTest के लिए) और ठीक काम किया। धन्यवाद :)
ऑस्कर फोली

1
किसी और के लिए MsTest और TestDriven.NET दोनों से यह काम करने में समस्याएँ होने के लिए, आप यह निर्धारित करने के लिए एक स्थिर ध्वज का उपयोग कर सकते हैं कि क्या ClassInitialize में कोड को चलाना है (यह MsTest में काम नहीं करता है)।
कार्ल

7
नोट: परीक्षण इंजन असेंबली के साथ चिह्नित एक विधि चलाता है, केवल तभी जब वह विधि किसी वर्ग का सदस्य है जो TestClass विशेषता के साथ चिह्नित है।
जोवेन

5
@Jowen: परीक्षण इंजन असेंबली के साथ चिह्नित एक विधि चलाता है, केवल तभी जब वह विधि किसी वर्ग का सदस्य है जो TestClass विशेषता के साथ चिह्नित है and contains methods that are marked with the TestMethod attribute
o

3
असेंबली के साथ चिह्नित विधिइलेक्ट्रॉनिक विज़ुअल स्टूडियो 2015 में चलेगी अंतिम टेस्टमिथोड विशेषताओं के साथ चिह्नित अन्य तरीकों के बिना।
क्रिस

63

पूरा करने के लिए, ये MSTest के लिए "रन कोड से पहले" विकल्प हैं:

  • [AssemblyInitialize]असेंबली में किसी भी परीक्षा से पहले कोड को एक बार चलाने के लिए उपयोग करें ।
  • [ClassInitialize]कक्षा में एक बार कोड चलाने के लिए उपयोग करें , कक्षा में किसी भी परीक्षा से पहले जहां विधि परिभाषित की गई है।
  • [TestInitialize]कक्षा में प्रत्येक परीक्षा से पहले कोड को चलाने के लिए उपयोग करें जहां विधि परिभाषित की गई है।

12
इन विशेषताओं का सफाई प्रतिरूप आंसू-डाउन संचालन के लिए क्लीनअप प्रत्यय (जैसे क्लासक्लीनअप) है
यार नेवेट

13

मैं इसे एमएस टेस्ट हेडर में देखता हूं।

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

यह एक कक्षा में परीक्षणों से पहले चलेगा।

लगता है कि आप सभी परीक्षणों से पहले कुछ चलाना चाहते हैं।

परीक्षण रन कॉन्फ़िगरेशन में सेटअप स्क्रिप्ट विकल्प भी है।


जब तक मैं कुछ याद कर रहा हूँ, सेटअप स्क्रिप्ट परीक्षण AppDomain में कोड चलाने में मदद नहीं करता है।
जॉर्ज मौअर

2
यह शायद मैं हूँ। मुझे यकीन नहीं है कि जब आप कहते हैं कि मैं "परीक्षण AppDomain में चल रहे कोड" का अनुसरण करता हूं। मैं आपके प्रश्न को परीक्षणों की एक श्रृंखला से पहले कोड निष्पादित करना चाहता हूं, अगर यह कुछ और था जो अलग है। "परीक्षण स्क्रिप्ट और क्लीनअप स्क्रिप्ट परीक्षण चलाने से पहले और बाद में चलती है, उन परीक्षणों के प्रकार की परवाह किए बिना जो उन परीक्षणों में निहित हैं।" msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.