代码之家  ›  专栏  ›  技术社区  ›  Sedat Kapanoglu johnnywhoop

nunit全局初始化-坏主意?

  •  34
  • Sedat Kapanoglu johnnywhoop  · 技术社区  · 16 年前

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

    • 所有的固定装置都需要它,所以 [TestFixtureSetUp] 不起作用。它必须首先运行 [测试固件设置] 代码。

    • 把它放进去 Main() 因为我们将测试程序集保留为可执行文件。然而 Main 不会在GUI客户机下执行。

    • 用静态构造函数创建一个单独的类来初始化,只有当您引用了我们不喜欢在每个类中都做的类时才有效。

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

    鉴于目前的情况,我有两个问题:

    1)“全球设置”是不是一个非常糟糕的想法,即它不受Nunit支持?

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

    5 回复  |  直到 8 年前
        1
  •  2
  •   Leaky    8 年前

    从nunit 3.0开始, Setup 在用标记的类内不再支持属性 SetUpFixture 属性。当前有效语法为:

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

    这个 OneTimeSetUp A方法 安装夹具 在任何之前执行一次 它的命名空间中包含的设备。这个 OneTimeTearDown 方法 在所有设备完成执行后执行一次。

    Current SetUpFixture documentation page

        2
  •  84
  •   ajukraine    10 年前

    [设置夹具]

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

    SetupFixture中的设置方法在其命名空间中包含的任何设备之前执行一次。 拆卸方法在所有装置完成执行后执行一次。

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

    如。

    // 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

        3
  •  11
  •   Marius    15 年前

    如我的评论中所述,您可以通过使用位于组件级别的安装夹具来实现整个组件范围的初始化。我需要这个来关闭默认跟踪侦听器上的用户界面:

    [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

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

        4
  •  1
  •   Grzenio    16 年前

    不幸的是,我不认为有一个好的、内置的方法来实现它——可能是因为nunit主要用于单元测试,而您不应该需要任何单元测试的全局设置(所有东西都应该在每个测试夹具中本地模拟)。

    然而,在集成测试中使用nunit是很常见的,在那里,使用全局设置是很常见的——就像在您的例子中一样。这里有几个合理的选择:

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

    2. 如果上面不是一个选项,您可以使用您的最后一个想法——从一个公共的基类继承测试。然后,基类可以引用一个singleton类(例如,jon skeets关于如何实现singleton的文章),这将完成设置。这样它只能运行一次。

        5
  •  0
  •   Martin R-L    16 年前

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

    2)您可以进行全局设置,例如在您提到的fixture base中,状态设置。例如,在执行前检查hasrun属性或类似属性。