ฉันสามารถเขียนลงในคอนโซลในการทดสอบหน่วยได้หรือไม่ ถ้าใช่ทำไมไม่เปิดหน้าต่างคอนโซล


148

ฉันมีโครงการทดสอบใน Visual Studio ฉันใช้Microsoft.VisualStudio.TestTools.UnitTesting

ฉันเพิ่มบรรทัดนี้ในหนึ่งในการทดสอบหน่วยของฉัน:

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

เมื่อฉันรันการทดสอบการทดสอบจะผ่านไป แต่หน้าต่างคอนโซลจะไม่เปิดเลย

มีวิธีทำให้หน้าต่างคอนโซลพร้อมใช้งานเพื่อให้สามารถโต้ตอบผ่านการทดสอบหน่วยได้หรือไม่


1
มันขึ้นอยู่กับนักวิ่ง คุณสามารถใช้ TestDriven.Net (ยอดเยี่ยมฟรีสำหรับการใช้งานส่วนตัวนักวิ่งทดสอบ) - Console.WriteLine จะเขียนลงในช่องผลลัพธ์ VS
อาวุโส

1
ขอบคุณสำหรับการเผยแพร่คำศัพท์ใน TestDriven.Net
GrayFox374

NCrunch ยังมีคุณสมบัตินี้ซึ่งทำให้ราคา IMO คุ้มค่า ฉันมีDumpวิธีการขยายที่แสดงเนื้อหาของวัตถุลงในคอนโซลทำให้การดีบักง่ายขึ้นมาก i.imgur.com/MEZwy7X.png
DharmaTurtle

คำตอบ:


125

หมายเหตุ: คำตอบดั้งเดิมด้านล่างควรใช้กับ Visual Studio รุ่นใดก็ได้ผ่าน Visual Studio 2012 Visual Studio 2013 ไม่ปรากฏว่ามีหน้าต่างผลลัพธ์การทดสอบอีกต่อไป หากคุณต้องการเอาต์พุตเฉพาะการทดสอบคุณสามารถใช้คำแนะนำของ @ Stretch ในTrace.Write()การเขียนเอาต์พุตไปที่หน้าต่างเอาต์พุต


Console.Writeวิธีการไม่ได้เขียนถึง "คอนโซล" - มันเขียนจดหมายไปหาสิ่งที่จะขึ้นไปติดยาเสพติดที่จับออกมาตรฐานสำหรับกระบวนการทำงาน ในทำนองเดียวกันConsole.Readอ่านอินพุตจากสิ่งที่เชื่อมต่อกับอินพุตมาตรฐาน

เมื่อคุณเรียกใช้การทดสอบหน่วยผ่าน Visual Studio 2010 เอาต์พุตมาตรฐานจะถูกเปลี่ยนเส้นทางโดยชุดควบคุมการทดสอบและเก็บไว้เป็นส่วนหนึ่งของเอาต์พุตการทดสอบ คุณสามารถดูได้โดยคลิกขวาที่หน้าต่างผลการทดสอบและเพิ่มคอลัมน์ชื่อ "เอาท์พุท (StdOut)" ไปยังจอแสดงผล สิ่งนี้จะแสดงสิ่งที่เขียนไปยังเอาต์พุตมาตรฐาน

คุณสามารถเปิดหน้าต่างคอนโซลด้วยตนเองโดยใช้P / Invokeเป็นsinni800 กล่าวว่า จากการอ่านAllocConsoleเอกสารปรากฏว่าฟังก์ชั่นจะรีเซ็ตstdinและstdoutจัดการให้ชี้ไปที่หน้าต่างคอนโซลใหม่ (ฉันไม่แน่ใจ 100% เกี่ยวกับเรื่องนี้ดูเหมือนฉันจะผิดถ้าฉันได้เปลี่ยนเส้นทางstdoutให้ Windows ขโมยไปจากฉันแล้ว แต่ฉันยังไม่ได้ลอง)

โดยทั่วไปแล้วฉันคิดว่ามันเป็นความคิดที่ไม่ดี หากสิ่งที่คุณต้องการใช้คอนโซลสำหรับคือการถ่ายโอนข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบหน่วยของคุณผลลัพธ์จะมีสำหรับคุณ ใช้ต่อไปConsole.WriteLineอย่างที่เป็นอยู่และตรวจสอบผลลัพธ์ที่ได้ในหน้าต่างผลการทดสอบเมื่อเสร็จสิ้น


