NUnit 3.11中SetUpFixture失效及OneTimeSetup执行时机咨询
问题解答:SetUpFixture不被识别及OneTimeSetUp执行逻辑
我来帮你拆解这两个遇到的问题:
一、SetUpFixture类未被检测到单元测试的原因及修复
你这里犯了一个NUnit用法的典型错误:SetUpFixture不是用来存放测试方法的容器!
SetUpFixture的设计目的是做命名空间级别的一次性初始化/清理——它会在当前命名空间下所有TestFixture类的测试开始前执行一次OneTimeSetUp,在所有测试结束后执行一次OneTimeTearDown。它本身不能包含[Test]或[TestCase]标记的测试方法,这就是为什么你的第一个类不被测试适配器识别为测试的核心原因。
修正后的代码示例
把测试方法移到TestFixture类中,SetUpFixture只保留全局初始化逻辑:
// 命名空间级别的全局初始化类 [SetUpFixture] public class GlobalTestSetup { [OneTimeSetUp] public void GlobalSetup() { // 这里放所有测试开始前只执行一次的逻辑,比如数据库连接初始化、配置加载等 Console.WriteLine("全局初始化执行一次"); } [OneTimeTearDown] public void GlobalTeardown() { // 这里放所有测试结束后只执行一次的清理逻辑 Console.WriteLine("全局清理执行一次"); } } // 存放测试方法的类 [TestFixture] public class UnitTests { private string test = "not initialized"; // 类级别的一次性初始化 [OneTimeSetUp] public void ClassSetup() { test = "initialized"; } [TestCase] public void TestInitialization() { Assert.AreEqual(test, "initialized"); } } // 你的第二个测试类(这个写法是正确的) [TestFixture] public class UnitTests2 { private string test = "not inialized"; // 每个测试用例执行前都会跑一次SetUp [SetUp] public void Setup() { test = "initialized"; } [TearDown] public void Teardown() { } [Test] public void Test() { Assert.AreEqual(test, "initialized"); } }
二、OneTimeSetUp的执行次数规则
针对你问的「一个方法包含多个[TestCase]时,OneTimeSetUp的执行时机」,明确规则如下:
- 放在TestFixture类中的OneTimeSetUp:只会在当前测试类的所有测试用例(包括所有TestCase)执行前执行一次,不管这个类里有多少个Test或TestCase方法。
- 放在SetUpFixture类中的OneTimeSetUp:会在整个命名空间下所有测试类的所有测试开始前执行一次,是真正的全局一次性初始化。
- 对比SetUp:SetUp是每个测试用例(每个TestCase实例)执行前都会执行一次,和OneTimeSetUp的类级别执行完全不同。
举个例子:如果你的TestFixture类里有3个TestCase,那么OneTimeSetUp只跑1次,而SetUp会跑3次(每个TestCase各一次)。
内容的提问来源于stack exchange,提问作者Zoinky
相关产品推荐
相关产品推荐

