क्या मैं एक यूनिट टेस्ट में कंसोल में लिख सकता हूं? यदि हाँ, तो कंसोल विंडो क्यों नहीं खुलती है?


148

मेरे पास विज़ुअल स्टूडियो में एक परीक्षण परियोजना है। मैं Microsoft.VisualStudio.TestTools.UnitTesting का उपयोग करता हूं ।

मैं अपनी एक इकाई परीक्षण में यह पंक्ति जोड़ता हूं:

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

जब मैं परीक्षण चलाता हूं, तो परीक्षण पास हो जाता है, लेकिन कंसोल विंडो बिल्कुल नहीं खोली जाती है।

क्या सांत्वना खिड़की को एक इकाई परीक्षण के माध्यम से बातचीत करने के लिए उपलब्ध करने का एक तरीका है?


1
यह वास्तव में धावक पर निर्भर करता है। आप TestDriven.Net (व्यक्तिगत उपयोग, परीक्षण धावक के लिए एक महान, नि: शुल्क) का उपयोग कर सकते हैं - Console.WriteLine VS आउटपुट फलक को लिखेंगे।
सुदूरवर्ती


NCrunch में यह सुविधा भी है, जो अकेले इसे मूल्य IMO के लायक बनाता है। मेरे पास एक Dumpएक्सटेंशन विधि है जो ऑब्जेक्ट की सामग्री को कंसोल में आउटपुट करती है, जिससे चीजों को डिबग करना इतना आसान हो जाता है। i.imgur.com/MEZwy7X.png
धर्मरत्न

जवाबों:


125

नोट: नीचे दिए गए मूल उत्तर को विजुअल स्टूडियो 2012 के माध्यम से विजुअल स्टूडियो के किसी भी संस्करण के लिए काम करना चाहिए। विजुअल स्टूडियो 2013 में टेस्ट परिणाम विंडो किसी भी अधिक दिखाई नहीं देती है। इसके बजाय, यदि आपको परीक्षण-विशिष्ट आउटपुट की आवश्यकता है, तो आप Trace.Write()आउटपुट विंडो में आउटपुट लिखने के लिए @ स्ट्रेच के सुझाव का उपयोग कर सकते हैं।


Console.Writeविधि "कंसोल" पर लिख नहीं करता है - यह लिखते हैं करने के लिए जो कुछ भी चल रहा है प्रक्रिया के लिए मानक आउटपुट संभाल के शौकीन है। इसी तरह, Console.Readमानक इनपुट तक जो भी झुका है, उससे इनपुट पढ़ता है।

जब आप Visual Studio 2010 के माध्यम से एक इकाई परीक्षण चलाते हैं, तो मानक आउटपुट को टेस्ट हार्नेस द्वारा पुनर्निर्देशित किया जाता है और परीक्षण आउटपुट के भाग के रूप में संग्रहीत किया जाता है। आप इसे परीक्षण परिणाम विंडो पर राइट-क्लिक करके और डिस्प्ले में "आउटपुट (StdOut)" नाम के कॉलम को जोड़कर देख सकते हैं। यह कुछ भी दिखाएगा जो मानक आउटपुट के लिए लिखा गया था।

आप सकता है मैन्युअल रूप से एक कंसोल विंडो खोलें, का उपयोग करते हुए पी / आह्वान के रूप में sinni800 कहते हैंAllocConsoleप्रलेखन पढ़ने से , ऐसा प्रतीत होता है कि फ़ंक्शन रीसेट हो जाएगा stdinऔर stdoutनई कंसोल विंडो को इंगित करने के लिए हैंडल करेगा । (मैं उस बारे में 100% निश्चित नहीं हूं; यह मुझे गलत लगता है अगर मैंने पहले ही stdoutविंडोज को मुझसे चोरी करने के लिए रीडायरेक्ट कर दिया है, लेकिन मैंने कोशिश नहीं की है।)

सामान्य तौर पर, हालांकि, मुझे लगता है कि यह एक बुरा विचार है; यदि आप अपने यूनिट टेस्ट के बारे में अधिक जानकारी डंप करना चाहते हैं, तो आउटपुट आपके लिए है। Console.WriteLineजिस तरह से आप कर रहे हैं का उपयोग करते रहें , और जब यह किया जाता है तो परीक्षण परिणाम विंडो में आउटपुट परिणामों की जांच करें।


