Есть ли способ, чтобы тест мог иметь свой TestCaseSource для чтения данных из внешнего источника (например, Excel)? - PullRequest
0 голосов
/ 25 октября 2019

Я пишу новые тесты в Nunit. Я бы хотел, чтобы тесты получали свои значения TestCaseSource из таблицы Excel (тесты, управляемые данными).

Однако я заметил, что метод [SetUp] действительно доступен ПОСЛЕ того, как метод [Test] введен, поэтомуЯ не могу инициализировать данные, которые я прочитал из своего листа Excel в TestCaseSource.

Как мне инициировать мой TestCaseSource из файла Excel ДО ПРОВЕДЕНИЯ каждого теста?

Спасибо

Я попытался использовать отдельный класс, такой как MyFactoryClass, а затем использовал

[Test, TestCaseSource(typeof(MyFactoryClass), "TestCases")]

Однако это достигается до метода [Setup] и не распознает имя файла Excel, который назван после имени каждого теста.

1 Ответ

0 голосов
/ 25 октября 2019

При использовании NUnit важно понимать этапы, которые проходит тест, когда он загружается, а затем запускается. Поскольку я не знаю, что вы делаете на каждом этапе, я начну с описания этих этапов. Я добавлю к этому ответу после того, как вы опубликуете некоторый код, который показывает, что делают ваш фабричный класс, ваш метод [SetUp] и ваши фактические тесты.

Вкратце, NUnit загружает тесты передэто работает им. На самом деле он может запускать тесты нескольких таймов для каждой нагрузки - это зависит от типа используемого бегуна. Примеры:

  1. NUnit-console загружает тесты один раз и запускает их один раз, затем завершает работу.

  2. TestCentric GUI загружает тесты один раз, а затем запускает их каждыйвремя, когда вы выбираете тесты и нажимаете кнопку выполнить. Он также может перезагрузить их, используя опцию меню.

  3. TestExplorer, используя тестовый адаптер NUnit 3, загружает тесты и затем запускает их каждый раз, когда вы нажимаете кнопку выполнить.

В идеале вы должны написать свои тесты, чтобы они работали под любым бегуном. Для этого вы должны предположить, что они будут запускаться несколько раз для каждой загрузки. Не пишите код во время загрузки, который вы хотите видеть повторяющимся для каждого запуска. Если вы будете следовать этому правилу, у вас будут более надежные тесты.

Итак ... что делает NUnit на каждом этапе? Вот оно ...

Загрузка ...

  • Весь код в вашем [TestCaseSource] выполняется.

Запуск ...

  • Для каждого TestFixture (для простоты я проигнорирую SetUpFixtures)

    • Запустите любой [OneTimeSetUp] метод

    • Для каждого Test или TestCase

      • Запустите любой [SetUp] метод
      • Запустите сам тест
      • Запустите любой [TearDown] method
    • Запустить любой [OneTimeTearDown] method

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

В вашем [TestCaseSource] вы должны вызывать только фабрику, которая создает объекты, если вы заранее знаете, какие объекты создавать. Обычно лучший подход - инициализировать те параметры, которые будут использоваться для создания объектов. Затем они используются для создания объектов в [OneTimeSetUp] или [SetUp] в зависимости от времени жизни объекта, к которому вы стремитесь.

Этого достаточно (возможно, слишком) для обобщения! Если вы отправите код, я добавлю более конкретные предложения к этому ответу.

...