ฉันจะเขียนผลลัพธ์จากการทดสอบหน่วยได้อย่างไร


113

การเรียกใด ๆ ในหน่วยของฉันจะทดสอบไปที่อย่างใดอย่างหนึ่งDebug.Write(line)หรือConsole.Write(Line)เพียงแค่ข้ามไปในขณะที่ดีบักและผลลัพธ์จะไม่ถูกพิมพ์ออกมา เรียกใช้ฟังก์ชันเหล่านี้จากในชั้นเรียนฉันใช้งานได้ดี

ฉันเข้าใจดีว่าการทดสอบหน่วยนั้นเป็นไปโดยอัตโนมัติ แต่ฉันก็ยังต้องการให้สามารถส่งออกข้อความจากการทดสอบหน่วยได้

คำตอบ:


128

ลองใช้ TestContext.WriteLine()ข้อความที่แสดงผลในผลการทดสอบ

ตัวอย่าง:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

"เวทมนตร์" อธิบายไว้ในMSDNว่า "กรอบการทดสอบจะตั้งค่าคุณสมบัติโดยอัตโนมัติซึ่งคุณสามารถใช้ในการทดสอบหน่วยได้"


7
ฉันพบ (กับ VS2013) ว่าสิ่งนี้พิมพ์เฉพาะบางอย่างหากการทดสอบทำงานในโหมดดีบัก
fusi

3
ดูเหมือนว่าการใช้ TestContext ต้องใช้ VS2015 Enterprise (หรือรุ่นพรีเมี่ยมของรุ่นก่อนหน้า) ตามเอกสารนี้
Patrick Steadman

ฉันสังเกตว่าถ้าสตริงของคุณมีวงเล็บปีกกาอยู่วิธีการนี้จะระเบิด ดังนั้น "_testContext.WriteLine (" สวัสดี ");" ใช้งานได้ แต่ "_testContext.WriteLine (" he {ll} o ");" ล้มเหลวด้วย "System.FormatException: สตริงอินพุตไม่อยู่ในรูปแบบที่ถูกต้อง"
Mike K

1
วิธี WriteLine ใน TestContext ใช้พารามิเตอร์เดียวกันกับที่ Console.WriteWriteLine ใช้ นั่นหมายความว่าสตริงนั้นเป็นสตริงการจัดรูปแบบ (มีเอกสารที่docs.microsoft.com/en-us/dotnet/standard/base-types/… ) ในการใช้ลิเทอรัล {ในสตริงคุณต้องเพิ่มเป็นสองเท่า ในการพิมพ์สตริงของคุณให้ใช้ WriteLine ("he {ll}} o");
Walter

1
สิ่งนี้น่าสนใจ ... แม้ว่าฉันจะยังไม่รู้ว่าทำไมพวกเขาไม่เพิ่มสิ่งนี้และคุณสมบัติที่คล้ายกันลงในคลาสพื้นฐานหรืออินเทอร์เฟซที่เราสามารถใช้จากเฟรมเวิร์กเพื่อหลีกเลี่ยงความสับสน
Niklas

149

ฉันยังพยายามรับ Debug หรือ Trace หรือ Console หรือ TestContext เพื่อทำงานในการทดสอบหน่วย

วิธีการเหล่านี้ดูเหมือนจะไม่ทำงานหรือแสดงผลลัพธ์ในหน้าต่างผลลัพธ์:

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

Visual Studio 2012 ขึ้นไป

(จากความคิดเห็น)ใน Visual Studio 2012 ไม่มีไอคอน แต่จะมีลิงก์ในผลการทดสอบที่เรียกว่าเอาต์พุตแทน หากคุณคลิกที่ลิงก์คุณจะเห็นไฟล์WriteLine.

ก่อน Visual Studio 2012

จากนั้นฉันสังเกตเห็นในหน้าต่างผลการทดสอบของฉันหลังจากเรียกใช้การทดสอบถัดจากวงกลมสีเขียวความสำเร็จเล็ก ๆมีไอคอนอื่น ฉันคลิกสองครั้ง เป็นผลการทดสอบของฉันและรวมถึงการเขียนทุกประเภทข้างต้น


44
ใน Visual Studio 2012 ไม่มีไอคอน แต่จะมีลิงก์ในผลการทดสอบที่เรียกว่า "เอาต์พุต" แทน หากคุณคลิกที่ลิงค์คุณจะเห็นข้อเขียนทั้งหมด
epotter

16
geez ลิงก์ "เอาต์พุต" นั้นหาได้ยาก ถ้าใครหาไม่เจอก็อยู่ใน Text Explorer ส่วนด้านล่าง เมื่อเลือกการทดสอบจะแสดงผลลัพธ์เป็น "Elapsed time: xxx" ด้านล่างนี้คือลิงก์ "ผลลัพธ์"
kevin

@kevin คุณเห็น VS ในเวอร์ชันใด (ฉันสมมติว่าคุณหมายถึง "Test Explorer" แทนที่จะเป็น "Text Explorer) ฉันไม่เห็นลิงก์ผลลัพธ์ใน VS2013 express
Mike C

1
หากมีใครสงสัย (เช่นฉัน) ว่าสิ่งใดบ้างที่ปรากฏในไฟล์ TRX (ผลลัพธ์การทดสอบ) ทั้งหมดข้างต้นยกเว้น "Debug.WriteLine"
Badgerspot

4
ใน Visual Studio 2017 ยังคงเป็นลิงก์ "ผลลัพธ์"
HankCa

66

ใน Visual Studio 2017 คุณสามารถดูผลลัพธ์จากนักสำรวจทดสอบ

1) ในวิธีการทดสอบของคุณ Console.WriteLine ("something");

2) ทำการทดสอบ

