Visual Studio“调试单元测试”无法触发断点。

59

在使用Visual Studio 2008调试单元测试时,有时调试器运行良好。但是经常出现修改了一些代码后,点击“Debug Unit Test”后,Visual Studio无法命中代码中的断点。调试器基本上会挂起,最终测试会以新的代码运行,但从未停止让我看到正在发生的事情。

我认为这可能与调试器执行的某种类型的程序集缓存有关,但是无论我做什么(清理项目,删除bin文件夹,重启VS等),我都无法加载正确的程序集。是否还有其他人遇到过这种情况?有什么解决方案吗?

顺便说一下,在Win XP上使用Resharper 4.5和.NET 3.5。


我在VS2010中看到了相同的行为 :( - callisto
2
在VS2010中也发生过这种情况,但是执行“清理解决方案”似乎可以解决问题。 - sym3tri
1
在VS 2013中使用Resharper 10。这以前从未是问题,但在重新映像我的机器后,我有一个解决方案始终如此。我确定它与缓存的阴影副本有关。如果我进行任何代码更改并设置任何新的断点,它们第一次不会被触发。我必须让它失败或杀掉它,并再做一次。第二次总是触发断点。我想这一定是某个设置,因为它只在我的机器上发生(我想)只针对这个解决方案。 - Tom Bogle
这个回答解决了你的问题吗?Visual Studio - 突然无法调试测试 - Michael Freidgeim
显示剩余5条评论
23个回答

71

我在VS2015中遇到了断点无法触发的问题。

我通常使用名为Debug的解决方案配置,但由于某种原因,我的解决方案被设置为构建Release版本。

在Visual Studio顶部的下拉菜单中将其从Release切换到Debug可以解决我的问题。


2
当你注意到这一点时,它显然是非常明显的。谢谢! :) - Stu1986C
上周我又犯了同样的错误。我通常不会切换到发布版本,但是一些旧的解决方案没有被构建服务器部署,所以我必须在本地以发布模式构建解决方案。然后我就忘记切换回来了。 - Helo
是的,我也一样。我通常也会将其保留在Debug中。我搜索了所有与Nunit、Resharper和Nunit Tet Runner有关的内容...没有意识到问题是一个愚蠢的下拉框!再次感谢。 - Stu1986C

18

我在使用xunit测试项目解决了类似的VS2022问题,方法是删除启动设置文件。

..\ Properties\launchSettings.json


这对我来说也立即解决了问题!由于某种原因,在测试项目中有一个奇怪的WSL启动配置文件。 - julealgon
这也是我的问题。不知道它来自哪里。 - Jason Coyne
我在这个文件中注释了默认配置文件,然后它开始工作了。 - T.S.

18

右键单击+运行测试不会触发断点。

右键单击+调试测试会触发断点!


1
谢谢!我现在感觉很蠢,我已经追了20分钟了! - Billy Willoughby
@BillyWilloughby,不用谢,我有同感。 - Luis Gouveia
1
确实,“运行测试”不应该调试测试,但无论我选择什么,调试器都无法附加。 - Anders Lindén

18

另一个解决方法:强制在单元测试中启动调试器:

System.Diagnostics.Debugger.Launch();

结果发现我的测试文件还有其他问题。我可能会写出自己的答案... - Super Jade
在我添加了这个之后,所涉及的断点被触发了。然后,我删除了这行代码,但是断点仍然继续被触发... 这里面有些神秘的东西。 - James John McGuire 'Jahmic'
@JamesJohnMcGuire'Jahmic': 项目在移除那行代码后真的构建成功了吗?也许exe/dll文件仍在使用中,无法被VS写入。重新构建并观察编译器输出窗口!你还可以用条件编译包围它,使用#if DEBUG ...code... #endif来确保它在发布版本中被移除。 - huha
@huha - 你可能有点道理。虽然这是一段时间之前的事情了,但如果我再次遇到这种情况,我会更仔细地检查。 - James John McGuire 'Jahmic'

4

当我尝试调试一个测试方法时,遇到的一个问题是它是私有的。仅仅将该方法从private更改为public就解决了我的问题。

我不知道这为什么是个问题,但这可能与 NUnit 的[Test]属性的实现有关。


哇,谢谢您的帮助。我新建了一个类,默认情况下它没有标记为“public”。一旦我添加了这个标记,它就成功了。您的答案让我想起要检查这一点。 - Casey Crookston
请确保您的TestCleanUp或InitializeTest方法也是公共的 :) - Andreea Purta

4

虽然时间已经很晚,但以防其他人像我一样最终到达此处....

我的测试无法命中断点。我将测试裸化(如下),但仍然无法命中:

    [Fact] // xunit, c#, vs 16.9.0
    public void TestX()
    {
        var messages = new List<int>();
        Assert.NotNull(messages);
    }

我将相同的测试复制到了另一个项目中,立即触发了断点。

尝试了几个方法,然后发现了问题...

在我的原始测试项目中,我引用了SUT项目,该项目具有从SUT复制的以下SDK软件包引用:

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.11" />

我在测试项目中删除了这个东西后,断点又能够被触发了!

真是令人沮丧而浪费时间,希望能对其他人有所帮助!


这对我有用。我已经在测试项目上安装了Functions SDK。这是我从解决方案侧安装NuGet包并选择所有项目所得到的结果。如果您正在处理Azure函数项目,请确保此NuGet包未包含在您的xunit测试项目中。 - Greg
谢谢@GregoryBillings - 很高兴能对你有帮助。当时让我感到很沮丧 :) - Peter

3

对我来说最终解决方案是:确保所有 NuGet 包版本匹配。我的单元测试项目正在使用比我测试的项目引用更高版本的 Newtonsoft.Json。一旦我将所有 NuGet 包更新到最新版本,我就能够触发断点。


那对我来说解决了问题! - Casey Crookston

2

现在我们遇到了Visual Studio 2017 15.5和Resharper 2017.2的问题。这个问题是由Resharper引起的,并已在最新版本2017.3+中解决。

链接


这对我有帮助,我正在运行VS 2017 v15.5.6。 - Dan H

2

我曾经遇到过类似的问题,解决方法如下:在“测试资源管理器”中,选择“设置”,然后选择“处理器架构”,将任何CPU项目更改为X64即可。以下是参考图片:enter image description here


1

确保方法上有 [TestMethod] 属性,类上有 [TestClass] 属性。


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