2011-01-24 108 views
54

在我的单元测试中,任何调用Debug.Write(line)Console.Write(Line)只是在调试时跳过,并且输出从不打印。从我正在使用的类中调用这些函数可以很好地工作。如何写单元测试的输出?

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

回答

66

尝试使用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如所描述的

+1

我发现(使用VS2013),如果测试在调试模式下运行,这只会打印一些东西。 – fusi 2015-09-24 11:15:20

+2

根据[本文档](https://msdn.microsoft.com/en-us/library/dd465178(v = vs.140)),似乎使用TestContext需要VS2015 Enterprise(或早期版本的高级版本)。 aspx) – 2015-11-24 21:48:51

+0

我注意到,如果你的字符串中有大括号,方法就会崩溃。所以“_testContext.WriteLine(”hello“);”工作,但“_testContext.WriteLine(”他{ll} o“);” “System.FormatException:输入字符串格式不正确”失败。 – 2017-07-20 21:08:35

0

尝试使用:

Console.WriteLine()

Debug.WriteLine呼叫只会DEBUG被定义时期间进行。

其他建议使用:Trace.WriteLine以及,但我没有尝试过。

还有一个选项(不知道是否VS2008有它),但你仍然可以使用Debug.WriteLine当你在IDE Test With Debugger选项运行测试

0

你确定你在调试运行单元测试? Debug.WriteLine不会在发布版本中被标注。

两个选项尝试是:

  • Trace.WriteLine(),这是建inot发布版本以及调试

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

103

它的谈话有点迟。

我也试图让调试或跟踪或控制台或TestContext工作在单元测试。

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

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

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

此前VS2012
然后我在我的测试结果发现窗口,运行测试后,旁边的收效甚微绿色圆圈,还有另外一个图标,我一倍点击它。这是我的测试结果,它包括了上面所有类型的书写线。

0

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

0

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

PS:你可以用Debugger.Break();来,所以你可以看到你登录out

0

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

3

我认为它仍然是实际的。

您可以使用此NuGet包: https://www.nuget.org/packages/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)); 
    } 
} 
2

这取决于你的测试运行...例如,我使用的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); 
    } 
} 

有没有在我提供写你的输出窗口中的链接中列出的其他方法,但我更喜欢以前的。

0

解决了下面的例子:

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

运行这个测试,根据“合格测试”之后,还有就是查看输出,这将显示在输出窗口的选项。