【问题标题】:OneTimesetup is getting invoked for each Test,I thought OneTimesetup is like BeforeSuite,TestNG annotation每次测试都会调用 OneTimesetup,我认为 OneTimesetup 就像 BeforeSuite,TestNG 注释
【发布时间】:2019-07-16 11:23:19
【问题描述】:

在 Nunit C# 中,我试图只打开一次应用程序并对其进行修改,例如,我创建了记事本应用程序的这个演示。在我的实时项目中,我只需登录应用程序一次并执行所有 100 个测试用例,然后关闭桌面应用程序。请告诉我我在这里做错了什么,非常感谢!顺便说一句,我是 C# 新手

using NUnit.Framework;
using OpenQA.Selenium.Remote;
using System;
using OpenQA.Selenium;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Notepad
{ }
    [SetUpFixture]
    public class BaseClass

    {
        public static IWebDriver driver;

        [OneTimeSetUp]
        public static void AssemblyInitalize()
        {
            var dc = new DesiredCapabilities();
            dc.SetCapability("app", @"C:\\Windows\\System32\\notepad.exe");
            driver = new RemoteWebDriver(new Uri("http://localhost:9999"), dc);
            Thread.Sleep(5000);
        }

        [OneTimeTearDown]
        public static void oneTearDown()
        {
            driver.FindElement(By.Id("Close")).Click();

        }
    }

---第一次测试---

namespace Notepad
{    [TestFixture]
    public class Notepad2:BaseClass
    {

        [Test]
     public void test2()
        {
            driver.FindElement(By.Id("15")).SendKeys("My Teacher ");
        }

    }
}

---- 第二个测试班----

 using NUnit.Framework;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using OpenQA.Selenium;

    namespace Notepad 
    {    [TestFixture]
      public  class NoteTest : BaseClass

        {


            [Test]
            public void Test()
            {

                driver.FindElement(By.Id("15")).SendKeys("...is Coming now");
            }
        }
    }

【问题讨论】:

    标签: c# nunit winium


    【解决方案1】:

    关于SetUpFixture,第一个答案是错误的。

    SetUpFixture 的工作方式与以往完全相同。如果你有一个SetUpFixture,它的OneTimeSetUpOneTimeTearDown 方法将在同一命名空间下针对所有灯具运行一次。

    另一方面,在 TestFixture 内部,OneTimeSetUpOneTimeTearDown 方法只运行一次用于夹具本身

    换句话说,这些方法在使用它们的特定范围内“一次性”运行,命名空间或固定装置。

    问题是您使用与 both SetUpFixture 和所有 TestFixtures 的基类相同的类。这意味着如果您有n 测试装置,它将运行n + 1 次!这就是你所看到的。

    SetUpFixtures 与夹具继承没有任何关系。您应该或者将您的类设为SetUpFixtureTestFixture 基类。如果出于某种原因,你需要两者,那么使用两个类。在这种情况下,您只需要SetUpFixture,不需要继承。

    何时从基类继承:当您希望多次执行相同的代码时,每个夹具执行一次。请注意,当以这种方式用于一次性设置和拆卸时,您的基类通常不应标记为 TestFixture。

    何时使用 SetUpFixture:当您希望某些代码只执行一次时,在每个夹具运行之前以及在所有夹具运行后再次执行一次。

    在您的示例中,您使用 SetUpFixture 来控制初始化的时间。您正在使用继承来允许您共享驱动程序。问题是基类中的 OneTimeSetUp 实际上是 each 测试夹具的一部分,而您不希望这样。

    我会担心一百个左右的测试都使用相同的驱动程序。我见过一些人每个测试使用一个驱动程序,而其他人每个fixture_使用一个驱动程序。为 __everything 使用一个意味着您非常小心,每个测试都会自行清理并将驱动程序恢复到相同的状态。我怀疑这是可能的。

    但是,作为练习,如果您真的想这样做,可以按照以下方法进行: 1. 有一个只有驱动成员的基类。 2. 从基类派生 SetUpFixture 并在那里创建/销毁驱动程序。 3. 从相同的基类派生 TestFixtures。他们使用但不更改驱动程序。

    【讨论】:

    • 感谢您花时间教育我,非常感谢。 :) 即使我将 BaseClass 设置为 TestFixture,我仍然无法调用不同类中的测试。顺序是这样的 1)OneTimeSetup 2)DerivedTestClass 3) 每个测试用例的 OneTimeTeardown。只有当我将所有测试用例放在同一个类中时,它似乎才能按预期工作。即 1) OneTimeSetup 2) 所有测试用例,然后 3) OneTimeTeardown。我想要的只是打开应用程序一次并只运行所有测试用例然后关闭应用程序。我该怎么做?再次感谢。
    • 正如我所写的“在这种情况下,您只需要 SetUpFixture,无需继承”。我将在答案中添加更多内容...
    • 让我们试试这个... 为什么您希望您的所有灯具使用相同的驱动程序?我会担心一个测试可能会出现故障,从而破坏所有其他测试。
    • 感谢您的回信。没有继承的SetUpFixture,测试用例的驱动怎么初始化,会抛出一个空对象引用,不是吗?
    • 是的,你是对的,但公司要求我只登录一次应用程序并执行所有测试用例,然后关闭应用程序。你有什么建议,我对用 C# 编写测试用例的新手持开放态度。我非常欢迎您的建议。
    【解决方案2】:

    根据文档,OneTimeSetup 在 TestFixture 中的所有测试之前调用一次。您的示例有两个固定装置,因此设置被调用两次。您需要在同一个夹具中进行所有测试。

    此行为与 SetupFixture 属性上的旧 [Setup] 不同,后者为命名空间中的所有测试运行一次。

    【讨论】:

    • 非常感谢您的回复,如何将它们放在同一个 Fixture 中,我必须将所有测试用例放在同一个类中吗?
    • 或将基类设为TestFixture并扩展所有测试用例。
    • 我刚刚尝试通过将 BaseClass 设置为 TestFixture 并扩展两个测试用例,从两个测试中删除了 TestFixture 属性,但记事本仍然打开两次并拆除了两次。仅当我将测试用例放在同一类(即基类)中时,它才起作用。顺序是这样的 1)OneTimeSetup 2)DerivedTestClass 3) 每个测试用例的 OneTimeTeardown。但是当测试用例在同一个类中时,即 BaseClass,oneTimeSetup 和 OneTimeTearDown 分别在所有测试用例之前和之后只发生一次。
    • 在同一个类中有依赖于一个设置的所有测试是很正常的,即使有 100 个。
    • 再次感谢您的回复,测试用例并不小,您可能已经知道每个测试用例至少包含50多个步骤。代码会太长,会变得不可读且很难调试。
    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多