【问题标题】:How to run the method only once in NUnit C#如何在 NUnit C# 中只运行一次该方法
【发布时间】:2021-11-21 07:56:15
【问题描述】:

我对 C# 很陌生,并且一直是 Java 人。在 Java selenium 中,这可以通过使用 @BeforeSuite 注释来实现。最初,我认为可以通过使用 [OneTimeSetUp] 注释来实现,但事实并非如此。当我将Parent类继承给子类时,Parent类中提到的[OneTimeSetUp]被多次调用。

我的要求是,一旦开始执行,我想创建一个具有唯一 ID 的文件夹并将报告放在该文件夹中。我在方法中拥有相同的所有代码,但它被多次调用,导致脚本失败。

我尝试了很多搜索,我看到人们推荐使用 [SetUpFixture] 来做同样的事情。我也尝试过使用它,但它也不适合我。我错过了什么吗?这是我的代码

我的家长班:-

namespace Core.Framework.Controls
{
 [SetUpFixture]
 public class Controls
 {
    private string Browsername { get; set; }
    [OneTimeSetUp]
    public void BeforeSuite()
    {
       //Create Unique Folder
    }

Child1 班级:-

namespace Core
{
[TestFixture]
[Parallelizable]
public class UnitTest1 : Controls
{

    [Test]
    [TestCaseSource(typeof(Controls), "BrowsersToRunWith")]
    public void Bing(String browser)
    {
        SetUp(browser);
        Class1 class1 = new Class1(_controls);
        class1.LaunchURL("http://bing.com");
        class1.EnterTextInBing("Parallel Execution using C#");
        Thread.Sleep(3000);
    }
  }

Child2 类:-

namespace Core
{
[TestFixture]
[Parallelizable]
public class UnitTest2 : Controls
{
  
    [Test]
    [TestCaseSource(typeof(Controls), "BrowsersToRunWith")]
    public void Google(String browser)
    {
        SetUp(browser);
        Class1 class1 = new Class1(_controls);
        class1.LaunchURL("http://google.com");
    }
  }

}

根据@Charlie 的建议更新了项目结构

 Base Class 
     • Setup Fixture 
     • No TestFixture 
     • One Time Setup 
     • One Time Tear Down 

  Parent Class : Base Class 
     • No TestFixture 
     • Set Up 
         o Driver initialization 
     • Tear Down 
         o Driver Quit 

 Child Class1:Parent Class 
     • Test Fixture 
     • Test Method 
         o Getting the driver instance from Parent class and testing the application 

  Child Class2:Parent Class 
     • Test Fixture 
     • Test Method 
         o Getting the driver instance from Parent class and testing the application – 

基类图像

【问题讨论】:

  • 感谢您抽出宝贵时间寻找答案,但我确实使用@Charlie 提供的方法尝试了该解决方案,但这也不起作用。这是我所做的基类-我将带有 OneTimeSetUp 和 OneTimeTear 的 SetUpFixture 保留在此处控制器继承基类-我保留了我的 SetUp 并在此处拆除测试类-继承控制器-此处只有 TestFixture,没有 SetUp 或 OneTimeSetup 仍然,它不是为我工作。

标签: c# selenium nunit


【解决方案1】:

你快到了!我会解释...

SetUp 方法针对每个测试用例运行。 OneTimeSetUp 方法只运行一次...但按什么运行一次?

当他们在TestFixture 中时,他们会为夹具运行一次。它们扮演旧版本 NUnit 中以前称为 TestFixtureSetUp 的角色。当您使用基础夹具时,继承的OneTimeSetUp 成为每个夹具的一部分,它从基础继承。

所以这就是你的第一次尝试没有成功的原因。

正如您所说,创建SetUpFixture 是解决方案。 SetUpFixture 包含 OneTimeSetUp 方法,每个命名空间运行一次或整个程序集运行一次,具体取决于夹具是否在命名空间中定义。

因此,您创建的SetUpFixture 将为Core.Framework.Controls 命名空间中的每个测试执行运行一次。如果您在其他命名空间中有测试,那么这是一个很好的方法,不需要该设置。

那么为什么您的OneTimeSetUp 会为每个灯具运行?如果您在调试器中仔细观察,或者添加一些写入,您可能会看到它实际上运行了 n + 1 次,其中 n 是固定装置的数量!

通过从您的SetUpFixture 继承,除了作为(一次性)SetUpFixture 的功能之外,您还使其成为每个TestFixture 的一部分。您应该在此处停止使用继承。

当我创建SetUpFixture 时,我从未想过有人会继承它。文档绝对不建议这样做,直到最近才出现,当我现在看到一些人这样做时。如果您发现任何文章建议这样做,请让作者知道这是不正确的!

【讨论】:

  • 感谢查理如此详细的解释。我们(主要是来自 Selenium 的自动化人员)使用继承是因为它可以帮助我们针对基类中的每个方法(我们使用 SetUp)初始化一个新驱动程序,并且子类可以使用该驱动程序实例来测试应用程序不同的浏览器。这就是我们设计自动化框架的方式。删除继承可能有助于我只使用一次方法 [OneTimeSetUp],但这将改变我们的自动化框架的工作方式。您建议的任何其他解决方案?谢谢
  • 您无需更改任何其他内容...只需更改 SetUpFixture。您仍然可以拥有一个基类,所有 TestFixture 都从该基类继承,但它应该是分开的,因为 SetUpFixture 不打算被继承......至少不是按照您的方式。
  • 顺便说一句,我在 SetUpFixture 的文档中添加了警告说明。
  • 嗨@Charlie,我尝试了相同的设置,但仍然不适合我。我的 OneTimesetup 代码被多次调用。我在下面的评论中添加了我的结构。如果我遗漏了什么,请告诉我。我尝试将 Base 类与 Parent 类分开,但在这种情况下,OneTimeMethod 甚至不会被调用 1 次。
  • 基类 • 设置夹具 • 无 TestFixture • 一次设置 • 一次拆除父类:基类 • 无 TestFixture • 设置 o 驱动程序初始化 • 拆除 o 驱动程序退出子类 1:父类• 测试夹具 • 测试方法 o 从父类获取驱动程序实例并测试应用程序子类2:父类 • 测试夹具 • 测试方法 o 从父类获取驱动程序实例并测试应用程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多