【发布时间】:2011-06-14 18:51:56
【问题描述】:
在我的单元测试中对Debug.Write(line) 或Console.Write(Line) 的任何调用都会在调试时被跳过,并且永远不会打印输出。从我正在使用的类中调用这些函数可以正常工作。
我了解单元测试旨在实现自动化,但我仍然希望能够从单元测试中输出消息。
【问题讨论】:
标签: c# visual-studio unit-testing debugging mstest
在我的单元测试中对Debug.Write(line) 或Console.Write(Line) 的任何调用都会在调试时被跳过,并且永远不会打印输出。从我正在使用的类中调用这些函数可以正常工作。
我了解单元测试旨在实现自动化,但我仍然希望能够从单元测试中输出消息。
【问题讨论】:
标签: c# visual-studio unit-testing debugging mstest
我还试图让 Debug 或 Trace 或 Console 或 TestContext 在单元测试中工作。
这些方法似乎都不起作用或在输出窗口中显示输出:
Trace.WriteLine("test trace");
Debug.WriteLine("test debug");
TestContext.WriteLine("test context");
Console.WriteLine("test console");
(来自 cmets) 在 Visual Studio 2012 中,没有图标。相反,测试结果中有一个名为 Output 的链接。如果你点击链接,你会看到所有的WriteLine。
然后我注意到在我的测试结果窗口中,运行测试后,在小成功绿色圆圈旁边,还有另一个图标。我双击它。这是我的测试结果,它包含了上面所有类型的 writelines。
【讨论】:
尝试使用在测试结果中输出文本的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,请在您的测试类中创建一个成员和属性 [...] 测试框架会自动设置该属性,然后您可以在单元测试中使用该属性。
【讨论】:
【讨论】:
Console.WriteLine 的输出在“测试”下的“输出”窗格中也不可见。
这取决于您的测试运行程序...例如,我使用的是 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);
}
}
在我提供的用于写入输出窗口的链接中列出了另一种方法,但我更喜欢前一种。
【讨论】:
【讨论】:
OneTimeSetUp 和OneTimeTearDown 中看不到控制台输出。
我认为它仍然是真实的。
你可以使用这个 NuGet 包:Bitoxygen.Testing.Pane
从此库中调用自定义 WriteLine 方法。 它在 Output 窗口内创建一个测试窗格,并始终将消息放在那里(在每个测试期间,它独立于 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));
}
}
【讨论】:
Could not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
这确实取决于@jonzim 提到的测试运行器。
对于 NUnit 3,我必须使用 NUnit.Framework.TestContext.Progress.WriteLine() 在 Visual Studio 2017 的输出窗口中获得运行输出。
NUnit 描述了如何:here
据我了解,这围绕着测试运行者收到的附加测试执行并行化。
【讨论】:
尝试使用:
Console.WriteLine()
只有在定义 DEBUG 时才会调用Debug.WriteLine。
其他建议也可以使用:Trace.WriteLine,但我没有尝试过。
还有一个选项(不确定 Visual Studio 2008 是否有),但是当您在 IDE 中使用 Test With Debuggeroption 运行测试时,您仍然可以使用 Debug.WriteLine。
【讨论】:
用下面的例子解决:
public void CheckConsoleOutput()
{
Console.WriteLine("Hello, World!");
Trace.WriteLine("Trace Trace the World");
Debug.WriteLine("Debug Debug World");
Assert.IsTrue(true);
}
运行此测试后,在“测试通过”下,有查看输出的选项,这将打开输出窗口。
【讨论】:
我偶然发现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");
}
【讨论】:
如果您使用dotnet test 运行测试,您可能会发现Console.Error.WriteLine 会产生输出。
这就是我解决 NUnit 测试问题的方法,它似乎也抑制了所有 Debug、Trace 和标准输出。
【讨论】:
System.Console.Error.WriteLine 有效,但 System.Diagnostics.Debug.WriteLine 无效。
当我的测试/测试设置/默认处理器体系结构设置和我的测试项目引用的程序集不同时,我没有得到任何输出。否则 Trace.Writeline() 工作正常。
【讨论】:
您确定要在 Debug 中运行单元测试吗? Debug.WriteLine 不会在 Release 版本中被调用。
两个可以尝试的选项是:
Trace.WriteLine(),内置于发布版本和调试中
在单元测试的构建设置中取消定义 DEBUG
【讨论】:
【讨论】:
out”?
原因/解决方案的不同变体:
我的问题是我没有得到输出,因为我正在异步上下文中的循环中将异步 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));
【讨论】:
Console.WriteLine 不起作用。在调试模式下,只有 Debug.WriteLine() 或 Trace.WriteLine() 可以工作。
我执行以下操作:在测试模块中包含 using System.Diagnostics。然后,使用 Debug.WriteLine 作为我的输出,右键单击测试,然后选择 Debug Selected Tests。结果输出现在将出现在下面的 Output 窗口中。我使用 Visual Studio 2017 版本 15.8.1,以及 Visual Studio 提供的默认单元测试框架。
【讨论】:
Trace.WriteLine 应该可以工作,只要您选择正确的输出(在 Output 窗口中找到标有“显示输出”的下拉菜单)。
【讨论】: