我的单元测试中对Debug.Write(line)
或Console.Write(Line)
的任何调用都会在调试时跳过,并且永远不会打印输出。从我正在使用的类中调用这些函数。
我知道单元测试是自动化的,但我仍然希望能够从单元测试中输出消息。
答案 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)然后点击“输出”链接。
答案 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
View
-> Test Explorer
additional output
链接,如下面的屏幕截图所示。您可以使用:
全部将登录到其他输出窗口。
答案 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");
}
答案 16 :(得分:0)
尝试使用:
Console.WriteLine()
只有在定义DEBUG时才会调用Debug.WriteLine
。
其他建议也可以使用:Trace.WriteLine
,但我还没试过。
还有一个选项(不确定VS2008是否有)但在IDE中使用Debug.WriteLine
选项运行测试时仍然可以使用Test With Debugger