如何从单元测试中写出输出?

时间:2011-01-24 20:35:53

标签: c# visual-studio unit-testing debugging mstest

我的单元测试中对Debug.Write(line)Console.Write(Line)的任何调用都会在调试时跳过,并且永远不会打印输出。从我正在使用的类中调用这些函数。

我知道单元测试是自动化的,但我仍然希望能够从单元测试中输出消息。

17 个答案:

答案 0 :(得分:134)

谈话有点晚了。

我还试图让Debug或Trace或Console或TestContext在单元测试中工作。

这些方法都不会在输出窗口中显示工作或显示输出。

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

VS2012及更强
(来自评论)在Visual Studio 2012中,没有图标。相反,测试结果中有一个名为输出的链接。如果您点击该链接,则会看到所有WriteLine

VS2012之前
然后我在测试结果窗口中注意到,在运行测试后,在小成功绿色圆圈旁边,还有另一个图标,我加倍点击它。这是我的测试结果,它包括了上述所有类型的写作。

答案 1 :(得分:98)

尝试使用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中描述为“测试框架自动设置属性,然后可以在单元测试中使用。”

答案 2 :(得分:41)

在Visual Studio 2017中,您可以看到测试资源管理器的输出。

1)在你的测试方法中,Console.WriteLine(“something”);

2)运行测试。

3)在Test Explorer窗口中,单击Passed Test Method。

4)然后点击“输出”链接。

enter image description here

然后单击“输出”,您可以看到Console.Writeline()的结果。 enter image description here

答案 3 :(得分:10)

这取决于您的测试运行器...例如,我正在使用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 :(得分:4)

我认为它仍然是实际的。

您可以使用此NuGet包: https://www.nuget.org/packages/Bitoxygen.Testing.Pane/

从此库中调用自定义WriteLine方法 它在Output窗口中创建Testing窗格并将消息放在那里(在每次测试运行期间,独立于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));
    }
}

答案 5 :(得分:2)

VS 2019

  1. 在VS主菜单栏中,单击:View-> Test Explorer
  2. 在测试资源管理器->调试中右键单击您的测试方法
  3. 点击additional output链接,如下面的屏幕截图所示。

enter image description here

您可以使用:

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

全部将登录到其他输出窗口。

答案 6 :(得分:1)

如果您使用 dotnet test 运行测试,您可能会发现 Console.Error.WriteLine 产生输出。

这就是我解决 NUnit 测试问题的方法,这些测试似乎也抑制了所有调试、跟踪和标准输出。

答案 7 :(得分:0)

如果您选择了正确的输出,那么

Trace.WriteLine应该可以工作(在“输出”窗口中找到标有“显示输出”的下拉列表)

答案 8 :(得分:0)

我正在使用xunit所以这就是我使用的:Debugger.Log(0, "1", input);

PS:您可以使用Debugger.Break();,这样您就可以看到您登录out

答案 9 :(得分:0)

解决了以下示例:

public void CheckConsoleOutput()
    {
        Console.WriteLine("Hi Hi World");
        Trace.WriteLine("Trace Trace the World");
        Debug.WriteLine("Debug Debug WOrld");
        Assert.IsTrue(true);
    }

运行此测试后,在&#39; Test Passed&#39;下,可以选择查看输出,这将显示输出窗口。

答案 10 :(得分:0)

当我的测试/测试设置/默认处理器架构设置和我的测试项目引用的程序集不相同时,我没有输出。否则Trace.Writeline()工作正常。

答案 11 :(得分:0)

Console.WriteLine无法工作。在调试模式下,只有Debug.WriteLine()或Trace.WriteLine()可以工作。

我执行以下操作:在测试模块中包括使用System.Diagnostics 。然后,使用Debug.WriteLine作为我的输出,右键单击测试,然后选择 Debug Selected Tests 。结果输出现在将显示在下面的“输出”窗口中。我将Visual Studio 2017 vs 15.8.1与VS提供的默认单元测试框架一起使用。

答案 12 :(得分: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));

答案 13 :(得分:0)

这确实取决于@jonzim提到的测试运行程序。 对于NUnit 3,我必须使用NUnit.Framework.TestContext.Progress.WriteLine()才能在Visual Studio 2017的“输出”窗口中获得运行输出。

NUnit描述了如何:here

据我所知,这围绕着测试运行者已经获得的测试执行的并行化。

答案 14 :(得分:0)

您确定在Debug中运行单元测试吗? Debug.WriteLine不会在Release版本中出现。

要尝试的两个选项是:

  • Trace.WriteLine(),内置版本构建以及调试

  • 在单元测试的构建设置中取消定义DEBUG

答案 15 :(得分:0)

我偶然发现 DebugView(启用了 Capture > Capture Win32 选项)会捕获对 System.Console 的写入。

示例测试:

[Test]
public void FooTest()
{
    for (int i = 0; i < 5; i++)
        Console.WriteLine($"[{DateTime.UtcNow.ToString("G")}] Hello World");
}

enter image description here

答案 16 :(得分:0)

尝试使用:

Console.WriteLine()

只有在定义DEBUG时才会调用Debug.WriteLine

其他建议也可以使用:Trace.WriteLine,但我还没试过。

还有一个选项(不确定VS2008是否有)但在IDE中使用Debug.WriteLine选项运行测试时仍然可以使用Test With Debugger