NUnit全局初始化 - 坏主意?

Sed*_*glu 38 .net nunit unit-testing

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

  • 这是所有灯具所要求的,所以[TestFixtureSetUp]不起作用.它必须在所有[TestFixtureSetUp]代码之前运行.

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

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

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

鉴于这种情况,我有两个问题:

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

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

6op*_*puc 85

[SetUpFixture]

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

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

程序集宽初始化.如果不将类放在任何名称空间中,它将应用于程序集中的所有测试.

例如.

// using statements

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

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

  • 它在文档中说明了这一点,但要明确地指出它.....如果你根本没有将这个类放入命名空间,那么它将用于"程序集范围"设置/拆卸. (11认同)
  • 从nUnit 3开始,SetUpFixture中没有使用[SetUp]属性,上面的代码会引发异常.而是使用[OneTimeSetUp]和[OneTimeTearDown].https://github.com/nunit/docs/wiki/SetUpFixture-Attribute (2认同)

Mar*_*ius 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


MrV*_*ype 10

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

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

    [OneTimeTearDown]
    public void RunAfterAnyTests()
    {
      // ...
    }
  }
Run Code Online (Sandbox Code Playgroud)

中的OneTimeSetUp方法SetUpFixture在其名称空间中包含的所有固定装置之前执行一次。OneTimeTearDown所有固定装置完成执行后,将执行一次该方法。

当前的SetUpFixture文档页面

  • 谢谢加博!将已接受的答案更改为您的答案,以便其他人可以轻松找到它。 (2认同)