Delphi 11用DUnitx单元测试时如何按项目关闭异常通知
Delphi 11下针对DUnitX项目单独关闭异常通知的方案
全局修改Tools > Options里的Language Exceptions开关确实会对所有项目生效,不需要这么做,有三种非全局的实现方式,按需选择即可:
1. 项目级独立配置(推荐,无代码侵入)
Delphi从XE版本开始就支持项目维度的调试异常配置,配置仅对当前项目生效,不会修改全局设置:
- 右键点击项目管理器中的DUnitX测试项目,选择
Options - 导航到
Debugger > Exceptions页签 - 直接取消勾选
Notify on language exceptions,或者按需将测试中预期抛出的特定异常类型加入忽略列表 - 保存项目即可,配置会写入项目的
.dproj文件,只有调试该项目时会生效,其他普通业务项目的异常通知逻辑完全不受影响
2. DUnitX测试运行器专属配置
如果你是通过IDE内置的Test Explorer面板运行DUnitX用例:
- 打开Test Explorer面板右上角的设置菜单
- 取消勾选
Break on test exceptions选项 - 该配置仅对DUnitX测试运行流程生效,哪怕你调试同一个项目里的非测试代码,异常通知也会正常触发,是对日常开发影响最小的方案
3. 代码控制仅测试运行时临时屏蔽异常
如果需要更灵活的控制(比如只在跑全量测试时屏蔽,单独调试单个测试用例时保留异常通知),可以在测试项目的源码入口加条件控制逻辑:
program YourDUnitXTestProject; uses Winapi.Windows, DUnitX.TestFramework, DUnitX.Loggers.Console, // 引用自己的测试单元 ; {$IFDEF DEBUG} procedure DisableDebuggerExceptionPause; var prevMode: DWORD; begin // 屏蔽系统级错误弹窗 SetThreadErrorMode(SEM_FAILCRITICALERRORS or SEM_NOGPFAULTERRORBOX, @prevMode); // 通知IDE调试器不要在当前进程暂停在语言异常 OutputDebugString('$DUnitX:SKIP_EXCEPTION_BREAK'); end; {$ENDIF} begin {$IFDEF DEBUG} // 仅调试器附加、且传入testrun参数时才屏蔽异常 if IsDebuggerPresent and FindCmdLineSwitch('testrun') then DisableDebuggerExceptionPause; {$ENDIF} // 原有DUnitX启动逻辑 TDUnitX.Start; end.
后续在Test Explorer里配置运行参数加-testrun,单独调试项目时不加这个参数,就可以灵活切换异常通知状态。
注意:不要开启测试项目的
Use debug .dcus选项,否则哪怕关了语言异常通知,调试器也会在RTL/VCL内部抛出异常时断下,影响测试运行效率。
内容的提问来源于stack exchange,提问作者Rohit Gupta
相关产品推荐
相关产品推荐