एक कंसोल आवंटित करने के लिए AllocConsole का उपयोग करके एक नया WindowsApplication खोलने का प्रयास करें, और यह वहां लिख देगा। मुझे नहीं पता कि यह वास्तव में क्या करता है, लेकिन यह यूनिट टेस्ट वातावरण में काम नहीं कर सकता है। यह जानकर वाकई अच्छा
लगेगा

मानव संसाधन विकास मंत्री। AllocConsoleदस्तावेज़ीकरण फिर से पढ़ना , मैं गलत हो सकता हूं, लेकिन मुझे इसका परीक्षण करना होगा।
बजे माइकल एडेनफील्ड

2
मेरे लिए माइकल की इस टिप्पणी ने कहा कि मेरे बारे में सोचने के लिए आवश्यक सब कुछ: "जब आप VS2010 के माध्यम से एक इकाई परीक्षण चलाते हैं, तो मानक उत्पादन को परीक्षण हार्नेस द्वारा पुनर्निर्देशित किया जाता है और परीक्षण आउटपुट के भाग के रूप में संग्रहीत किया जाता है।"
रॉबर्ट पैटरसन

5
VS2013 में, यदि आपका कंसोल पर लिखते हैं, तो TestExplorer / Test / सारांश पर एक [आउटपुट] लिंक लेबल होगा। उस पर क्लिक करें और आपको वांछित आउटपुट मिलता है। रुको? आप भी Console.ReadLine () को कॉल करना चाहते हैं ??
विसार

3
V2017 (समुदाय) में, "परीक्षण एक्सप्लोरर" पर जाएं, सूची में परीक्षा परिणाम आइटम का चयन करें, फिर अन्य विंडो (परीक्षा परिणाम विंडो?) पर लिंक "आउटपुट" पर क्लिक करें। चूंकि यह संभवत: काट दिया जाएगा, "कॉपी सभी" का उपयोग करें और कहीं और अतीत करें।
हिंगिंगर

180

दृश्य स्टूडियो 2013 में इस स्पष्ट रूप से नई कार्यक्षमता के बारे में किसी ने टिप्पणी की। मुझे यकीन नहीं था कि वह पहले क्या मतलब था, लेकिन अब मैं ऐसा करता हूं, मुझे लगता है कि यह अपने स्वयं के जवाब का हकदार है।

हम Console.WriteLine का सामान्य रूप से उपयोग कर सकते हैं और आउटपुट प्रदर्शित होता है, सिर्फ आउटपुट विंडो में नहीं, बल्कि परीक्षण विवरण में "आउटपुट" पर क्लिक करने के बाद एक नई विंडो में।

यहां छवि विवरण दर्ज करें


2
उत्कृष्ट समाधान। पुष्टि करें कि यह VS2015 एंटरप्राइज में काम करता है।
गार्फ्रेडाज़

