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 都有自己的驱动程序。我建议的模式为每个夹具提供一个单独的驱动程序,因此夹具可以 运行 并行,而每个夹具中的测试用例应该只 运行 顺序并且应该根据需要初始化驱动程序的状态.
在 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 都有自己的驱动程序。我建议的模式为每个夹具提供一个单独的驱动程序,因此夹具可以 运行 并行,而每个夹具中的测试用例应该只 运行 顺序并且应该根据需要初始化驱动程序的状态.