NUnit.AssemblyHooks中TestRunnerManager.OnTestRunStart无法加载项目程序集问题
解决思路
- 处理程序集探测路径不匹配问题
你确认dll存在于当前目录但加载失败,本质是.NET程序集默认探测路径不包含当前工作目录,或是NUnit开启了卷影复制导致运行时路径和编译输出路径不一致。无需修改SpecFlow自动生成的代码,直接在测试项目中新增自定义全局SetUpFixture,提前注册程序集解析事件即可:
using NUnit.Framework; using System; using System.IO; using System.Reflection; [SetUpFixture] public class TestAssemblyResolver { [OneTimeSetUp] public void PreInitialize() { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var asmName = new AssemblyName(args.Name).Name + ".dll"; var asmPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, asmName); return File.Exists(asmPath) ? Assembly.LoadFrom(asmPath) : null; }; } }
检查版本适配一致性
确认项目中所有SpecFlow相关包(SpecFlow、SpecFlow.NUnit、SpecFlow.Tools.MsBuild.Generation)版本完全一致,你当前使用的SpecFlow 3.5.14建议搭配NUnit 3.12~3.17版本、NUnit3TestAdapter 3.17~4.2版本,版本不匹配会触发内部程序集加载逻辑异常。校验SpecFlow配置与程序集名匹配
检查项目根目录下的specflow.json或者App.config中的SpecFlow配置,是否手动指定了testAssemblyName参数,如果配置的名称和你项目实际生成的程序集名称不符,就会出现报缺失的dll实际存在的问题,修正配置后清理项目重新生成即可。关闭NUnit卷影复制
如果是用控制台运行测试,在运行命令中添加--shadowcopy=False参数;如果是用VS测试资源管理器运行,在测试运行配置(.runsettings)中添加<ShadowCopyFiles>False</ShadowCopyFiles>配置,避免卷影复制后运行目录缺失依赖dll。
内容的提问来源于stack exchange,提问作者aleksefy
相关产品推荐
相关产品推荐