3) ในหน้าต่าง Test Explorer คลิกที่ Passed Test Method

4) แล้วคลิกลิงก์ "ผลลัพธ์"

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

แล้วคลิก "Output" คุณจะเห็นผลลัพธ์ของ Console.Writeline () ใส่คำอธิบายภาพที่นี่


1
ยอดเยี่ยม. Visual Studio / C # ไม่ใช่บรรทัดฐานของฉันในการพัฒนานี่คือสิ่งที่ฉันต้องการ! ขอขอบคุณสำหรับการโพสต์นี้.
matt32

10
ฉันใช้ 2017 เวอร์ชัน 15.5.6 บิต O ไม่เห็นลิงค์ผลลัพธ์
Mike IT

1
ขึ้นอยู่กับกรอบการทดสอบที่ใช้อยู่หรือไม่? ฉันใช้ xUnit 2.4 ในโครงการทดสอบ. NET 4.6 และไม่มีบานหน้าต่าง "เอาต์พุตมาตรฐาน" ปรากฏขึ้น เอาต์พุตจากConsole.WriteLineจะไม่ปรากฏในบานหน้าต่างเอาต์พุตภายใต้ "การทดสอบ" เช่นกัน
Qwertie

สำหรับ xUnit คำตอบของ jonzim ใช้ได้ผลสำหรับฉันแม้จะใช้เธรดอื่นที่เกิดจากการทดสอบก็ตาม
Qwertie

1
สำหรับผู้ที่ไม่เห็นลิงก์ "เอาต์พุต" 1) คุณควรเลือกแบบทดสอบวิธีการ 2) ปล่อยให้หน้าต่าง Test Explorer เติมหน้าต่าง VS ในแนวตั้งมิฉะนั้นลิงก์จะถูกซ่อนและแถบเลื่อนมีขนาดเล็กเกินไปที่จะสังเกตเห็นหรือใช้งานได้
แมวเหมียว 2012

18

ขึ้นอยู่กับนักวิ่งทดสอบของคุณ ... ตัวอย่างเช่นฉันใช้xUnitดังนั้นในกรณีที่คุณใช้อยู่ให้ทำตามคำแนะนำเหล่านี้:

https://xunit.github.io/docs/capturing-output.html

วิธีนี้จัดกลุ่มผลลัพธ์ของคุณด้วยการทดสอบแต่ละหน่วยโดยเฉพาะ

using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
    private readonly ITestOutputHelper output;

    public MyTestClass(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void MyTest()
    {
        var temp = "my class!";
        output.WriteLine("This is output from {0}", temp);
    }
}

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


4

ฉันคิดว่ามันยังคงมีอยู่จริง

คุณสามารถใช้แพ็คเกจNuGet : Bitoxygen.Testing.Pane

เรียกใช้เมธอดWriteLine ที่กำหนดเองจากไลบรารีนี้ สร้างบานหน้าต่างการทดสอบภายในหน้าต่างผลลัพธ์และใส่ข้อความไว้ที่นั่นเสมอ (ในระหว่างการทดสอบแต่ละครั้งจะทำงานโดยไม่ขึ้นกับแฟล็ก DEBUG และ TRACE)

เพื่อให้การติดตามง่ายขึ้นฉันขอแนะนำให้สร้างคลาสพื้นฐาน:

[TestClass]
public abstract class BaseTest
{
    #region Properties
    public TestContext TestContext { get; set; }

    public string Class
    {
        get { return this.TestContext.FullyQualifiedTestClassName; }
    }
    public string Method
    {
        get { return this.TestContext.TestName; }
    }
    #endregion

    #region Methods
    protected virtual void Trace(string message)
    {
        System.Diagnostics.Trace.WriteLine(message);

        Output.Testing.Trace.WriteLine(message);
    }
    #endregion
}

[TestClass]
public class SomeTest : BaseTest
{
    [TestMethod]
    public void SomeTest1()
    {
        this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
    }
}

1
ความมหัศจรรย์อยู่ที่: Output.Testing.Trace.WriteLine (ข้อความ); ด้วย BitOxygen
Bimal Poudel

ใช้ไม่ได้กับ Visual Studio เวอร์ชันปัจจุบันที่คุณได้รับข้อผิดพลาดCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
คอนโซล

