Что касается SetUpFixture
, первый ответ неверен.
SetUpFixture
работает точно так же, как и всегда.Если у вас есть SetUpFixture
, то методы OneTimeSetUp
и OneTimeTearDown
будут запускаться один раз для всех приборов в одном и том же пространстве имен.
С другой стороны, внутри TestFixture
методы OneTimeSetUp
и OneTimeTearDown
запускаются только один раз для самого прибора .
Другими словами, методы запускаются "один раз" в той конкретной области, в которой они используются, namespace или fixture.
Проблема в том, что вы используете тот же класс, что и и a SetUpFixture
, и в качестве базового класса для всех ваших TestFixtures
.Это означает, что если у вас есть n
тестовые приборы, он будет работать n + 1
раз!Это то, что вы видите.
SetUpFixtures
не имеют (никогда не имели) ничего общего с наследованием свойств.Вы должны или сделать свой класс базовым SetUpFixture
или TestFixture
.Если по какой-либо причине вам нужны оба, используйте два класса.В этом случае вам понадобится только SetUpFixture
без наследования.
Когда наследовать от базового класса: когда вы хотите, чтобы один и тот же код выполнялся много раз, по одному для каждого устройства.Обратите внимание, что ваш базовый класс, когда он используется для одноразовой настройки и разрыва таким образом, обычно , а не должен быть помечен как TestFixture.
Когда использовать SetUpFixture: Когда вы хотите, чтобы некоторыекод для выполнения только один раз, перед каждым запуском любого прибора и еще раз один раз после запуска всех приборов.
В вашем примере вы используете SetUpFixture для управления временем инициализации.Вы используете наследование, чтобы позволить вам поделиться драйвером.Проблема в том, что OneTimeSetUp в базовом классе на самом деле является частью каждого тестового прибора, и вы этого не хотите.
Я был бы обеспокоен сотней или около того тестов, все с использованиемтот же водитель.Я видел, как некоторые люди использовали один драйвер на тест , а другие - один драйвер на fixture_.Использование одного для __everything подразумевает, что вы чрезвычайно осторожны, чтобы каждый тест очищался после самого себя и возвращал драйвер в то же состояние.Я сомневаюсь, что это возможно.
Однако, как упражнение, вот как это сделать, если вы действительно хотите: 1. Иметь базовый класс только с членом-водителем.2. Извлеките SetUpFixture из базового класса и создайте / уничтожьте там драйвер.3. Извлеките TestFixtures из того же базового класса.Они используют, но не меняют драйвер.