C# NUnit将数据从OneTimeSetUp传递到该夹具中的所有测试
在NUnit中,我试图在测试夹具的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中定义的测试用
OneTimeSetUp
期间初始化一个变量,并在该夹具下的所有测试用例中引用该变量
OneTimeSetUpAttribute
应用于名为Initializer.cs
的文件中的一个函数,我在其中初始化名为driver
的SeleniumIWebDriver
的新实例,并应用一些常见配置选项。我的测试用例在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来说似乎是一个很好的模式