每个测试都会调用OneTimesetup,我认为OneTimesetup就像BeforeSuite,TestNG注释一样

时间:2018-11-25 07:27:58

标签: c# nunit winium

在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");
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

从文档中,OneTimeSetup在TestFixture中的所有测试之前被调用一次。您的示例有两个固定装置,因此该设置称为两次。您需要将所有测试都放在同一夹具中。

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

答案 1 :(得分:1)

关于SetUpFixture,第一个答案不正确。

SetUpFixture的工作原理与以前一样。如果您有SetUpFixture,则OneTimeSetUpOneTimeTearDown的方法将在同一命名空间下为所有灯具运行一次。

另一方面,在TestFixture中,OneTimeSetUpOneTimeTearDown方法仅对灯具本身运行一次

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

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

SetUpFixtures与夹具继承没有任何关系(从未有过)。您应该设置为SetUpFixtureTestFixture基类。如果出于某种原因同时需要两者,请使用两个类。在这种情况下,您只需要SetUpFixture,而无需继承。

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

何时使用SetUpFixture:当您希望某个代码只执行一次时,则在运行所有灯具之前,然后在所有灯具运行之后再次执行。

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

我会担心使用相同的驱动程序进行大约100次测试。我已经看到有些人每次 test 使用一个驱动程序,而另一些人每个 fixture_使用一个驱动程序。为__everything 使用一个选项意味着您要格外小心,每个测试在执行完之后都会自动清除,并将驱动程序还原到相同的状态。我怀疑这是否可能。

但是,作为练习,如果您确实想要以下方法,请执行以下操作: 1.有一个基类,除了驱动程序成员外什么都没有。 2.从基类派生SetUpFixture并在那里创建/销毁驱动程序。 3.从相同的基类派生TestFixture。他们使用但不更改驱动程序。