6
दुर्भाग्य से, कोई भी कॉपी-एंड-पेस्टिंग के लिए उस आउटपुट क्षेत्र में किसी भी पाठ का चयन नहीं कर सकता है :( वे क्या सोच रहे थे?
या मैपर

3
@ORMapper, पर "मानक आउटपुट" क्षेत्र राइट क्लिक करें, और चुनें सभी कॉपी
bychance

2
@ ओवी-WanKenobi Console.Write के साथ कुछ outputting कोशिश
टैगो ड्यूआर्टे

5
बनाम 2017 में आपको ईच टेस्ट का चयन करना होगा जो चल रहा है, फिर आउटपुट पर क्लिक करें - जब आपके पास बहुत सारे परीक्षण हैं तो बहुत उपयोगी नहीं है। मैं सभी आउटपुट को एक साथ देखना चाहता हूं - अलग-अलग विंडो में नहीं।
18-28 में इनलाइनर 49

37

आप इस लाइन का उपयोग विजुअल स्टूडियो के आउटपुट विंडो में लिखने के लिए कर सकते हैं :

System.Diagnostics.Debug.WriteLine("Matrix has you...");

डिबग मोड में चलना चाहिए।


7
यह मेरे वी.एस.
लुइस फ़िलिप

1
विवरण के लिए इस धागे की जाँच करें - stackoverflow.com/questions/1159755/…
दिमित्री पावलोव

1
इसने आउटपुट को देखने के लिए MSTest और R # का उपयोग करके मेरे लिए बहुत अच्छा काम किया। धन्यवाद!
इसहाक बेकर

2
यदि आप एक परीक्षण डिबग करते हैं, तो इसे दिखाते हैं, लेकिन अगर आप इसे केवल डिबगिंग के बिना चलाते हैं तो नहीं।
योयो

29

जैसा कि कहा गया है, इकाई परीक्षण बिना बातचीत के चलाने के लिए डिज़ाइन किए गए हैं।

हालाँकि, आप किसी अन्य कोड की तरह ही यूनिट टेस्ट डिबग कर सकते हैं । सबसे आसान तरीका है Debugकि टेस्ट परिणाम टैब में बटन का उपयोग करें।

डीबग करने में सक्षम होने का अर्थ है ब्रेकपॉइंट का उपयोग करना। ब्रेकप्वाइंट का उपयोग करने में सक्षम होने के बाद, ट्रेसप्वाइंट का उपयोग करने में सक्षम होने का मतलब है , जो मुझे हर दिन डिबगिंग में बेहद उपयोगी लगता है।

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

बस एक ब्रेकपॉइंट जोड़ें, और फिर उस ब्रेकपॉइंट पर राइट-क्लिक करें। "जब मारो ..." विकल्प चुनें:

जब मार विकल्प

जो संवाद लाता है:

जब एक ब्रेकपॉइंट मारा जाता है

ध्यान देने योग्य कुछ बातें:

  1. ध्यान दें कि ब्रेकपॉइंट को एक हीरे के रूप में दिखाया गया है, एक गोले के बजाय, एक ट्रेस बिंदु का संकेत है
  2. आप किसी चर के मान को {{} की तरह संलग्न करके आउटपुट कर सकते हैं।
  3. किसी भी नियमित ब्रेकपॉइंट की तरह इस लाइन पर कोड ब्रेक करने के लिए "जारी निष्पादन" चेकबॉक्स को अनचेक करें
  4. आपके पास मैक्रो चलाने का विकल्प है। कृपया सावधान रहें - आपको हानिकारक दुष्प्रभाव हो सकते हैं।

अधिक विवरण के लिए दस्तावेज़ देखें।


24

C # में Visual Studio यूनिट टेस्ट से आउटपुट लिखने के कई तरीके हैं:

  • Console.Write - Visual Studio परीक्षण हार्नेस इस पर कब्जा करेगा और जब आप टेस्ट एक्सप्लोरर में टेस्ट का चयन करेंगे और आउटपुट लिंक पर क्लिक करेंगे। करता नहीं दृश्य स्टूडियो उत्पादन विंडो में दिखाई है जब या तो चल रहे हैं या एक इकाई परीक्षण डिबगिंग (यकीनन यह एक बग है)।
  • Debug.Write - विजुअल स्टूडियो टेस्ट हार्नेस इसे कैप्चर करेगा और टेस्ट आउटपुट में दिखाएगा। करता है दृश्य स्टूडियो उत्पादन विंडो में दिखाई देते हैं जब एक इकाई परीक्षण डीबगिंग, जब तक कि दृश्य स्टूडियो डिबगिंग विकल्प तत्काल विंडो को रीडायरेक्ट आउटपुट करने के लिए कॉन्फ़िगर कर रहे हैं। यदि आप केवल डिबगिंग के बिना परीक्षण चलाते हैं, तो आउटपुट (या तत्काल) विंडो में कुछ भी नहीं दिखाई देगा। डिफ़ॉल्ट रूप से केवल डिबग बिल्ड में उपलब्ध है (अर्थात, जब DEBUG स्थिरांक को परिभाषित किया गया है)।
  • Trace.Write - विजुअल स्टूडियो टेस्ट हार्नेस इसे कैप्चर करेगा और इसे टेस्ट आउटपुट में दिखाएगा। करता है दृश्य स्टूडियो आउटपुट (या तत्काल) विंडो में दिखाई देते हैं जब एक इकाई परीक्षण डिबगिंग (लेकिन बस डिबगिंग के बिना परीक्षण चल रहा है जब)। डिबग और रिलीज़ दोनों में डिफ़ॉल्ट रूप से उपलब्ध बनाता है (अर्थात, जब TRACE स्थिरांक को परिभाषित किया जाता है)।

विजुअल स्टूडियो 2013 प्रोफेशनल में पुष्टि की।


1
ध्यान दें कि यदि आप NUnit और NUnit टेस्ट एडॉप्टर एक्सटेंशन का उपयोग Visual Studio के लिए बिल्ट-इन Microsoft परीक्षण ढांचे के बजाय करते हैं तो नियम थोड़े अलग हैं।
योयो

9

आप उपयोग कर सकते हैं

Trace.WriteLine()

एक इकाई परीक्षण डिबगिंग करते समय आउटपुट विंडो पर लिखने के लिए ।


5

Visual Studio 2017 में, "TestContext" आउटपुट एक्सप्लोरर को टेस्ट एक्सप्लोरर में नहीं दिखाता है।

हालाँकि, Trace.Writeline () आउटपुट लिंक दिखाता है।


सिर्फ एक FYI करें, इसका Trace.WriteLine
TroySteven

4

सबसे पहले सभी यूनिट परीक्षण, डिजाइन द्वारा , पूरी तरह से बातचीत के बिना चलाने वाले हैं।

उस तरफ के साथ, मुझे नहीं लगता कि ऐसी कोई संभावना थी जिसके बारे में सोचा गया था।

आप AllocConsole P / Invoke के साथ हैकिंग की कोशिश कर सकते हैं जो आपके वर्तमान एप्लिकेशन के GUI एप्लिकेशन होने पर भी कंसोल खोल देगा। तब Consoleवर्ग अब खुले कंसोल पर पोस्ट करेगा।


1
हम्म .. मेरा मुख्य मकसद कुछ गहरे विवरण देखने के लिए सांत्वना देने के लिए कुछ अतिरिक्त डेटा लिखना है। यह एडहॉक चीज होगी जिसकी मुझे बाद में जरूरत नहीं होगी।
पेंसिलकेक


2

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

हम इस संदेश को विजुअल स्टूडियो टेस्ट एक्सप्लोरर विंडो में कैसे फेंक सकते हैं?

इस तरह नमूना कोड काम करना चाहिए:

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

आपके पास इसके लिए एक अलग वर्ग हो सकता है।


मैंने सोचा कि मैं इसे भी जोड़ दूंगा। XUNIT का उपयोग करके विज़ुअल स्टूडियो 2019 में आप निम्न कार्य कर सकते हैं: Assert.True (सफलता, "DELETE RECORD FAILED"); DELETE RECORD FAILED को वीएस 2019 टेस्ट एक्सप्लोरर में दिखाया जाएगा। फिर, ऊपर दिए गए उत्तर की तरह, यह केवल तभी काम करता है जब आपका यूनिट परीक्षण अपेक्षित स्थिति में विफल हो गया हो।
ट्रॉयसेवेन

1

मेरे पास एक आसान समाधान है (जो मैंने हाल ही में खुद का इस्तेमाल किया, एक आलसी कारणों के लिए)। इस विधि को उस वर्ग में जोड़ें जिसमें आप काम कर रहे हैं:

public static void DumbDebug(string message)
{
    File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb. I wish Microsoft had more obvious solutions to its solutions problems.");
}

फिर ... निर्देशिका AdHocConsole खोलें, और बनाए गए समय के अनुसार ऑर्डर करें। जब आप अपने 'प्रिंट स्टेटमेंट' जोड़ते हैं, तो सुनिश्चित करें। हालांकि वे अलग हैं, वरना बाजीगरी होगी।


0

मैक के लिए विजुअल स्टूडियो

मैक के लिए विजुअल स्टूडियो पर किसी भी अन्य समाधान ने काम नहीं किया

यदि आप NUnit का उपयोग कर रहे हैं , तो आप अपने समाधान में एक छोटा सा .NET कंसोल प्रोजेक्ट जोड़ सकते हैं, और फिर उस नए कंसोल प्रोजेक्ट के संदर्भ में आप जिस प्रोजेक्ट का परीक्षण करना चाहते हैं, उसका संदर्भ लें

आप अपने [Test()]तरीकों से जो कुछ भी कर रहे थे वह Mainइस तरह से कंसोल एप्लिकेशन में किया जा सकता है :

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the unit test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

आप उपयोग कर सकते हैं Console.Writeऔर Console.WriteLineइन परिस्थितियों में अपने कोड में।

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