2010-09-01 57 views
31

我们在测试套件中需要一些全球一次性设置代码。我们可以多做一次,但需要相当长的一段时间。NUnit全局初始化 - 坏主意?

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

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

  • 使用静态构造函数创建一个独立的类用于初始化仅当您引用我们不赞成在每个类中执行的类时才有效。

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

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

1)是“全球建立”一个非常糟糕的主意,它不是由NUnit的支持?

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

+1

通过为那些谁不知道的方式,MbUnit的支持“AssemblyFixture”,其固定设置代码每个装配运行一次班。我知道我的问题是关于NUnit的,但任何想转换开关的人都应该考虑这一点。 – 2011-04-27 06:33:51

回答

78

[SetUpFixture]

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

SetUpFixture中的SetUp方法在包含在其名称空间中的任何灯具之前执行一次。 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

+0

哦,我认为'SetUpFixture'和'TestFixtureSetUp'是一样的东西,一个被弃用。这就是答案,谢谢! – 2011-04-29 11:15:24

+10

它在文档中说明了这一点,但要明确指出.....如果您没有将此类放入命名空间,它将用于“组件范围”设置/拆卸。 – 2011-10-04 14:43:46

+0

@GregB我已将您的评论添加到实际答案中,欢呼声。 – ashes999 2013-01-24 20:30:07

0

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

2)您可以进行全局设置,例如在你提到的灯具底座中,有状态的。即有一个HasRun属性或执行前检查的类似内容。

1

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

然而,使用NUnit进行集成测试非常常见,并且在这种情况下,通常会有一个全局设置。这里有几个合理的选项:

  1. 在我当前的项目中,我们通常在运行测试的msbuild脚本中执行此操作。好处是您在编写新测试时不需要记住任何特殊设置。缺点 - 您必须确保在从IDE运行测试时设置了所有设置。

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

+0

我想在默认跟踪侦听器上将“AssertUIEnabled”设置为false,这样如果断言在代码堆栈中的某处失败,我就不会弹出一个弹出窗口。这是我想要做的一件事,我希望它在所有测试中都能发生。 – Marius 2011-02-09 08:03:34

+1

我正在测试一个使用ActiveRecord的MVC3应用程序,我需要初始化一次,然后运行所有测试 - 这对于一个好用例来说如何? :) – ashes999 2011-11-14 19:30:21

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

注:正如其他人所指出的,不要使用这间隔离腐败你的测试。