如何为多个类使用一个SetUp TestFixture?

时间:2012-04-19 13:18:38

标签: c# nunit

好的,所以我有以下代码,我只想运行一次。我希望它能够在我运行的所有测试工具的最初设置和最后一次设置。

 [RequiresSTA]
    class Prepare
    {
        [TestFixtureSetUp]
        public void Setup()
        {
            IE Window = new IE("http://www.google.com");
        }

        [TestFixtureTearDown]
        public void Teardown()
        {
            IE Window = IE.AttachTo<IE>(Find.ByTitle("Google"));
            Window.Dispose();
        }
    }

我的项目中有多个类在同一个命名空间中,我们称之为Class1 - 4.我想设置它,这样当我运行这些测试时,Prepare只会被称为一次。例如:

运行3 + 4:

Prepare Setup
     Run3
     Run4
Prepare Teardown

正在运行1 - 4:

Prepare Setup
     Run1
     Run2
     Run3
     Run4
Prepare Teardown

现在每次开始时准备初学者,然后在每次结束时结束。在如何运行该命名空间中的所有测试之前,如何才能使其成为连续的?

2 个答案:

答案 0 :(得分:1)

您可以使用继承。您可以创建一个所有测试继承的基类,并在基类中创建您的设置。

你必须小心这样做。这将掩盖设置给任何正在查看子类的人。除非您覆盖设置,并且至少在每个班级中调用base.Setup

但是,这只会有助于代码重用。我不相信这会像你想要的那样工作,也不应该。对于每个测试类,此设置应该运行一次。在您的单元测试中,您不应该依赖于以前的测试,因此如果您需要这样,那么您可能需要重新查看测试。他们应该自己工作,而不需要任何先前的测试必须运行。如果你这样做,那么让每个班级设置自己的灯具应该不是问题。

解决这个问题的唯一方法就是将所有测试都放在一个夹具中,这也是不好的测试设计。

<强>更新

看起来您可以在将为整个程序集运行的全局类上使用SetupFixture属性。但是,如上所述,请谨慎使用,因为您通常不希望在单元测试中使用共享状态。

从上述链接中得出的值得注意的是:

  

在给定的命名空间中只应创建一个SetUpFixture。一个   任何命名空间之外的SetUpFixture都提供SetUp和TearDown   整个集会。

答案 1 :(得分:1)

创建装配设置夹具将是最好的方法。

    //This class does not have a namespace on purpose, do not add one.
  [SetUpFixture]
  public class AssemblySetupFixture
  {
    [SetUp]
    public void SetupTestSuite()
    {
        Debug.WriteLine("Setting up Test Assembly Fixture");
     // Kill all web server instances and then restart them
        WebServerHelper.StopAll(); 
        WebServerHelper.StartAll();
       DatabaseHelper.RestoreDefaultDatabases();
     }

    [TearDown]
    public void TearDownTestSuite()
    {
        Debug.WriteLine("Tearing down Assembly Fixture");
        WebServerHelper.StopAll();
    }
  }