OneTimesetup вызывается для каждого теста, я думал, OneTimesetup похож на BeforeSuite, аннотацию TestNG - PullRequest
0 голосов
/ 25 ноября 2018

В 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 ]

0 голосов
/ 25 ноября 2018

Что касается SetUpFixture, первый ответ неверен.

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 25 ноября 2018

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

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

...