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

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

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

164528 次浏览

尝试使用:

Console.WriteLine()

Debug.WriteLine的调用仅在定义 DEBUG 时进行。

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

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

您确定正在调试中运行单元测试吗? 在发布版本中不会调用 调试,写线

有两个选择可以尝试:

  • Trace.WriteLine () ,它构建在发布版本和调试中

  • 在单元测试的生成设置中取消 DEBUG 定义

尝试使用在测试结果中输出文本的 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中有所描述:

要使用 TestContext,在测试类中创建一个成员和属性[ ... ] ,测试框架会自动设置属性,然后您可以在单元测试中使用该属性。

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

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

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

VisualStudio2012及更高版本

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

VisualStudio2012之前

然后我注意到在我的 测试结果窗口中,在运行测试之后,在 小成功绿圈的旁边,有另一个图标。我点了两下。这是我的测试结果,它包含了上面提到的所有类型的写线。

我使用的是 XUnit,所以这就是我使用的:

Debugger.Log(0, "1", input);

附注: 您也可以使用 Debugger.Break();,这样您就可以在 out中看到您的日志。

如果您选择了正确的输出(在 输出窗口中标记为“ Show output from”的下拉列表) ,那么 Trace.WriteLine应该可以工作。

我觉得还是真的。

您可以使用这个 NuGet 包: 译自: 美国《科学》杂志网站(http://www.nuget.org/package/Bitoxygen.Testing.Pane/)原文地址: http://www.nuget.org/package/Bitoxygen.Testing.Pane/”rel = “ nofollow noReferrer”原文地址: http://www.bitoxy.Testing.Pane

从此库调用自定义 写作线路方法。 它在 输出窗口内创建一个 Test 窗格,并始终将消息放在那里(在每次测试期间,它独立于 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));
}
}

这取决于您的测试运行器... ... 例如,我正在使用 XUnit,所以如果您正在使用它,请遵循以下说明:

Https://xunit.net/docs/capturing-output

此方法根据每个特定的单元测试对输出进行分组。

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);
}
}

在我为写入“输出”窗口提供的链接中列出了另一种方法,但我更喜欢前一种方法。

下面的例子解决了这个问题:

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

在运行这个测试之后,在“ TestPassed”下面,有一个查看输出的选项,它将打开输出窗口。

在 VisualStudio2017中,您可以看到来自测试资源管理器的输出。

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

2)进行测试。

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

4)点击“输出”链接。

enter image description here

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

控制台。 WriteLine 无法工作。在调试模式下,只有 调试 WriteLine ()Trace WriteLine ()可以工作。

我执行以下操作: 在测试模块中包含 使用系统。诊断。然后,使用 调试,写线作为输出,右键点击测试,并选择 调试所选测试。结果输出现在下面的 输出窗口中。我使用 Visual Studio 2017 version 15.8.1,以及 Visual Studio 提供的默认单元测试框架。

原因/解决方案的另一种变体:

我的问题是,我没有得到输出,因为我正在异步上下文中的循环中从异步 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));

它确实取决于@jonzim 提到的测试运行程序。 对于 NUnit3,我必须使用 NUnit.Framework.TestContext.Progress.WriteLine()来获得 VisualStudio2017输出窗口中的运行输出。

NUnit 描述如何: 给你

根据我的理解,这是围绕着测试运行者已经接收到的测试执行的附加并行化而展开的。

VS 2019

  1. 在主 VS 菜单栏中单击: View-> Test Explorer
  2. 在 Test Explorer-> Debug 中右击您的测试方法
  3. 单击 additional output链接,如下面的截图所示。

enter image description here

你可使用:

  • 调试,写线
  • 控制台,写线
  • TestContext WriteLine

All 将记录到额外的输出窗口。

我偶然发现 调试视图(启用了 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

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

这就是我如何处理 NUnit 测试的问题,它似乎也抑制了所有的 Debug、 Trace 和标准输出。

对于测试资源管理器中的 VS2022,输出将显示在测试详细信息摘要窗格中。另外,您可以右键单击您的测试并选择“ Open test log”或者简单地选择 Control + L,测试日志将随着您的所有 Debug 一起打开。WriteLine 的评论。

此外,当. runtings 附加到单元测试时,请确保将 CaptureTraceOutput设置为 没错

<CaptureTraceOutput>True</CaptureTraceOutput>


DateTime myExpectedDateTime = sortedLPR[0].myDateTime;
DateTime myPreviousDateTime = sortedLPR[0].myDateTime;      // 1st date element
Debug.WriteLine($"(1) myPreviousDateTime: {myPreviousDateTime}");
Console.WriteLine($"(2) myPreviousDateTime: {myPreviousDateTime}");

testlog

请注意输出顺序: (2)之前(1)-调试输出之前的标准输出。