ลองเปิด WindowsApplication ใหม่โดยใช้ AllocConsole เพื่อจัดสรรคอนโซลและมันจะเขียนตรงนั้น ฉันไม่รู้ว่ามันทำอะไรจริง ๆ แต่มันอาจไม่ทำงานในสภาพแวดล้อมการทดสอบหน่วย มันคงจะดีถ้ารู้ ...
sinni800

การบริหารทรัพยากรมนุษย์ อ่านAllocConsoleเอกสารอีกครั้งฉันอาจไม่ถูกต้อง แต่ฉันต้องทดสอบ
Michael Edenfield

2
สำหรับฉันความคิดเห็นนี้จากไมเคิลกล่าวว่าทุกสิ่งที่ฉันต้องคิดเกี่ยวกับ: "เมื่อคุณรันการทดสอบหน่วยผ่าน VS2010 เอาต์พุตมาตรฐานจะถูกเปลี่ยนเส้นทางโดยชุดควบคุมการทดสอบและเก็บไว้เป็นส่วนหนึ่งของเอาต์พุตการทดสอบ"
Robert Patterson

5
ใน VS2013 หากคุณเขียนบนคอนโซลจะมีป้ายชื่อลิงก์ [Output] ใน TestExplorer / Test / Summary คลิกที่มันและคุณจะได้รับผลลัพธ์ที่ต้องการ รอ? คุณต้องการโทรหา Console.ReadLine () ??
Visar

3
ใน V2017 (ชุมชน) ให้ไปที่ "test explorer" เลือกรายการผลการทดสอบในรายการจากนั้นคลิกที่ลิงค์ "เอาท์พุท" ในหน้าต่างอื่น (หน้าต่างผลการทดสอบ?) เนื่องจากอาจถูกตัดให้ใช้ "คัดลอกทั้งหมด" และผ่านที่อื่น
heringer

181

มีคนแสดงความคิดเห็นเกี่ยวกับฟังก์ชั่นใหม่ที่เห็นได้ชัดใน Visual Studio 2013 ฉันไม่แน่ใจว่าสิ่งที่เขาหมายถึงในตอนแรก แต่ตอนนี้ฉันทำฉันคิดว่ามันสมควรได้รับคำตอบของตัวเอง

เราสามารถใช้ Console.WriteLine ได้ตามปกติและเอาท์พุทจะปรากฏขึ้นไม่เพียง แต่ในหน้าต่าง Output แต่ในหน้าต่างใหม่หลังจากที่เราคลิกที่ "เอาท์พุท" ในรายละเอียดการทดสอบ

ป้อนคำอธิบายภาพที่นี่


2
ทางออกที่ดีเยี่ยม ยืนยันว่าทำงานได้ใน VS2015 Enterprise
garfbradaz

