nunit: инициализация глобальной переменной в setupfixture - PullRequest
0 голосов
/ 03 апреля 2020

Я очень новичок в C# и нунит. Пожалуйста, потерпите меня, если это основа c и уже была задана здесь.

У нас есть глобальная установка, определенная классом [SetupFixture], которая должна быть запущена только один раз. Закрытые переменные определены в его [setup]. Мы sh будем использовать одни и те же переменные во всех наших testfixtures, следовательно, наследуем класс testbase во всех наших testfixtures. Но, выполняя Testcase1, я заметил, что globalSetup () вызывается более одного раза. Кто-нибудь может указать мне проблему? Пример кода, как показано ниже.

namespace CTB
    {
         [SetupFixture] 
         public class Testbase
         {
            private byte val1;
            private byte val2;  


        [setup]
        public void globalSetup
        {
           val1 = 5;
           val2 = 10;
        }

        [Teardown]
        public void globalTeardown
        {
            //
        }
      }
}


namespace CTB.Testcase
{

    public class TestCase : Testbase
    {
        [Setup]
        public void Setup()
        {

        }

        [Teardown]
        public void Teardown()
        {

        }

        [Test]
        public void Testcase1()
        {
            byte val3 = val1 + val2; // Expect 15
        }
    }
}

1 Ответ

0 голосов
/ 03 апреля 2020

Я предполагаю, что ответом на мой комментарий является «Нет» и что вы используете текущую версию NUnit 3. Пожалуйста, исправьте меня, если я ошибаюсь. : -)

Вы заставили класс TestBase выполнять две функции:

  1. Это базовый класс для вашего TestFixture и, следовательно, он сам по себе TestFixture .

  2. Он помечен как SetUpFixture, поэтому он также выполняет эту функцию - кстати, совершенно другую функцию.

ясно, вы никогда не должны делать это. Это своего рода «трюк», который, кажется, почти предназначен для того, чтобы запутать NUnit - конечно, это не ваше намерение. Ваши тестовые приборы не должны иметь никаких отношений наследования с любым SetUpFixture. Используйте разные классы для базы тестового прибора и установочного прибора.

С этим из дальней, вот более длинная история того, что происходит ...

  1. Перед вашими тестами даже если выполнить, SetUpFixture сначала «запускается» - в кавычках, потому что на самом деле ничего не делает. Это потому, что он не содержит методов, помеченных [OneTimeSetUp] или '[OneTimeTearDown] `.

ПРИМЕЧАНИЕ. В качестве альтернативного объяснения, если вы используете довольно старую версию NUnit , методы [SetUp] и [TearDown] на самом деле вызываются в этот момент. Nnit V2 использовал эти атрибуты с различными значениями, когда они встречались в SetUpFixture по сравнению с TestFixture.

Далее ваши тесты будут выполнены. Перед каждым тестом запускаются унаследованные [SetUp] и [TearDown] методы. Конечно, на самом деле это те же методы, что и в шаге 1. NUnit был обманут в этом!

Вот некоторые общие рекомендации на будущее ...

  1. Если вы хотите, чтобы несколько приборов использовали одни и те же данные, полезно использовать базовый класс. Любые публичные c или защищенные поля или свойства будут совместно использоваться наследующими приборами.

  2. Если вы хотите выполнить некоторые общие настройки или демонтаж для группы не связанных испытательные приборы, используйте SetUpFixture. Обратите внимание, что единственный способ передачи данных из SetUpFixture в тестовые приборы - через поля или свойства stati c. Обычно вы используете SetUpFixture для настройки среды , в которой выполняется тест, а не для предоставления данных.

  3. Никогда используйте один и тот же класс для обеих целей.

...