วิธีเขียนลง Console.Out ในระหว่างดำเนินการทดสอบ MSTest


114

บริบท:
เรามีผู้ใช้บางรายรายงานปัญหาเกี่ยวกับคุณลักษณะการอัปโหลดไฟล์ในเว็บแอปพลิเคชันของเรา เกิดขึ้นเป็นครั้งคราวและไม่มีรูปแบบพิเศษใด ๆ เราพยายามคิดมานานแล้วโดยเพิ่มข้อมูลการดีบักทุกที่ที่คิดว่าอาจช่วยได้รวบรวมข้อมูลบันทึก ฯลฯ แต่เราไม่สามารถทำซ้ำหรือคิดออกได้

ปัญหา:
ตอนนี้ฉันพยายามทำซ้ำโดยใช้ MSTest และ WatiN เพื่อทำซ้ำการดำเนินการที่ควรจะล้มเหลวเป็นจำนวนมาก (หลายร้อยครั้ง) เพื่อให้ได้เบาะแสว่าการทดสอบลูปไปได้ไกลแค่ไหนฉันต้องการพิมพ์สิ่งที่ชอบ:

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));

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

คำถาม:
มีวิธีใดบ้างที่ฉันจะได้รับเอาต์พุตคอนโซลในหน้าต่างเอาต์พุตระหว่างการดำเนินการทดสอบ


หากคุณมองหาวิธีพิมพ์ไปยังผลลัพธ์การทดสอบ: stackoverflow.com/a/4787047/621690
Risadinha

คำตอบ:


111

เอาต์พุตคอนโซลไม่ปรากฏเนื่องจากโค้ดแบ็กเอนด์ไม่ทำงานในบริบทของการทดสอบ

คุณน่าจะดีกว่าถ้าใช้Trace.WriteLine(ใน System.Diagnostics) แล้วเพิ่มตัวฟังการติดตามที่เขียนไปยังไฟล์

หัวข้อนี้จาก MSDNแสดงวิธีการดำเนินการนี้


ตามความคิดเห็นของ Marty Neal และ Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");

73
โดยทั่วไป Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal

7
อืมมผมพบว่าข้อเสนอแนะโดย @ Martin โอนีลจะส่งทั้งสองTrace.WriteLine()และConsole.WriteLine()การส่งออกไปยังผลการทดสอบดู , ไม่ดูเอาท์พุท (และโปรดทราบว่าในมุมมองผลการทดสอบอาจจำเป็นต้องเพิ่มคอลัมน์ผลลัพธ์ (Stdout)โดยคลิกขวาแล้วเลือกเพิ่ม / ลบคอลัมน์ ... ) แต่บางทีฉันอาจยังไม่เห็นผลลัพธ์ในผลลัพธ์ ดูหมายความว่าฉันขาดอะไรบางอย่าง ...
DavidRR

3
Trace.Listeners.Add(new ConsoleTraceListener());เพียงพอแล้วแสดงผลลัพธ์จาก Debug ในหน้าต่างเอาต์พุต
Dave Anderson

3
ฉันกำลังดิ้นรนเพื่อค้นหาผลลัพธ์ใน VS2017 ... หน้าต่าง TestExplorer -> คลิกที่การทดสอบแต่ละรายการ -> หากการทดสอบมี ouput ในหน้าต่างรายละเอียดภายใต้เวลาที่ผ่านไปจะมีคำว่า "ouput" ซึ่งเป็นลิงก์ไปยัง หน้าต่างใหม่
Mike Walsh

2
หากคุณใช้ Xunit เพียงแค่ใช้ ITestOutputHelper ผ่าน ctor แล้วโทรไปที่ WriteLine ใช้เวลาสักครู่ก่อนที่ฉันจะพบวิธีเขียนระหว่างการทดสอบการรวมระบบหวังว่านี่จะช่วยใครบางคนได้
Alexander Høst

69

ใช้ไฟล์Debug.WriteLine. สิ่งนี้จะแสดงข้อความของคุณในOutputหน้าต่างทันที ข้อ จำกัด เพียงประการเดียวคือคุณต้องทำการทดสอบในDebugโหมด

[TestMethod]
public void TestMethod1()
{
    Debug.WriteLine("Time {0}", DateTime.Now);
    System.Threading.Thread.Sleep(30000);
    Debug.WriteLine("Time {0}", DateTime.Now);
}

เอาท์พุต

ใส่คำอธิบายภาพที่นี่


8
กำหนดusing System.Diagnostics;
kmote

5
อย่าใช้ DateTime.Now ใช้ Stopwatch ดีกว่า ( msdn.microsoft.com/en-us/library/… )
suizo

1
ฉันไม่สามารถทำงานนี้ได้ เมื่อฉันทำการทดสอบหน้าต่างเอาต์พุตจะเปลี่ยนเป็น Build ทันทีและไม่มีสิ่งใดถูกส่งไปยัง Debug ความคิดของคุณ?
InteXX

5
@InteXX ให้แน่ใจว่าคุณคลิก "แก้จุดบกพร่องการทดสอบ" ไม่ใช่ "เรียกใช้การทดสอบ" มันได้ผลสำหรับฉัน
John Henckel

@JohnHenckel: ก็อตช่า. ขอบคุณ จะทำอย่างนั้น. ในความเป็นจริง Schaliasos พูดอย่างนั้นถูกต้องในคำตอบของเขา ไม่แน่ใจว่าพลาดไปได้อย่างไร
InteXX

13

ฉันพบวิธีแก้ปัญหาของตัวเอง ฉันรู้ว่าคำตอบของ Andras น่าจะตรงกับ MSTEST มากที่สุด แต่ฉันไม่รู้สึกอยากเปลี่ยนรหัสของฉัน

[TestMethod]
public void OneIsOne()
{
    using (ConsoleRedirector cr = new ConsoleRedirector())
    {
        Assert.IsFalse(cr.ToString().Contains("New text"));
        /* call some method that writes "New text" to stdout */
        Assert.IsTrue(cr.ToString().Contains("New text"));
    }
}

ทิ้งConsoleRedirectorถูกกำหนดให้เป็น:

internal class ConsoleRedirector : IDisposable
{
    private StringWriter _consoleOutput = new StringWriter();
    private TextWriter _originalConsoleOutput;
    public ConsoleRedirector()
    {
        this._originalConsoleOutput = Console.Out;
        Console.SetOut(_consoleOutput);
    }
    public void Dispose()
    {
        Console.SetOut(_originalConsoleOutput);
        Console.Write(this.ToString());
        this._consoleOutput.Dispose();
    }
    public override string ToString()
    {
        return this._consoleOutput.ToString();
    }
}

3

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


ฉันจะได้รับสิ่งที่จะแสดงSystem.Diagnostics.Debug.WriteLineในขณะที่ทดสอบการแก้จุดบกพร่อง แต่คุณConsole.WriteLineจะทำงานอย่างไร สิ่งนี้ไม่ได้จบลงในเอาต์พุตปกติ (อัปเดตสด) สำหรับฉัน
หรือผู้ทำแผนที่

คุณพบวิธีใด ๆ ในการดูผลลัพธ์ขณะทำการทดสอบหรือไม่?
hima

0

คุณควรตั้งค่าการทดสอบเดี่ยวและสร้างการทดสอบประสิทธิภาพจากการทดสอบนี้ ด้วยวิธีนี้คุณสามารถตรวจสอบความคืบหน้าโดยใช้ชุดเครื่องมือเริ่มต้น


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

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