6
น่าเสียดายที่ไม่มีใครสามารถเลือกข้อความใด ๆ ในพื้นที่เอาท์พุทสำหรับการคัดลอกและวาง :( พวกเขากำลังคิดอะไรอยู่!
หรือผู้ทำแผนที่

3
@ORMapper คลิกขวาที่พื้นที่ "เอาท์พุทมาตรฐาน" และเลือกคัดลอกทั้งหมด
bychance

2
@ Ovi-WanKenobi ลองแสดงผลบางอย่างด้วย Console.Write
Tiago Duarte

5
ในปี 2560 คุณต้องเลือกการทดสอบแต่ละแบบที่รันแล้วคลิกผลลัพธ์ - ไม่มีประโยชน์มากเมื่อคุณมีการทดสอบจำนวนมาก ฉันต้องการที่จะเห็นผลลัพธ์ทั้งหมดเข้าด้วยกันไม่ใช่ในหน้าต่างแยกต่างหาก
inliner49er

37

คุณสามารถใช้บรรทัดนี้เพื่อเขียนไปยังหน้าต่างแสดงผลของ Visual Studio:

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

ต้องทำงานในโหมดดีบั๊ก


7
มันไม่ได้เขียนใน VS ของฉัน
Luis Filipe

1
ตรวจสอบหัวข้อนี้สำหรับรายละเอียด - stackoverflow.com/questions/1159755/…
Dmitry Pavlov

1
สิ่งนี้ใช้ได้ผลดีมากสำหรับฉันที่ใช้ MSTest และ R # เพื่อดูผลลัพธ์ ขอบคุณ!
Isaac Baker

2
@ วิลเลียมจะปรากฏขึ้นหากคุณทำการดีบักการทดสอบ แต่ไม่ใช่ถ้าคุณเรียกใช้โดยไม่ทำการดีบั๊ก
yoyo

29

ตามที่ระบุไว้การทดสอบหน่วยถูกออกแบบมาให้ทำงานโดยไม่มีการโต้ตอบ

อย่างไรก็ตามคุณสามารถดีบักการทดสอบหน่วยเช่นเดียวกับรหัสอื่น ๆ วิธีที่ง่ายที่สุดคือใช้Debugปุ่มในแท็บผลการทดสอบ

ความสามารถในการดีบักหมายถึงความสามารถในการใช้เบรกพอยต์ ความสามารถในการใช้เบรกพอยต์นั้นหมายถึงความสามารถในการใช้Tracepointsซึ่งฉันพบว่ามีประโยชน์อย่างมากในการดีบักทุกวัน

โดยพื้นฐานแล้ว Tracepoints ช่วยให้คุณสามารถเขียนไปยังเอาต์พุตหน้าต่าง (หรือแม่นยำยิ่งขึ้นไปยังเอาต์พุตมาตรฐาน) คุณสามารถรันต่อไปได้หรือคุณสามารถหยุดได้เหมือนเบรกพอยต์ปกติ สิ่งนี้จะให้ "ฟังก์ชัน" ที่คุณต้องการโดยไม่จำเป็นต้องสร้างรหัสของคุณใหม่หรือกรอกข้อมูลด้วยข้อมูลการดีบัก

เพียงเพิ่มเบรกพอยต์จากนั้นคลิกขวาที่เบรกพอยต์นั้น เลือกตัวเลือก "เมื่อกด ... ":

เมื่อกดปุ่มตัวเลือก

ซึ่งแสดงกล่องโต้ตอบ:

เมื่อเบรกพอยต์ถูกยิง

สิ่งที่ควรทราบ:

  1. ขอให้สังเกตว่าจุดพักถูกแสดงเป็นเพชรแทนที่จะเป็นทรงกลมซึ่งแสดงถึงจุดติดตาม
  2. คุณสามารถส่งออกค่าของตัวแปรโดยล้อมรอบมันเช่น {นี้}
  3. ยกเลิกการเลือกช่องทำเครื่องหมาย "ดำเนินการต่อไป" เพื่อให้ตัวแบ่งรหัสในบรรทัดนี้เหมือนกับจุดพักปกติ
  4. คุณมีตัวเลือกในการเรียกใช้แมโคร โปรดระวัง - คุณอาจก่อให้เกิดผลข้างเคียงที่เป็นอันตราย

ดูเอกสารประกอบสำหรับรายละเอียดเพิ่มเติม


24

มีหลายวิธีในการเขียนเอาต์พุตจากการทดสอบหน่วย Visual Studio ใน C #:

  • Console.Write - เทียมทดสอบ Visual Studio จะจับภาพนี้และแสดงเมื่อคุณเลือกการทดสอบในการทดสอบ Explorer และคลิกที่ลิงค์ออก ไม่ได้แสดงใน Visual Studio หน้าต่าง Output เมื่อทั้งการวิ่งหรือการแก้จุดบกพร่องการทดสอบหน่วย (เนื้อหานี้เป็นปัญหา)
  • Debug.Write - เทียมทดสอบ Visual Studio จะจับภาพนี้และแสดงในผลการทดสอบ ไม่ปรากฏในหน้าต่างแสดงผลของ Visual Studio เมื่อทำการดีบักการทดสอบหน่วยเว้นแต่ว่าตัวเลือกการดีบัก Visual Studio จะได้รับการกำหนดค่าให้เปลี่ยนเส้นทางผลลัพธ์ไปยังหน้าต่างทันที จะไม่มีสิ่งใดปรากฏในหน้าต่างผลลัพธ์ (หรือทันที) หากคุณเพียงเรียกใช้การทดสอบโดยไม่มีการดีบัก โดยค่าเริ่มต้นพร้อมใช้งานเฉพาะในการตรวจแก้จุดบกพร่องสร้าง (นั่นคือเมื่อกำหนดค่าคงที่ DEBUG)
  • Trace.Write - ชุดทดสอบการทดสอบ Visual Studio จะจับภาพนี้และแสดงไว้ในผลลัพธ์การทดสอบ ไม่ปรากฏใน Visual Studio เอาท์พุท (หรือทันที) หน้าต่างเมื่อแก้จุดบกพร่องการทดสอบหน่วย ( แต่ไม่เมื่อเพียงแค่เรียกใช้การทดสอบโดยไม่ต้องแก้จุดบกพร่อง) โดยค่าเริ่มต้นจะมีให้ทั้งใน Debug และ Release builds (นั่นคือเมื่อกำหนดค่า TRACE คงที่)

ยืนยันใน Visual Studio 2013 Professional


1
โปรดทราบว่ากฎจะแตกต่างกันเล็กน้อยหากคุณใช้ NUnit และส่วนขยาย NUnit Test Adapter สำหรับ Visual Studio แทนที่จะเป็นเฟรมเวิร์กการทดสอบ Microsoft ในตัว
yoyo

9

คุณสามารถใช้ได้

Trace.WriteLine()

เพื่อเขียนไปยังหน้าต่างผลลัพธ์เมื่อทำการดีบั๊กการทดสอบหน่วย


5

ใน Visual Studio 2017 "TestContext" จะไม่แสดงลิงก์เอาต์พุตใน Test Explorer

อย่างไรก็ตาม Trace.Writeline () จะแสดงลิงค์เอาท์พุท


เพียงแค่ FYI, Trace.WriteLine ของมัน
TroySteven

4

การทดสอบหน่วยแรกคือการออกแบบควรทำงานอย่างสมบูรณ์โดยไม่มีการโต้ตอบ

นอกเหนือจากนั้นฉันไม่คิดว่ามีความเป็นไปได้ที่คิด

คุณสามารถลองแฮ็คด้วยAllocConsole P / Invokeซึ่งจะเปิดคอนโซลแม้ว่าแอปพลิเคชันปัจจุบันของคุณคือแอปพลิเคชัน GUI Consoleระดับแล้วจะโพสต์ไปยังคอนโซลตอนนี้เปิด


1
อืม .. แรงจูงใจหลักของฉันคือการเขียนข้อมูลพิเศษลงบนคอนโซลเพื่อดูรายละเอียดที่ลึกกว่านี้ มันจะเป็นสิ่งที่ฉันไม่ต้องการในภายหลัง
pencilCake


2

IMHO ข้อความเอาต์พุตเกี่ยวข้องเฉพาะกับกรณีทดสอบที่ล้มเหลวในกรณีส่วนใหญ่ ฉันสร้างรูปแบบด้านล่างและคุณสามารถสร้างของคุณเองได้เช่นกัน สิ่งนี้จะปรากฏในหน้าต่าง Visual Studio Test Explorer เอง

เราจะโยนข้อความนี้ในหน้าต่าง Visual Studio Test Explorer ได้อย่างไร

โค้ดตัวอย่างเช่นนี้ควรใช้งานได้:

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.");

คุณสามารถมีชั้นเรียนแยกต่างหากสำหรับเรื่องนี้สำหรับคุณ


ฉันคิดว่าฉันจะเพิ่มสิ่งนี้ด้วย ใน Visual Studio 2019 โดยใช้ XUNIT คุณสามารถทำสิ่งต่อไปนี้: Assert.True (สำเร็จ "DELETE RECORD FAILED"); ลบการบันทึกล้มเหลวจะปรากฏขึ้นใน VS 2019 ทดสอบ Explorer เช่นเดียวกับคำตอบข้างต้นสิ่งนี้ใช้ได้เฉพาะเมื่อการทดสอบหน่วยของคุณล้มเหลวตามเงื่อนไขที่คาดไว้
TroySteven

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

Visual Studio สำหรับ Mac

ไม่มีวิธีแก้ไขอื่น ๆ ที่ทำงานบน Visual Studio สำหรับ Mac

หากคุณใช้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ในรหัสของคุณภายใต้สถานการณ์เหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.