Visual Studio Express 2013:单元测试中的程序输出(控制台、调试等)

15

我在这里真的很头疼。在 Visual Studio(Express 2013)中获取程序输出难道很难吗?编写代码时,我发现能够打印变量、操作等的值是绝对必要的,这样可以在工作和故障排除时使用。

在 Java 和 Eclipse 中,System.out.println() 总是有效的,输出到IDE控制台。在编写 C 程序时,我总是使用控制台,所以回显任何内容都不是问题。然而,在 VS Express 2013 中,我似乎无法获得任何输出。

问题是否可能与我编写单元测试而不是“正常”的可执行程序有关?如果是这样,是否有办法让 VS 在单元测试类中显示程序输出?我试过使用调试,但那也没有显示任何东西。考虑到可能存在配置问题,我已经寻找了解决调试消息未显示的方案,但我在这里或其他地方找到的选项都似乎没有帮助。

当然,如果在 VS/C# 中编写代码时,还有另一种常用方法来检查程序值、输出等,我想听听它的介绍 :-)

有人有什么想法吗?如果问题不太清楚或存在问题,请告诉我,我会修复它。

NB:我在进行功能测试时使用单元测试类,以防有人想指出我在单元测试中应该做什么和不应该做什么。

编辑1:我忘记提到我不能使用“开始:调试”运行代码。如果我尝试,我会收到此错误:“输出类型为类库的项目不能直接启动。”(单元测试项目使用另一个项目中的类,这是一个类库项目。)这当然是因为解决方案中没有可执行项目。我的运行方式是从“测试资源管理器”中运行所选测试。

编辑2:代码:

using System;
using System.Diagnostics;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WordpressAutomation;

namespace WordpressTests
{

    [TestClass]
    public class LoginTests : WordpressTest {

        [TestMethod]
        public void AdminUserCanLogIn() {

            System.Diagnostics.Debug.WriteLine("Something...");
            System.Diagnostics.Trace.WriteLine("Something...");
        }
    }
}

一些代码会有所帮助。 - Jack Hughes
7个回答

34

Visual Studio的TestExplorer拥有一个独立的输出窗口。它不会写入Visual Studio的默认输出(我不知道是否可配置)。

您必须选择要在TestExplorer中查看其输出的测试。如果测试有一些输出,您应该看到一个名为“Output”的超链接。单击它将打开一个新选项卡,显示测试的输出。

enter image description here

所有显示的消息都是由Console.WriteLine编写的。

我正在使用Visual Studio 2013专业版。我不确定Express版本是否有所不同。


嗯,是的,我明白了。这可能是我从单元测试中得到的最接近输出的方式了吧?我认为创建一个控制台项目与测试项目并行运行可能是正确的方法。 - Frank H.
经过长时间的尝试和实践,我得出结论,这是一个非常实用的解决方案。 - Frank H.
2
嗯,这似乎在 VS2015 企业版中无法正常工作。 - John Nicholas
大量的测试输出导致VS 2013崩溃。 - Sten Petrov
这在vs2015中有效,但如果你正在使用runsettings文件,请确保MSTest设置中的CaptureTraceOutput设置为true。 - Malaise

6
System.Diagnostics.Debug.WriteLine("Yay!");

如果您配置了输出窗口以显示调试数据,则它将在其中显示。
来源:Visual Studio 2010 Express。写入输出窗口(这是针对VS 2010的,但应该也适用于2013,因为这是一个框架选项,而不是IDE选项)。

但是如何配置输出窗口呢?在我的输出窗口中,我已选择“显示来自:调试”的选项。但似乎由于这是单元测试,我不能以正常的调试模式运行它。 - Frank H.
据我所知,debug.writeline应该也适用于发布配置的项目。我现在要测试一下。 - Nzall
当定义了“DEBUG”符号时,System.Diagnostics.Debug.WriteLine(...)将起作用。您可以使用System.Diagnostics.Trace.WriteLine(...) - ChriPf
我无法直接在调试模式或发布模式下执行,运行类的方式是从测试资源管理器中进行的。我也尝试过使用Trace.Writeline(),但是当我运行单元测试时它们都没有任何输出。这就是为什么我认为问题/挑战可能是该项目是一个单元测试项目的原因。 - Frank H.

3

我不是很喜欢回答自己的问题,因为这似乎有点“不诚实”。不过,已经很安静了一段时间,而且我也不认为会有其他答案。

最实用的解决方案是创建另一个项目,例如控制台项目,在其中创建所有输出。虽然它可能不能直接与单元测试通信,但由于我在这个特定示例中正在开发的测试框架由功能测试与类库进行通讯,因此可以在解决方案中使用单独的项目。

因此,总结一下,解决方案包括: - 一个具有实际测试的单元测试项目 - 一个带有框架逻辑的类库项目 - 一个控制台项目,用于测试类库中的类或单元测试项目中的非单元测试类。


1
不用担心回答自己的问题。如果你找到了一个合适的问题,Stack Overflow 鼓励你回答自己的问题。你不仅为自己提问,也为将来可能有同样问题的访问者提问。 - Nzall
1
是的,有时候我会问一个问题并立即回答它(通过“分享您的知识,问答式复选框”),只是因为我确信我将再次遇到这个问题,并希望通过谷歌搜索找到它。 - William Jockusch

2
我认为在这种情况下应该使用日志而不是控制台输出。你可以配置日志将输出到文件,甚至可以输出到指定的窗口。我相信你可以在没有控制台的情况下使用日志,并且你可以配置日志,使得只有警告或错误信息在生产环境中显示,在调试会话期间可以显示调试信息。
我使用 log4j,任何好的日志软件都可以在这里使用。

1
你应该利用日志框架来完成这种事情。从日志框架中,你可以选择将日志记录到控制台、平面文件或其他许多数据源,或者告诉框架忽略输入。好的日志框架非常可配置。
在.NET领域,社区最喜欢的似乎是NLog,http://nlog-project.org/。"入门"链接将帮助您入门。

我早就找到了一个更简单的解决方案:只需使用Console.Write,并检查测试输出即可。 - Frank H.
当然,你可以使用Console.WriteLine。它简单而快速。将来,如果您想从您发布的类中输出,并且如果您不希望在某人编写您的程序时将输出显示到控制台,则需要另一种方法。由于此输出在测试时非常有用,因此您可能会发现在代码处于另一个环境时也很有用。使用Console.WriteLine,您的选项相当有限。通过使用日志记录框架,您可以限制此输出的可见性,并且可以以您选择的格式查看此输出。 - morningstar8

0
一个输出类型为类库的项目不能直接启动。
不要运行或调试单元测试项目。可以通过在“测试资源管理器”窗口中选择一个或多个测试,或者右键单击单元测试方法并选择“运行测试”或“调试测试”来启动测试会话。
如有需要,请使用Console.WriteLineDebug.WriteLine输出信息,并在单元测试结果的“输出”链接中查找它们。

不确定你为什么要回答一个两年前我自己已经回答过的问题。 - Frank H.
@FrankH 我回答是因为我在研究一个问题时着陆到了这个页面,并直接回答了不需要按下 F5 来调试单元测试的事实。你的回答没有提到这一点。其他着陆在这里并正在学习的人可能不理解 Visual Studio 中的这个操作。 - ΩmegaMan

0
我不确定VS2013,但在VS2008中,如果您双击测试结果摘要(在完成后,无论是通过还是失败),它将打开一个窗口,其中包含“常见结果”,“错误消息”等,最后跟着“标准控制台输出”。它基本上很好地捕获了每个测试的控制台输出。唯一的缺点是它不会实时显示输出。它只会在完成后显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接