C# 如何将调试器附加到命令行mstest

C# 如何将调试器附加到命令行mstest,c#,debugging,mstest,visual-studio-debugging,C#,Debugging,Mstest,Visual Studio Debugging,我有一个使用mstest的单元测试套件,我可以在VisualStudio中从e中很好地运行它,但是当我的部署脚本尝试使用命令行调用mstest来运行测试时,它将在测试期间冻结一半的时间。这可能是测试中的一个问题,但由于无法在调试器中重现该问题,我无法找到该问题 到目前为止,我无法附加mstest进程来调试问题,因为当我附加并暂停时,我在visual studio中什么也看不到(没有列出线程,没有已知代码)。它使用appdomains的方式是否有一些奇怪之处,从而无法轻松地连接到它?还有什么好方法

我有一个使用mstest的单元测试套件,我可以在VisualStudio中从e中很好地运行它,但是当我的部署脚本尝试使用命令行调用mstest来运行测试时,它将在测试期间冻结一半的时间。这可能是测试中的一个问题,但由于无法在调试器中重现该问题,我无法找到该问题


到目前为止,我无法附加mstest进程来调试问题,因为当我附加并暂停时,我在visual studio中什么也看不到(没有列出线程,没有已知代码)。它使用appdomains的方式是否有一些奇怪之处,从而无法轻松地连接到它?还有什么好方法可以尝试和排除故障,甚至可以从测试内部执行与控制台WriteLine等效的操作,以便mstest将其显示在控制台窗口中运行吗?

查看process Explorer中的进程树后,
mstest.exe
启动了一个名为
QTAgent32_40.exe
的子进程,我能够附加到该进程并关闭代码,以便调试测试

事实证明,它实际上是在我使用
MethodImplOptions.Synchronized

两个选项创建的模拟对象中死锁的

  • 在IDE中取消选中测试->测试设置->保持测试执行引擎运行
  • 要使用命令行,请执行以下操作:
  • 使用/noisolation开关运行mstest。它将直接执行测试,而不是生成辅助进程

    混合:自动将VS调试器附加到命令行mstest.exe:

    我使用以下内容配置测试项目的调试选项卡:

    启动外部程序:C:\Program Files(x86)\Microsoft Visual Studio 14.0\Common7\IDE\MSTest.exe

    命令行参数:/noiseolation/testcontainer:MyProjectName.dll

    以下是我对该工具的建议:

  • 在测试文件的底部添加新的测试方法,以便首先在vstest.console工具中执行此测试:

    [TestMethod]
    public void DebugAttachToProcessTimeout()
    {
        Console.ReadLine();
    }
    
  • 使用适当的程序集作为参数启动Vstest.console.exe。工具将尝试检查第一个测试并等待用户输入
  • 切换到Visual Studio并转到调试->附加到进程(CTRL+ALT+P)。然后选择“Vstest.console.exe”并单击“附加”
  • 现在您可以返回控制台并按enter键。工具将继续使用附加的visual studio执行测试

  • 确保在附加时选择正确的调试器类型-尝试显式指定,而不是自动检测.Hmm,奇数。您可以执行
    跟踪.WriteLine
    ,它将出现在生成的.trx中,但我不确定它是否会在最后写入报告……即使您已经找到了答案,我还是建议将Rob下面的答案涂上“答案”,因为他说明了如何从VS内部进行调试,以及如何克服子流程启动。我也有类似的问题,他的回答提供了答案。