0

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

2 回答 2

4

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

SetUpFixture工作方式与一直以来的工作方式完全相同。如果你有一个SetUpFixture,它OneTimeSetUpOneTimeTearDown方法将为同一命名空间下的所有固定装置运行一次。

另一方面,在TestFixtureOneTimeSetUp方法内部只为夹具本身OneTimeTearDown运行一次。

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

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

SetUpFixtures与夹具继承无关(从未有过)。您应该您的类设为 aSetUpFixtureTestFixture基类。如果出于某种原因,你需要两者,那么使用两个类。在这种情况下,您只需要SetUpFixture, 不需要继承。

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

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

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

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

然而,作为一个练习,如果你真的想这样做,这里是如何做到的: 1. 有一个只包含驱动程序成员的基类。2. 从基类派生 SetUpFixture 并在那里创建/销毁驱动程序。3. 从相同的基类派生 TestFixtures。他们使用但不更改驱动程序。

于 2018-11-25T12:54:02.120 回答
2

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

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

于 2018-11-25T08:47:22.167 回答