You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NUnit框架中能否为每个TestCase单独执行Setup与TearDown?

在NUnit中为每个TestCase单独执行Setup/TearDown

先看你给出的测试代码示例:

[Setup] public void RunBeforeAnyTest() { } 
[TearDown] public void RunAfterEveryTest() { } 
[Test] public void Test1() { } 
[TestCase("case1")] 
[TestCase("case2")] public void Test2() { }

你提到当前的[Setup]和[TearDown]会在Test1和Test2整个测试方法的前后执行,但需要它们在Test2的每个TestCase实例前后都运行——答案是完全可行的,NUnit本身就提供了对应的特性来实现这个需求,甚至默认逻辑就符合你的预期,可能只是你踩了个小细节坑。


具体实现说明

1. 先纠正特性名称的细节

你代码里写的[Setup]是NUnit旧版本的写法,在NUnit 3.x及以上的新版本中,正确的特性名称是**[SetUp]**(注意大写的U),[TearDown]名称是对的。如果特性名称写错,NUnit会直接忽略这个方法,自然不会按预期执行。

2. 默认执行逻辑就是你要的效果

只要使用正确的特性名称,[SetUp]和[TearDown]默认就会为每个测试实例执行,包括每个TestCase。拿你的Test2来说,执行顺序会是:

  • SetUp → Test2("case1") → TearDown
  • SetUp → Test2("case2") → TearDown
    而Test1则是:SetUp → Test1 → TearDown

3. 更细粒度的控制可选

如果你需要区分「整个测试类只执行一次的初始化/清理」和「每个测试实例执行的初始化/清理」,可以搭配[OneTimeSetUp]和[OneTimeTearDown]:

  • [OneTimeSetUp]:在整个测试类的所有测试(包括所有TestCase)执行前只运行一次
  • [SetUp]:每个测试实例(每个TestCase、每个普通[Test])执行前都运行一次

给你一个完整的新版NUnit示例参考:

using NUnit.Framework;

[TestFixture]
public class MyTests
{
    [OneTimeSetUp]
    public void RunOnceBeforeAllTests()
    {
        // 整个测试类生命周期内只执行一次
    }

    [SetUp]
    public void RunBeforeEachTestInstance()
    {
        // 每个TestCase、每个Test方法都会触发一次
    }

    [TearDown]
    public void RunAfterEachTestInstance()
    {
        // 每个TestCase、每个Test方法都会触发一次
    }

    [OneTimeTearDown]
    public void RunOnceAfterAllTests()
    {
        // 整个测试类生命周期内只执行一次
    }

    [Test]
    public void Test1()
    {
        // 执行前触发SetUp,执行后触发TearDown
    }

    [TestCase("case1")]
    [TestCase("case2")]
    public void Test2(string testCase)
    {
        // 每个TestCase都会分别触发SetUp和TearDown
    }
}

总结一下:只要确保使用正确的特性名称(新版[SetUp]/[TearDown],旧版[Setup]/[TearDown]),它们默认就会为每个TestCase实例单独执行,完全满足你的需求。

内容的提问来源于stack exchange,提问作者Moi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:04:42