OneTimesetup вызывается для каждого теста, я думал, OneTimesetup похож на BeforeSuite, аннотацию TestNG

В Nunit C# я пытаюсь открыть приложение только один раз и внести в него изменения, например, я создал это демо приложения Notepad. В моем проекте в реальном времени мне просто нужно войти в приложение только один раз, выполнить все 100 тестовых случаев и только затем закрыть приложение Desktop. Пожалуйста, скажите мне, что я делаю не так, спасибо большое! Кстати, я новичок в 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 ответа

Относительно SetUpFixture первый ответ неверный.

SetUpFixture работает точно так же, как и всегда. Если у тебя есть SetUpFixture, его OneTimeSetUp а также OneTimeTearDown методы будут запускаться один раз для всех приборов в одном и том же пространстве имен.

С другой стороны, внутри TestFixture OneTimeSetUp а также OneTimeTearDown методы запускаются только один раз для самого прибора.

Другими словами, методы запускаются "один раз" в пределах конкретной области, в которой они используются, пространства имен или фикстуры.

Проблема в том, что вы используете тот же класс, что и оба SetUpFixture и как базовый класс для всех ваших TestFixtures, Это означает, что если у вас есть n тестовые приборы, он будет работать n + 1 раз! Это то, что вы видите.

SetUpFixtures не делайте (никогда не имели) ничего общего с наследованием приборов. Вы должны либо сделать свой класс SetUpFixture или TestFixture Базовый класс. Если по какой-либо причине вам нужны оба, используйте два класса. В этом случае вам нужно только SetUpFixtureбез наследства.

Когда наследовать от базового класса: когда вы хотите, чтобы один и тот же код выполнялся много раз, по одному разу для каждого прибора. Обратите внимание, что ваш базовый класс, когда он используется для одноразовой настройки и разрыва таким образом, обычно не должен быть помечен как TestFixture.

Когда использовать SetUpFixture: когда вы хотите, чтобы некоторый код выполнялся только один раз, перед каждым запуском любого прибора и снова один раз после того, как все осветители были запущены.

В вашем примере вы используете SetUpFixture для управления временем инициализации. Вы используете наследование, чтобы позволить вам поделиться драйвером. Проблема в том, что OneTimeSetUp в базовом классе фактически является частью каждого тестового устройства, и вы этого не хотите.

Я был бы обеспокоен примерно сотней тестов, использующих один и тот же драйвер. Я видел, как некоторые люди используют один драйвер на тест, а другие - один драйвер на fixture_. Использование одного для __everything подразумевает, что вы необычайно осторожны, так как каждый тест очищает после себя и восстанавливает драйвер в том же состоянии. Я сомневаюсь, что это возможно.

Однако, как упражнение, вот как это сделать, если вы действительно хотите: 1. Иметь базовый класс только с членом-водителем. 2. Извлеките SetUpFixture из базового класса и создайте / уничтожьте драйвер там. 3. Извлеките TestFixtures из того же базового класса. Они используют, но не меняют драйвер.

Из документации OneTimeSetup вызывается один раз перед всеми тестами в TestFixture. В вашем примере есть два прибора, поэтому настройка вызывается дважды. Вы должны иметь все свои тесты в одном приборе.

Это поведение отличается от старого атрибута [Setup] в SetupFixture, который запускался один раз для всех тестов в пространстве имен.

Другие вопросы по тегам