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")→TearDownSetUp→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
相关产品推荐
相关产品推荐

