如何编写单元测试的输出?


113

我的单元中的任何调用都会在调试时忽略其中的一个,Debug.Write(line)或者Console.Write(Line)只是跳过而不会打印输出。从我正在使用的类中调用这些函数工作正常。

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

Answers:


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 2015年


我注意到,如果您的字符串中带有花括号,则该方法会崩溃。因此,“ _ testContext.WriteLine(“ hello”);“ 有效,但“ _testContext.WriteLine(” he {ll} o“);” 失败,出现“ System.FormatException:输入字符串的格式不正确。”
Mike K

1
TestContext中的WriteLine方法采用与Console.WriteWriteLine采用的相同参数。这意味着该字符串是格式字符串(在docs.microsoft.com/zh-cn/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中,没有图标。而是在测试结果中有一个称为Output的链接。如果单击链接,则会看到所有WriteLine

在Visual Studio 2012之前

然后,在运行测试后,我在“ 测试结果”窗口中注意到,成功小绿色圆圈旁边是另一个图标。我双击了它。这是我的测试结果,其中包括上面所有类型的写入行。


44
在Visual Studio 2012中,没有图标。相反,测试结果中有一个链接称为“输出”。如果单击该链接,则将看到所有写线。
epotter

16
哎呀,“输出”链接本质上很难找到。如果有人在努力寻找它,则在文本资源管理器的底部。选择一个测试后,它将显示“经过时间:xxx”的结果。在其下方是“输出”链接。
凯文(Kevin)2014年

@kevin,您在哪个版本的VS中看到了?(我假设你的意思是“测试资源管理器”,而不是“文本浏览器)。我不认为在VS2013快递的输出环节。
迈克ç

1
如果有人(像我一样)想知道其中哪一个出现在TRX(测试结果输出)文件中,则除了“ Debug.WriteLine”以外,都是上述所有内容。
Badgerspot

4
在Visual Studio 2017中,它仍然是``输出''链接。
HankCa

66

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

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

2)运行测试。

3)在“测试资源管理器”窗口中,单击“通过的测试方法”。

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

在此处输入图片说明

然后单击“输出”,您可以看到Console.Writeline()的结果。 在此处输入图片说明


1
优秀的。Visual Studio / C#不是我开发的规范,这只是我需要的!感谢您发布此信息。
matt32 '18

10
我正在使用2017版本15.5.6 Bit O没有看到输出链接。
Mike IT

1
是否取决于所使用的测试框架?我在.NET 4.6测试项目中使用xUnit 2.4,没有出现“标准输出”窗格。从输出Console.WriteLine不是在“测试”输出窗格可见无论是。
Qwertie

对于xUnit,即使在测试产生的其他线程中,jonzim的答案也对我有用。
Qwertie

1
对于那些没有看到“输出”链接的人。1)您应该选择一种测试方法。2)让“测试资源管理器”窗口垂直填充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(message); 用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是否具有它),但是在IDE中Debug.WriteLine运行带有Test With Debugger选项的测试时仍可以使用。


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作为我的输出,右键单击测试,选择Debug Selected Tests。结果输出现在将显示在下面的“输出”窗口中。我使用VS提供的默认单元测试框架使用Visual Studio 2017 vs 15.8.1。


0

您确定要在Debug中运行单元测试吗?在发布版本中不会调用Debug.WriteLine

可以尝试的两种选择是:

  • Trace.WriteLine(),已内置到发行版本以及调试中

  • 在构建设置中为单元测试取消定义调试



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. 在测试资源管理器->调试中右键单击您的测试方法
  3. 单击additional output下面的屏幕快照中所示的链接。

在此处输入图片说明

您可以使用:

  • 调试。写行
  • Console.WriteLine
  • TestContext.WriteLine

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


-1

Trace.WriteLine应该工作只要你选择正确的输出(在标有“显示输出”下拉列表中找到输出窗口)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.