При использовании NUnit важно понимать этапы, которые проходит тест по мере его загрузки и последующего запуска. Поскольку я не знаю, что вы делаете на каждом этапе, я начну с описания этих этапов. Я добавлю к этому ответу после того, как вы опубликуете некоторый код, который показывает, что делают ваш заводской класс, ваш метод [SetUp]
и ваши фактические тесты.
Короче говоря, NUnit загружает тесты до того, как выполняет их. На самом деле он может запускать тесты несколько раз для каждой загрузки - это зависит от типа используемого бегуна. Примеры:
NUnit-console загружает тесты один раз и запускает их один раз, а затем завершает работу.
TestCentric GUI загружает тесты один раз, а затем запускает их каждый раз, когда вы выбираете тесты и нажимаете «Выполнить». Он также может перезагружать их с помощью пункта меню.
TestExplorer с помощью тестового адаптера NUnit 3 загружает тесты, а затем запускает их каждый раз, когда вы нажимаете "Выполнить".
В идеале вы должны писать свои тесты так, чтобы они работали под любым раннером. Для этого вы должны предположить, что они будут запускаться несколько раз для каждой загрузки. Не пишите код во время загрузки, который вы хотите повторять при каждом запуске. Если вы будете следовать этому правилу, у вас будут более надежные тесты.
Итак... что делает NUnit на каждом этапе? Вот...
Загрузка...
- Весь код в вашем
[TestCaseSource]
выполняется.
Бег...
Как вы заметили, код, который вы пишете для любого шага, может зависеть только от уже выполненных шагов. В частности, действие, выполняемое при загрузке теста, не может зависеть от действий, являющихся частью его запуска. Это имеет смысл, если учесть, что «загрузка» на самом деле означает создание теста, который будет выполняться.
В вашем [TestCaseSource]
вы должны вызывать фабрику, которая создает объекты, только если вы заранее знаете, какие объекты создавать. Обычно лучший подход заключается в инициализации тех параметров, которые будут использоваться для создания объектов. Затем они используются для фактического создания объектов в [OneTimeSetUp]
или [SetUp]
в зависимости от срока службы объекта, к которому вы стремитесь.
Это достаточное (возможно, слишком большое) обобщение! Если вы опубликуете код, я добавлю в этот ответ более конкретные предложения.
person
Charlie
schedule
25.10.2019