NUnit - Использование OneTimeSetup и параметризованного TestFixture? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь написать Nunit-тесты, которые используют параметризованные TestFixtures, но вызывают только OneTimeSetupOneTimeTearDown) один раз за все выполнение (по каждому параметру, очевидно).У меня есть свои тесты в отдельных классах, но OneTimeSetup и OneTimeTearDown выполняются один раз перед КАЖДЫМ TestClass.Итак, операторы отладки для первого параметра выглядят так:

OneTimeSetUp: parameter: param1
TestClassOneTestOne
TestClassOneTestTwo
OneTimeTearDown: parameter: param1
OneTimeSetUp: parameter: param1
TestClassTwoTestOne
TestClassTwoTestTwo
OneTimeTearDown: parameter: param1

Но я хочу вот что:

OneTimeSetUp: parameter: param1
TestClassOneTestOne
TestClassOneTestTwo
TestClassTwoTestOne
TestClassTwoTestTwo
OneTimeTearDown: parameter: param1

Я думаю Я могу достичь того, чтоЯ хочу, дублируя каждый тестовый тест на каждом из тестовых классов, но я буду запускать лотов различных тестов, и я хочу определить несколько параметров только один раз.Кроме того, если я помещу OneTimeSetUp и OneTimeTearDown в совершенно разные пространства имен (например, this ), я не смогу получить доступ к любым глобальным переменным в TestCaseSetup (например, экземпляру веб-драйвера) для инициализациибраузер

Вот мой код:

TestCaseSetup.cs

namespace NunitTests
{
    [TestFixture("param1")]
    [TestFixture("param2")]
    public class TestCaseSetup
    {
        private readonly string _param;

        public TestCaseSetup(string param)
        {
            _param = param;
        }

        [OneTimeSetUp]
        public void OneTimeSetUp()
        {
            Debug.WriteLine("OneTimeSetUp: parameter: " + _param)
        }

        [OneTimeTearDown]
        public void OneTimeTearDown()
        {
            Debug.WriteLine("OneTimeTearDown: parameter: " + _param)
        }
    }
}

Tests / TestClassOne.cs

namespace NunitTests.Tests
{
    public class TestClassOne : TestCaseSetup
    {
        public TestClassOne(string param) :
            base(param, param)
        { }

        [Test]
        public void TestClassOneTestOne()
        {
            Debug.WriteLine("TestClassOneTestOne");
        }

        [Test]
        public void TestClassOneTestTwo()
        {
            Debug.WriteLine("TestClassOneTestTwo");
        }
    }
}

Tests / TestClassTwo.cs

namespace NunitTests.Tests
{
    public class TestClassTwo : TestCaseSetup
    {
        public TestClassTwo(string param) :
            base(param, param)
        { }

        [Test]
        public void TestClassTwoTestOne()
        {
            Debug.WriteLine("TestClassTwoTestOne");
        }

        [Test]
        public void TestClassTwoTestTwo()
        {
            Debug.WriteLine("TestClassTwoTestTwo");
        }
    }
}

1 Ответ

0 голосов
/ 01 марта 2019

Мне удалось решить эту проблему, используя комбинацию статических переменных и SetUpFixture только с атрибутом OneTimeTearDown.Надеюсь, это поможет другим.Я пытался написать тесты на селен, поэтому я включу свое решение для этого.

TestFixtureSetup.cs

namespace NunitTests
{
    [TestFixture("chrome")]
    [TestFixture("firefox")]
    public class TestFixtureSetup
    {
        public static IWebDriver Driver;
        public static string Browser;

        public TestFixtureSetup(string browser)
        {
            Browser = browser;
        }

        public void SetUpDriver()
        {
            if (Driver != null) return; // Exit method every time except for the first.

            var caps = new DesiredCapabilities();
            caps.SetCapability(CapabilityType.BrowserName, Browser);
            Driver = new RemoteWebDriver(new Uri("http://ondemand.saucelabs.com:80/wd/hub"),  // Saucelabs URI.  FYI. 
                caps, TimeSpan.FromSeconds(600));
        }
    }
}

TestFixtureTearDown.cs

namespace NunitTests
{
    [SetUpFixture]
    public class TestFixtureTearDown
    {
        [OneTimeTearDown]
        public void TearDownDriver()
        {
            // Note that I am calling the static instance of the TestFixtureSetup variables
            if (TestFixtureSetup.Driver == null) return;

            Debug.WriteLine("Browser: " + TestFixtureSetup.Browser);

            TestFixtureSetup.Driver.Dispose();
        }
    }
}

Tests / TestClassOne.cs

namespace NunitTests.Tests
{
    public class TestClassOne : TestFixtureSetup
    {
        public TestClassOne(string browser) :
            base(browser)
        { }

        [OneTimeSetUp]
        public void OneTimeSetUp()
        {
            SetUpDriver()
        }

        [Test]
        public void TestClassOneTestOne()
        {
            Debug.WriteLine("TestClassOneTestOne");
        }

        [Test]
        public void TestClassOneTestTwo()
        {
            Debug.WriteLine("TestClassOneTestTwo");
        }
    }
}

Tests / TestClassTwo.cs

пространство имен NunitTests.Tests {открытый класс TestClassTwo: TestFixtureSetup {public TestClassTwo (браузер строк): base (браузер) {}

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
        SetUpDriver()
    }

    [Test]
    public void TestClassTwoTestOne()
    {
        Debug.WriteLine("TestClassTwoTestOne");
    }

    [Test]
    public void TestClassTwoTestTwo()
    {
        Debug.WriteLine("TestClassTwoTestTwo");
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...