C# NUnit将数据从OneTimeSetUp传递到该夹具中的所有测试

C# NUnit将数据从OneTimeSetUp传递到该夹具中的所有测试,c#,selenium,automated-tests,nunit,C#,Selenium,Automated Tests,Nunit,在NUnit中,我试图在测试夹具的OneTimeSetUp期间初始化一个变量,并在该夹具下的所有测试用例中引用该变量 OneTimeSetUpAttribute应用于名为Initializer.cs的文件中的一个函数,我在其中初始化名为driver的SeleniumIWebDriver的新实例,并应用一些常见配置选项。我的测试用例在TestCases.cs中定义,与Initializer.cs位于同一名称空间和目录中。是否可以通过某种方式将驱动程序变量传递给TestCases.cs中定义的测试用

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

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

我正在使用VisualStudioTestExplorer执行测试

Initializer.cs

命名空间自动化测试
{
[固定装置]
公共类初始值设定项
{
IWebDriver=null;
[一次性设置]
在()之前公开无效
{
ChromeOptions选项=新的ChromeOptions();
//这里有一些初始的浏览器配置
驱动器=新的镀铬驱动器(“.”);
}
[onetimeeartown]
在()之后公共无效
{
driver.Close();
}
}
}
TestCases.cs

namespace AutoamtedTests
{
公共类测试用例
{
[测试]
公共void AutomatedTest()
{
//是否可以在此处引用“驱动程序”?
}
}
}

每次测试前都要执行一次设置, OneTimeSetup,这是在之前执行的 所有测试都已运行。

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

此外,由于设置发生在初始值设定项中,因此您可能应该 让您的测试用例从该初始值设定项继承。 在初始值设定项中还需要一个默认构造函数。

除了继承之外,另一个选择是使驱动程序 属性为静态。那么你可以这样称呼它

var _driver = Initializer.driver;

每次测试前,应执行一次设置, OneTimeSetup,这是在之前执行的 所有测试都已运行。

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

此外,由于设置发生在初始值设定项中,因此您可能应该 让您的测试用例从该初始值设定项继承。 在初始值设定项中还需要一个默认构造函数。

除了继承之外,另一个选择是使驱动程序 属性为静态。那么你可以这样称呼它

var _driver = Initializer.driver;

您需要使用
[SetUp]
[TearDown]
属性来完成此操作——将
[SetUp]
[TearDown]
方法分别放在
初始值设定项
类的
Before()
After()
方法之上。然后,在您的
TestCases
类中,继承
Initializer
,这样您就可以访问您在那里声明和初始化的
驱动程序
类变量。下面是一个例子:

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模型的方法,因为您可以在测试用例级别上初始化PageObject。

您需要使用
[SetUp]
[TearDown]
属性来完成这一任务——将
[SetUp]
[TearDown]
方法放在
初始值设定项
类中,分别在
Before()
After()方法上方。然后,在您的
TestCases
类中,继承
Initializer
,这样您就可以访问您在那里声明和初始化的
驱动程序
类变量。下面是一个例子:

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
}
这也为我们提供了一种利用页面对象模型的方法,因为您可以在测试用例级别初始化页面对象。

设置夹具
和它所控制的
测试夹具
之间没有(也不应该有)任何连接。因此,除了通过静态属性获取驱动程序外,无法从SetUpFixture获取驱动程序,这只是自找麻烦

对于单个夹具,最简单的方法是在夹具本身的
OneTimeSetUp
方法中创建驱动程序。对于多个fixture,您可以重复相同的代码,或者将其放入所有fixture共享的基类中。最终,每个装置将有一个驱动程序,这对于许多web应用程序来说似乎是一个很好的模式

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

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

对于单个夹具,最简单的方法是在夹具本身的
OneTimeSetUp
方法中创建驱动程序。对于多个fixture,您可以重复相同的代码,或者将其放入所有fixture共享的基类中。最终,每个设备将有一个驱动程序,这对于许多web ap来说似乎是一个很好的模式