@Console ใช่มันต้องการการสนับสนุน แต่ฉันไม่แน่ใจว่าชุมชนมีความน่าสนใจในการส่งออกด้วยวิธีนี้หรือไม่ xUnit มี OutputHandler และ VS สามารถแสดงผลลัพธ์ได้
Maxim

1

ลองใช้:

Console.WriteLine()

การโทรหาDebug.WriteLineจะทำได้เฉพาะในช่วงที่มีการกำหนด DEBUG เท่านั้น

คำแนะนำอื่น ๆ ให้ใช้: Trace.WriteLineเช่นกัน แต่ฉันยังไม่ได้ลอง

นอกจากนี้ยังมีตัวเลือก (ไม่แน่ใจว่ามี Visual Studio 2008 หรือไม่) แต่คุณยังสามารถใช้Debug.WriteLineเมื่อคุณเรียกใช้การทดสอบด้วยTest With Debuggerตัวเลือกใน IDE


1

แก้ไขได้ด้วยตัวอย่างต่อไปนี้:

public void CheckConsoleOutput()
{
    Console.WriteLine("Hello, World!");
    Trace.WriteLine("Trace Trace the World");
    Debug.WriteLine("Debug Debug World");
    Assert.IsTrue(true);
}

หลังจากเรียกใช้การทดสอบนี้ภายใต้ 'ผ่านการทดสอบ' จะมีตัวเลือกในการดูผลลัพธ์ซึ่งจะเปิดหน้าต่างผลลัพธ์ขึ้นมา


1

มันขึ้นอยู่กับนักวิ่งทดสอบตามที่ @jonzim กล่าวไว้ สำหรับ NUnit 3 ฉันต้องใช้NUnit.Framework.TestContext.Progress.WriteLine()เพื่อเรียกใช้เอาต์พุตในหน้าต่างเอาต์พุตของ Visual Studio 2017

NUnit อธิบายวิธีการ: ที่นี่

ตามความเข้าใจของฉันสิ่งนี้หมุนรอบการดำเนินการทดสอบแบบขนานเพิ่มเติมที่นักวิ่งทดสอบได้รับ


0

ฉันไม่ได้รับผลลัพธ์เมื่อการตั้งค่าการทดสอบ / การทดสอบการตั้งค่า / สถาปัตยกรรมโปรเซสเซอร์เริ่มต้นและชุดประกอบที่อ้างอิงโครงการทดสอบของฉันไม่เหมือนกัน มิฉะนั้น Trace.Writeline () ทำงานได้ดี


0

Console.WriteLine ไม่ทำงาน เฉพาะ Debug.WriteLine () หรือ Trace.WriteLine () เท่านั้นที่จะทำงานในโหมดดีบัก

ฉันทำสิ่งต่อไปนี้: รวมการใช้ System.Diagnosticsในโมดูลทดสอบ จากนั้นใช้ Debug.WriteLine สำหรับการส่งออกของฉันคลิกขวาที่การทดสอบเลือกการทดสอบตรวจแก้จุดบกพร่องที่เลือก ผลลัพธ์ผลลัพธ์จะปรากฏในหน้าต่างผลลัพธ์ด้านล่าง ฉันใช้ Visual Studio 2017 เทียบกับ 15.8.1 โดยมี VS กรอบการทดสอบหน่วยเริ่มต้น


0

คุณแน่ใจหรือไม่ว่าคุณกำลังทำการทดสอบหน่วยของคุณใน Debug? Debug.WriteLineจะไม่ถูกเรียกในรุ่น Release

สองตัวเลือกที่ควรลองคือ:

  • Trace.WriteLine () ซึ่งสร้างขึ้นในรุ่น release และ debug

  • ยกเลิกการกำหนด DEBUG ในการตั้งค่าบิลด์ของคุณสำหรับการทดสอบหน่วย



0

สาเหตุ / แนวทางแก้ไขที่แตกต่างกัน:

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

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

ดังนั้นการทดสอบจึงไม่เขียนลงคอนโซลก่อนที่อ็อบเจ็กต์คอนโซลจะถูกล้างโดยรันไทม์ (เมื่อรันการทดสอบเพียงครั้งเดียว)

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

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));

0

ในVS 2019

  1. ในแถบเมนูหลักของ VS คลิก: View ->Test Explorer
  2. คลิกขวาที่วิธีการทดสอบของคุณใน Test Explorer -> Debug
  3. คลิกadditional outputลิงก์ตามที่เห็นในภาพหน้าจอด้านล่าง

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

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

  • Debug.WriteLine
  • Console.WriteLine
  • TestContext.WriteLine

ทั้งหมดจะเข้าสู่หน้าต่างผลลัพธ์เพิ่มเติม


-1

Trace.WriteLineควรใช้งานได้หากคุณเลือกเอาต์พุตที่ถูกต้อง (ดรอปดาวน์ที่มีข้อความ "แสดงเอาต์พุตจาก" ที่พบในหน้าต่างเอาต์พุต )

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