NUnit全局初始化 - 坏主意?

时间:2010-09-01 15:33:17

标签: .net unit-testing nunit

我们的测试套件中需要一些全局一次性设置代码。我们可以做多次,但需要相当长的时间。

  • 所有灯具都需要这样[TestFixtureSetUp]不起作用。它必须在所有[TestFixtureSetUp]代码之前运行。

  • 将它放在Main()中,因为我们将测试程序集保存为可执行文件。但是Main不会在GUI客户端下执行。

  • 只有在引用我们不喜欢在每个类中执行的类时,才能使用静态构造函数创建一个单独的类进行初始化。

  • 从基类继承所有测试装置并向其添加静态构造函数会导致多次调用init代码。

现在考虑到这种情况,我有两个问题:

1)“全局设置”是否非常糟糕,NUnit不支持它?

2)实现这一目标的最不痛苦,最常见的方法是什么?

5 个答案:

答案 0 :(得分:84)

[SetUpFixture]

这是一个属性,用于标记包含给定命名空间下所有测试装置的一次性设置或拆卸方法的类。

SetUpFixture中的SetUp方法在其命名空间中包含的任何fixture之前执行一次。 在所有灯具完成执行后,TearDown方法执行一次。

程序集范围的初始化。如果您没有将该类放在任何命名空间中,它将适用于程序集中的所有测试。

例如。

// using statements

[SetUpFixture]
public class GlobalSetup {
  [SetUp]
  public void ShowSomeTrace() {
    Trace.WriteLine("It works..."); // won't actually trace
  }
}

http://www.nunit.org/index.php?p=setupFixture&r=2.4

答案 1 :(得分:11)

如我的评论所述,您可以使用位于程序集级别的SetUpFixture来实现程序集范围的初始化。我需要这个来关闭默认跟踪侦听器上的UI:

[SetUpFixture]
public class AssemblySetup
{
    [SetUp]
    public void Setup()
    {
        var traceListener = Debug.Listeners.Cast<TraceListener>().FirstOrDefault(listener => listener is DefaultTraceListener) as DefaultTraceListener;

        if (traceListener != null)
            traceListener.AssertUiEnabled = false;
    }
}

有关汇编或命名空间设置的更多信息:http://www.nunit.org/index.php?p=setupFixture&r=2.4

注意:正如其他人所指出的,不要使用它来破坏测试之间的隔离。

答案 2 :(得分:4)

从NUnit 3.0开始,在标有Setup属性的类中不再支持SetUpFixture属性。当前有效的语法是:

  [SetUpFixture]
  public class MySetUpClass
  {
    [OneTimeSetUp]
    public void RunBeforeAnyTests()
    {
      // ...
    }

    [OneTimeTearDown]
    public void RunAfterAnyTests()
    {
      // ...
    }
  }
  

OneTimeSetUp中的SetUpFixture方法在执行任何操作之前先执行一次   包含在其命名空间中的灯具。 OneTimeTearDown方法   在所有灯具完成执行后执行一次。

Current SetUpFixture documentation page

答案 3 :(得分:1)

我不认为有一种很好的,内置的方法来实现它 - 可能是因为NUnit主要用于单元测试,你不需要任何全局设置进行单元测试(一切都应该是在每个测试夹具中进行局部模拟)。

然而,使用NUnit进行集成测试是很常见的,并且在全局设置中很常见 - 就像你的情况一样。这里有一些合理的选择:

  1. 在我当前的项目中,我们通常使用运行测试的msbuild脚本。这样做的好处是,在编写新测试时,您无需记住任何特殊设置。缺点 - 您必须确保在从IDE运行测试时设置了所有内容。

  2. 如果以上不是一个选项,您可以使用您的最后一个想法 - 从公共基类继承测试。然后基类可以引用单例类(你可以找到关于如何实现单例的Jon Skeets文章),这将进行设置。这样它只会运行一次。

答案 4 :(得分:0)

1)我猜这取决于具体情况。我从来不需要在任何项目上进行全局设置,但我可以想象一下场景,例如:一个只读取数据的应用程序,以及一个通用的全局数据设置。

2)您可以进行全局设置,例如在你提到的夹具基地,有状态。即具有在执行前检查的HasRun属性等。