在单元测试中单步调试和调试代码
Posted
技术标签:
【中文标题】在单元测试中单步调试和调试代码【英文标题】:Stepping through and debugging code in Unit tests 【发布时间】:2011-05-05 11:02:19 【问题描述】:我无法调试或逐步完成单元测试。
这是我的示例测试代码...
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using DomainModel.Entities;
using DomainModel.Abstract;
using WebUI.Controllers;
namespace Tests
[TestClass]
public class PeopleControllerTests
static IPeopleRepository MockPeopleRepository(params Person[] people)
var mockPeopleRepos = new Moq.Mock<IPeopleRepository>();
mockPeopleRepos.Setup(x => x.People).Returns(people.AsQueryable());
return mockPeopleRepos.Object;
[TestMethod]
public void Count_Of_People()
IPeopleRepository repository = MockPeopleRepository(
new Person Age = 31, Gender = "Male", Name = "Tom" ,
new Person Age = 25, Gender = "Female", Name = "Sally" ,
new Person Age = 18, Gender = "Female", Name = "John"
);
PeopleController controller = new PeopleController(repository);
var people = controller.List().ViewData.Model;
var peoplelist = people as IList<Person>;
Assert.AreEqual(3, peoplelist.Count);
【问题讨论】:
你的意思是除了点击行的右边,还是右键断点->插入断点? 【参考方案1】:使用 Microsoft.VisualStudio.TestTools.UnitTesting 时,进入 VS 2010 主菜单中的“测试”,点击子菜单“调试”->“当前上下文中的测试”。
右键单击测试代码并选择“运行测试”将永远不会启动调试器,即使在 mode = debug 时也不会。
【讨论】:
在VS2012
中我们可以通过输入Break Point in a Specific Test Method
来逐步调试。之后转到Menu > Test > Debug > Selected Tests Or All Test
。不,您应该能够调试。只是一个更新:)
除了@RJK的评论,这也是VS 2013中单步执行测试的相同步骤(或使用Ctrl + T
)
嗯。我不明白这个工作流程背后的原因。单元测试项目构建成dll(不是exe),所以不能设置为启动项目;然而,它只在 Visual Studio 中运行,并且是“运行的”(未链接)。所以“解决方案”是有一个完全不同的运行/调试设置?只是出于好奇,为什么 Microsoft 不将单元测试构建到 应用程序 而不是 dll 中,然后反映测试方法?对于无法真正“运行” dll,这似乎是一个非常奇怪的解决方法。【参考方案2】:
在 Visual Studio 2013 中要简单得多。在测试资源管理器中,选择要调试的测试,右键单击,然后选择调试选定的测试。
【讨论】:
一直右键选择Debug很不方便。如果我单击绿色三角形或在常规项目中按 F5,它将开始调试并在断点处停止。为什么单元测试项目的行为应该不同?也就是当我按下下拉菜单中选择了“Debug”的绿色按钮时,为什么VS不能停在断点处?【参考方案3】:是的,你可以,谢谢:)
要真正打破它们,您需要在调试模式下运行单元测试。
【讨论】:
菜单 > 测试 > 调试 > 当前上下文中的测试(在 VS 2010 中为 Ctrl + R、Ctrl + T) 这个答案缺乏足够的细节。你能提供具体的说明吗?这与其他答案不同吗?【参考方案4】:另一种解决方案...
您需要运行并附加调试器。
将此行设置在测试中执行的第一行(可能在测试类构造函数中):
System.Diagnostics.Debugger.Launch();
然后当调试窗口打开时,选择 Visual Studio。
【讨论】:
你为什么回复一个 4 年前的帖子,答案与另一个答案基本相同?【参考方案5】:如果你在运行 NUnit,那就太简单了:
-
运行 NUnit 并在其中打开所需的程序集。
打开 Visual Studio → 调试 → 附加到进程...
选择NUnit的进程
在您想要的每一行中放置一个断点。
返回 NUnit 并运行测试
您将看到执行在断点处停止
【讨论】:
【参考方案6】:也许简单地调试测试和设置断点在某些类型的单元测试中有效,但如果您调试,例如 Web 服务,则不能。
要调试 Web 服务(中断单元测试),您必须插入以下代码:
System.Diagnostics.Debugger.Break();
这将显示一个弹出窗口,说明应用程序停止工作,您可以选择对其进行调试。
更多: http://msdn.microsoft.com/en-us/library/ms243172.aspx#DebuggingOnCassini
【讨论】:
【参考方案7】:在 Visual Studio 中调试单元测试的两个简单步骤:
-
在要调试的单元测试中设置断点
右键单击单元测试中的任意位置并从上下文菜单中选择“调试测试”
单步执行单元测试与我们在 Visual Studio 中单步执行任何其他代码的方式非常相似。
跳过 - F10 进入 - F11 步出 = Shift + F11您还可以从测试资源管理器窗口调试单元测试
-
首先找到要调试的单元测试
双击单元测试将打开该单元测试
在单元测试中设置断点
在测试资源管理器中,右键单击该单元测试并选择“从上下文菜单中调试选定的测试”
调试所有测试 点击测试 - 调试 - 所有测试 然后执行将在所有单元测试中的所有断点处暂停
要记住的一点是,如果您在 Visual Studio 中选择运行测试而不是调试测试,则单元测试中的断点将被忽略。
【讨论】:
【参考方案8】:一种选择是安装TestDriven.net,这样可以更轻松地在任何主要的单元测试 .NET 框架(NUnit、xUnit、Visual Studio 工具等)上运行单元测试。
安装后,您可以右键单击一个函数并选择Test With → debugger。
【讨论】:
TestDriven 现在太老了 - 它是否提供了内置测试资源管理器不提供的任何功能?以上是关于在单元测试中单步调试和调试代码的主要内容,如果未能解决你的问题,请参考以下文章