在单元测试中单步调试和调试代码

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 &gt; Test &gt; Debug &gt; 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 Withdebugger

【讨论】:

TestDriven 现在太老了 - 它是否提供了内置测试资源管理器不提供的任何功能?

以上是关于在单元测试中单步调试和调试代码的主要内容,如果未能解决你的问题,请参考以下文章

从路径获取 UIImage 仅在调试器中单步执行时有效

Typescript 代码在调试单元测试时启用了覆盖率

在单元测试中捕获调试窗口输出?

我可以在运行 VS 单元测试时进行调试吗?

Python-调试&单元测试

如何在 Visual Studio 或 CLion 调试器中单步执行 ispc 源文件?