如何调试VS2022中自定义开发的vstest Adapter代码
自定义vstest适配器断点调试方法
问题相关信息
- 自研vstest适配器已接入Visual Studio 2022,测试资源管理器可正常显示创建的虚拟测试用例,但无法进入适配器内部代码触发断点
- 测试发现逻辑代码:
[DefaultExecutorUri("executor://XmlTestExecutor")] class TestDiscoverer : ITestDiscoverer { void ITestDiscoverer.DiscoverTests(IEnumerable<string> containers, IDiscoveryContext discoveryContext, IMessageLogger logger, ITestCaseDiscoverySink discoverySink) { logger.SendMessage(TestMessageLevel.Informational, "Start discovery"); var test = new TestCase( "Assembly.Class.Method", new Uri("discoverer://compatTestDiscoverer"), @"D:\Code\HelloTestUnit\bin\Debug\net6.0\HelloTestUnit.dll"); test.DisplayName = "Sample test case"; test.CodeFilePath = @"D:\Code\HelloTestUnit\UnitTestA.cs"; discoverySink.SendTestCase(test); } }
- 之前尝试使用vstest.console.exe调试的命令存在参数错误,导致适配器无法加载:
set VSTEST_RUNNER_DEBUG=1 set VSTEST_HOST_DEBUG=1 vstest.console.exe HelloTestUnit.dll /ResultsDirectory:d:\test /TestAdapterPath:VS.TestAdapter.dll
调试操作步骤
方法一:附加VS测试进程(适配测试资源管理器场景)
测试资源管理器执行测试发现、用例运行时,不会直接在主VS进程加载适配器,也不会固定使用单一vstest.console进程,按以下步骤操作:
- 将适配器项目编译输出的dll、pdb文件,复制到测试项目输出目录下的
TestAdapters文件夹,或者复制到全局vstest扩展目录,确保VS能加载到最新编译的适配器版本 - 打开测试资源管理器,手动触发一次测试发现,确认虚拟测试用例正常显示
- 打开VS菜单「调试-附加到进程」,筛选对应进程附加:
- .NET Framework测试场景:附加
vstest.discoveryengine.exe、vstest.executionengine.exe进程 - .NET Core/.NET 6+测试场景:附加
testhost.exe、vstest.console.exe及其子dotnet进程
- .NET Framework测试场景:附加
- 附加时代码类型选择对应版本的托管代码,之后在适配器代码中设置的断点即可正常命中。
方法二:修正命令行参数,通过vstest.console调试
原命令存在两处错误:
/TestAdapterPath参数仅接受文件夹路径,传入具体dll路径会导致适配器扫描失败- 未切换到测试项目输出目录执行命令,可能出现测试dll找不到的问题
修正后的命令如下:
:: 配置vstest运行器启动时暂停,等待调试器附加 set VSTEST_RUNNER_DEBUG=1 :: 仅调试测试发现逻辑时不需要配置该变量,调试用例执行逻辑时再加 set VSTEST_HOST_DEBUG=1 :: 切换到测试项目编译输出目录 cd /d D:\Code\HelloTestUnit\bin\Debug\net6.0\ :: 传入适配器dll所在的文件夹路径,不要传dll文件名 vstest.console.exe HelloTestUnit.dll /TestAdapterPath:"你的适配器dll所在的文件夹完整路径"
执行命令后会弹出调试器选择提示,打开适配器项目附加到对应等待进程,即可命中DiscoverTests方法内的断点。
注意事项
- 适配器项目的平台目标必须和测试项目保持一致(同为x86/x64/Any CPU),否则vstest会因平台不匹配跳过适配器加载
- 适配器项目需配置生成全量PDB调试文件,否则断点无法绑定
- 若测试资源管理器加载了旧版本适配器,关闭所有VS实例,删除
%TEMP%\VisualStudioTestExplorerExtensions目录下的缓存文件后重启VS即可
内容的提问来源于stack exchange,提问作者ever
相关产品推荐
相关产品推荐

