NUnit 3.13.3跨程序集继承时SetupFixture的OneTime方法不执行
问题产生原因
核心原因是对NUnit中[SetUpFixture]的作用域和触发规则存在误解,该特性的生命周期绑定逻辑和类继承没有任何关系,具体规则如下:
- 无命名空间的
[SetUpFixture]属于所在程序集的全局级初始化/清理类,它的[OneTimeSetUp]和[OneTimeTearDown]只会在测试运行器执行「当前程序集内部定义的测试用例」时,才会在该程序集所有测试执行的前后触发。 - 你实际执行的测试用例
MyTestClass定义在AssemblyB中,测试运行器执行该用例时,只会触发AssemblyB对应的程序集级[SetUpFixture]逻辑。AssemblyA只是被AssemblyB引用的依赖程序集,哪怕你继承了AssemblyA中的BaseTestClass,也不会触发AssemblyA的全局SetUpFixture——类继承只会传递基类的成员(比如你代码里BaseTestClass定义的[SetUp]/[TearDown]属于类实例级生命周期方法,会被派生类继承所以能正常执行),不会连带触发基类所属程序集的全局初始化逻辑。 - 如果AssemblyA本身没有定义任何可被测试运行器识别执行的测试用例,哪怕测试运行器加载了AssemblyA,也不会扫描执行它内部的全局SetUpFixture逻辑。
修复方案
可根据实际需求选择以下任意一种方案调整:
- 如果这段初始化逻辑只服务于AssemblyB的测试:把AssemblyA中定义的全局SetUpFixture类移动到AssemblyB中,作为AssemblyB的程序集级初始化类即可。
- 如果这段初始化逻辑是所有继承
BaseTestClass的测试类都需要的公共逻辑:不要用程序集级SetUpFixture,直接把[OneTimeSetUp]和[OneTimeTearDown]方法写到BaseTestClass中,作为基类的类级OneTime生命周期方法,派生测试类会自动继承执行这部分逻辑。 - 如果AssemblyA本身也有自己的测试用例需要执行:在运行测试时显式配置测试运行器同时加载AssemblyA和AssemblyB两个测试程序集,两个程序集各自的全局SetUpFixture会分别在自身程序集的测试执行前后触发。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

