NUnit 将来自 OneTimeSetUp 的数据传递给该夹具中的所有测试

NUnit pass data from OneTimeSetUp to all tests in that fixture

在 NUnit 中,我试图在测试夹具 OneTimeSetUp 期间初始化一个变量,并在该夹具下的所有测试用例中引用该变量。

OneTimeSetUpAttribute 应用于名为 Initializer.cs 的文件中的一个函数,我在其中初始化了一个名为 driver 的 Selenium IWebDriver 的新实例,并应用了一些常见的配置选项。我的测试用例在 TestCases.cs 中定义在与 Initializer.cs 相同的命名空间和目录中。是否可以通过某种方式将 driver 变量传递给 TestCases.cs 中定义的测试用例?如果不是,那么我应该如何解决在每个新测试 运行 上初始化 IWebDriver 的新实例,而不必在我添加的每个测试用例文件的 SetUp 期间初始化它?请参阅下面的代码。

我正在使用 Visual Studio 测试资源管理器来执行测试。

Initializer.cs

namespace AutomatedTests
{
    [SetUpFixture]
    public class Initializer
    {
        IWebDriver driver = null;

        [OneTimeSetUp]
        public void Before()
        {
            ChromeOptions options = new ChromeOptions();
            // some initial browser configuration here

            driver = new ChromeDriver(".");
        }

        [OneTimeTearDown]
        public void After()
        {
            driver.Close();
        }
    }
}

TestCases.cs

namespace AutoamtedTests
{
    public class TestCases
    {
        [Test]
        public void AutomatedTest()
        {
            // is it possible to reference 'driver' here?
        }
    }
}

设置应该在每次测试前执行一次, OneTimeSetup,这个是之前执行的 所有测试都是 运行。 https://github.com/nunit/docs/wiki/SetUp-and-TearDown

这样,你就有了一个方法。或者你可以创建一个 初始化方法,运行在每次测试开始时。

此外,由于设置发生在初始化程序中,您可能应该 让您的测试用例继承自该初始化程序。 您还需要在初始化程序中使用默认构造函数。 https://github.com/nunit/docs/wiki/SetUpFixture-Attribute

除了继承之外,另一种选择是使驱动程序 属性 静态。然后你可以像

这样称呼它
var _driver = Initializer.driver;

您需要使用 [SetUp][TearDown] 属性来完成此操作——将您的 [SetUp][TearDown] 方法放在 Initializer class,分别在 Before()After() 方法之上。然后,在您的 TestCases class 中,继承 Initializer 以便您可以访问您在那里声明和初始化的 driver class 变量。这是一个例子:

public class Initializer
{
    IWebDriver driver = null;

    [SetUp]
    public void Before()
    {
        ChromeOptions options = new ChromeOptions();
        // some initial browser configuration here

        driver = new ChromeDriver(".");
    }

    [TearDown]
    public void After()
    {
        driver.Close();
    }
}

然后,TestCases.cs

public class TestCases : Initializer // inherit initializer here
{
    [Test] // each time you run this test, [SetUp] runs first
    public void AutomatedTest()
    {
        driver.FindElement(); // driver class variable inherited from Initializer.cs

        // you can use driver to initialize PageObjects too
        var myPageObject = new MyPageObject(driver); 
        myPageObject.DoSomething();

    } // each time this test is completed, [TearDown] runs
}

这也很容易为我们提供了一种利用 PageObject 模型的方法,因为您可以在测试用例级别初始化 PageObjects。

SetUpFixture 与其管辖的 TestFixture 之间没有(也不应该有)任何联系。因此,除了通过静态 属性 之外,没有办法从 SetUpFixture 获取驱动程序,这只是自找麻烦!

对于单个灯具,最简单的做法是在灯具本身的 OneTimeSetUp 方法中创建驱动程序。在多个灯具的情况下,您可以重复相同的代码或将其放在所有灯具共享的基础 class 中。您最终会为每个装置配备一个驱动程序,这对于许多 Web 应用程序来说似乎是一种很好的模式。

请注意,您不能在并行 运行 的测试之间共享夹具。对于测试用例的并行执行,您必须在 SetUp 方法中初始化驱动程序,以便每个 ase 都有自己的驱动程序。我建议的模式为每个夹具提供一个单独的驱动程序,因此夹具可以 运行 并行,而每个夹具中的测试用例应该只 运行 顺序并且应该根据需要初始化驱动程序的状态.