Есть ли способ, которым тест может считывать данные TestCaseSource из внешнего источника (например, excel)?

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

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

Как мне инициализировать мой TestCaseSource из файла excel ДО запуска каждого теста?

Спасибо

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

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

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


person user12272269    schedule 25.10.2019    source источник


Ответы (1)


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

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

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

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

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

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

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

Загрузка...

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

Бег...

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

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

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

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

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

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

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

person Charlie    schedule 25.10.2019
comment
На самом деле у меня не так много кода. Я пытаюсь выяснить, как выполнить тест, управляемый данными, и выяснить, можно ли прочитать параметры моего теста с листа Excel. Я думал, что смогу прочитать свои параметры из внешнего источника, а затем каким-то образом передать параметры в [TestCaseSource]. - person user12272269; 30.10.2019