Visual Studio 2015调试NUnit单元测试提示进程ID为-1未运行错误
Visual Studio 2015 NUnit 测试调试报错排查
错误定位
从给出的堆栈信息可以明确:VS启动测试执行引擎vstest.executionengine.exe后,没有拿到进程的真实ID(返回值为-1),后续尝试关联调试器时就会抛出“指定进程未运行”的异常。直接运行测试的流程不涉及调试器绑定,所以能正常执行,只有点调试的时候才会触发这个问题。
按解决概率从高到低的排查点
- 降级NUnit测试适配器
VS2015对3.9.0以上版本的NUnit3TestAdapter有原生兼容问题,高版本适配器在调试流程里会提前释放执行引擎的句柄,直接导致拿到的进程ID是-1。把测试项目引用的NUnit3TestAdapter固定到3.7.0版本,配套把NUnit框架包版本降到3.10.0以内,不要用更新的版本。 - 关闭Just My Code调试选项
打开VS的工具->选项->调试->常规页,取消两个勾选:“启用我的代码”、“启动时显示诊断工具窗口”。Just My Code的规则在VS2015的测试调试流程里,会提前把测试进程判定为“非用户代码”并回收进程引用,直接造成进程ID获取失败。 - 清掉损坏的测试缓存
把所有VS窗口全关,删掉解决方案根目录下的隐藏.vs文件夹、TestResults文件夹,再打开系统临时目录(%TEMP%),删掉所有名字带vstest前缀的临时文件。这类缓存损坏是偶发进程ID拿不到的常见原因,清完重新还原Nuget包、打开解决方案再试调试。 - 核对全链路的平台配置一致性
就算整个解决方案选了x64平台,也要逐项目检查:- 所有测试项目的属性页(生成标签),把“首选32位”的勾去掉
- 所有测试项目引用的类库,平台目标必须和测试项目完全一致,不能出现测试项目是x64、依赖类库是x86的错位情况——这种错位会导致执行引擎进程刚启动就崩,VS自然拿不到存活的进程ID。
- 关掉测试隔离模式
打开VS的测试->测试设置菜单,把“在隔离模式运行测试”的勾去掉。VS2015的隔离测试模式会启动单独的沙箱进程跑测试,这个流程和NUnit适配器的调试逻辑有已知冲突,经常出现进程句柄丢失的问题。
临时兜底调整
如果以上步骤试完还是复现,可以在测试项目的app.config里加一段运行时配置,避免测试进程被提前回收:
<configuration> <runtime> <generatePublisherEvidence enabled="false"/> </runtime> </configuration>
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

