OneTimesetup вызывается для каждого теста, я думал, OneTimesetup похож на BeforeSuite, аннотацию TestNG
В Nunit C# я пытаюсь открыть приложение только один раз и внести в него изменения, например, я создал это демо приложения Notepad. В моем проекте в реальном времени мне просто нужно войти в приложение только один раз, выполнить все 100 тестовых случаев и только затем закрыть приложение Desktop. Пожалуйста, скажите мне, что я делаю не так, спасибо большое! Кстати, я новичок в C#
using NUnit.Framework;
using OpenQA.Selenium.Remote;
using System;
using OpenQA.Selenium;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace Notepad
{ }
[SetUpFixture]
public class BaseClass
{
public static IWebDriver driver;
[OneTimeSetUp]
public static void AssemblyInitalize()
{
var dc = new DesiredCapabilities();
dc.SetCapability("app", @"C:\\Windows\\System32\\notepad.exe");
driver = new RemoteWebDriver(new Uri("http://localhost:9999"), dc);
Thread.Sleep(5000);
}
[OneTimeTearDown]
public static void oneTearDown()
{
driver.FindElement(By.Id("Close")).Click();
}
}
--- Первый тест ---
namespace Notepad
{ [TestFixture]
public class Notepad2:BaseClass
{
[Test]
public void test2()
{
driver.FindElement(By.Id("15")).SendKeys("My Teacher ");
}
}
}
---- Второй тестовый класс ----
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
namespace Notepad
{ [TestFixture]
public class NoteTest : BaseClass
{
[Test]
public void Test()
{
driver.FindElement(By.Id("15")).SendKeys("...is Coming now");
}
}
}
2 ответа
Относительно SetUpFixture
первый ответ неверный.
SetUpFixture
работает точно так же, как и всегда. Если у тебя есть SetUpFixture
, его OneTimeSetUp
а также OneTimeTearDown
методы будут запускаться один раз для всех приборов в одном и том же пространстве имен.
С другой стороны, внутри TestFixture
OneTimeSetUp
а также OneTimeTearDown
методы запускаются только один раз для самого прибора.
Другими словами, методы запускаются "один раз" в пределах конкретной области, в которой они используются, пространства имен или фикстуры.
Проблема в том, что вы используете тот же класс, что и оба SetUpFixture
и как базовый класс для всех ваших TestFixtures
, Это означает, что если у вас есть n
тестовые приборы, он будет работать n + 1
раз! Это то, что вы видите.
SetUpFixtures
не делайте (никогда не имели) ничего общего с наследованием приборов. Вы должны либо сделать свой класс SetUpFixture
или TestFixture
Базовый класс. Если по какой-либо причине вам нужны оба, используйте два класса. В этом случае вам нужно только SetUpFixture
без наследства.
Когда наследовать от базового класса: когда вы хотите, чтобы один и тот же код выполнялся много раз, по одному разу для каждого прибора. Обратите внимание, что ваш базовый класс, когда он используется для одноразовой настройки и разрыва таким образом, обычно не должен быть помечен как TestFixture.
Когда использовать SetUpFixture: когда вы хотите, чтобы некоторый код выполнялся только один раз, перед каждым запуском любого прибора и снова один раз после того, как все осветители были запущены.
В вашем примере вы используете SetUpFixture для управления временем инициализации. Вы используете наследование, чтобы позволить вам поделиться драйвером. Проблема в том, что OneTimeSetUp в базовом классе фактически является частью каждого тестового устройства, и вы этого не хотите.
Я был бы обеспокоен примерно сотней тестов, использующих один и тот же драйвер. Я видел, как некоторые люди используют один драйвер на тест, а другие - один драйвер на fixture_. Использование одного для __everything подразумевает, что вы необычайно осторожны, так как каждый тест очищает после себя и восстанавливает драйвер в том же состоянии. Я сомневаюсь, что это возможно.
Однако, как упражнение, вот как это сделать, если вы действительно хотите: 1. Иметь базовый класс только с членом-водителем. 2. Извлеките SetUpFixture из базового класса и создайте / уничтожьте драйвер там. 3. Извлеките TestFixtures из того же базового класса. Они используют, но не меняют драйвер.
Из документации OneTimeSetup вызывается один раз перед всеми тестами в TestFixture. В вашем примере есть два прибора, поэтому настройка вызывается дважды. Вы должны иметь все свои тесты в одном приборе.
Это поведение отличается от старого атрибута [Setup] в SetupFixture, который запускался один раз для всех тестов в пространстве имен.