Я много читал о RemoteWebDriver
для Selenium 2, используя Selenium Grid.На данный момент мои тесты генерируются в Test()
с использованием атрибута [Test]
.
У меня есть класс TestCriteria
, который я заполняю информацией, а затем использую «Шаблон проектирования объектов страницы» Selenium WebDriver для контроля того, как эти данные вводятся в мои тесты.
Итак, у меня есть простой объект критерия, например:
public class Credentials
{
public string Username { get; set; }
public string Password { get; set; }
}
Затем используйте эту информацию в объекте LoginPage.
public class LoginPage
{
[FindsByAnnotation]
public IWebElement UsernameField { get; set; }
[FindsByAnnotation]
public IWebelement PasswordField { get; set; }
[FindsByAnnotation]
public IWebelement SubmitButton { get; set; }
public HomePage Login(Credentials cred)
{
UsernameField.SendKeys(cred.user);
// code for login and return new HomePage object
}
}
Теперь, с такой структурой явозможность создать хороший метод создания цепочки в моих тестах, как только у меня появятся данные теста, такие как мой объект Credentials, данные, которые необходимо заполнить на других страницах и т. д.
[TestFixture]
public class TestFixture
{
private IWebDriver driver;
private TestCaseData data; // Which contains a Credentials object etc etc
[SetUp]
public void SetUp()
{
data = new TestCaseData()
{
Credentials = new Credentials()
{
Username = "username",
Password = "password"
}
// Other test case data objects can be populated here
};
driver = new FireFoxDriver();
}
[Test]
public void Test()
{
new LoginPage().Login(data.Credentials)
.NavigateToSearchPage()
.EnterSearchCriteria(data.SearchCritiera)
// etc
}
}
Это все хорошо, но ... что если бы я захотел ЗАГРУЗИТЬ данные этого теста из сериализованного объекта TestData, который можно десериализовать из XML.
Мне также интересно использовать RemoteWebDriver
, который я уже использовал, однако все еще ненадежен по сравнению с использованием только IWebDriver driver = new FireFoxDriver();
, однако, игнорируя эти вопросы, я действительно хотел бы запускать TESTCASE более одного раза ... в одно и то же время.Что подводит меня к вопросу параллельного тестирования.
Я понимаю, что MBUnit может справиться с этим, что является частью Gallio, я также изучил PUnit, который является расширением Nunit, но он еще долгий путь.Поэтому я решил придерживаться MbUnit.
Это дает мне возможность запускать TestFixtures с атрибутом [Parallelizable]
.Поэтому, если я скомпилирую свой проект и загрузлю dll проекта в графический интерфейс Gallio TestRunner, я смогу запустить 4 тестовых случая одновременно, что, в свою очередь, откроет 4 браузера, выполняющих каждый тест одновременно, что также дает возможность сделать нагрузку на сайт.пока все 4 теста запущены.(очевидно, это будет увеличено для запуска нескольких сотен браузеров на нескольких машинах с использованием selenium RemoteWebDriver с Selenium Grid.
Кто-нибудь здесь знает способ, с помощью которого я могу загрузить в коллекцию сериализованных объектов xml, GENERATE новые объекты TestFixture, которыеможет иметь атрибут [Parallelizable]
, добавленный в верхнюю часть тестового прибора, и запускать их все одновременно после загрузки в 1 - 10 XML-файлов из, например: C: \ TestCase directory?
Моя идея состоит в том, чтобы загрузить их все, а затем Selenium Grid обрабатывать сеансы браузера с 1 - 5 запущенными узлами Selenium, подключенными к основному сетевому концентратору селена.
У меня просто возникают трудности, когда я действительно получаю преимуществоSelenium Grid, когда я не могу найти структуру, которая позволяет мне генерировать Test Fixture
, который включает в себя [SetUp]
[TearDown]
[Test]
и возможность устанавливать определенные условия теста для атрибутов теста в зависимости от того, что загружено изTestCase .xml файл.
Например, если TestCase .xВ файле ml был элемент, который не был выполнен, тогда как я могу загрузить этот файл .xml и установить для него атрибут [Test] в TestFixture или сопоставить описание теста TestCase .xml с атрибутом [Test(Description = "")]
во время выполнения.
Я уже знаю функциональность веб-драйвера selenium, шаблон проектирования объекта страницы, функциональность selenium EventFiringWebDriver
для снимков экрана.
Как я могу использовать возможность загрузки в несколько сериализованных TestCaseData XML,генерировать новые объекты TestFixture после их загрузки?
В идеале я хотел бы, чтобы [SetUp] каждого TestFixture устанавливал IWebDriver
, поскольку определенные URL-адреса будут отличаться в зависимости от того, что будет содержать файл TestCase.xml,Например, этот тест должен выполняться в среде UAT, Тестовой среде, Среде подготовки к работе. Мне нужно настроить его до запуска теста.
У кого-нибудь есть базовый пример, использующий эти основные понятия?с Selenium Grid / Selenium WebDriver с возможностью запуска этих тестовых файловпараллельно используется для использования функциональности Selenium Grid в нескольких браузерах.
Итак, что-то я ищу в псевдокоде.
public class Main()
{
// Load Testfixtures
List<TestCase> testCases = Deserialise("\\Some\\FolderLocation");
foreach(test in testCases)
{
// create NEW testFixture, not [Test]
// ability to attach parallel TestFixture
}
}
[Testfixture]
[Parallelizable]
public class TestFixture
{
public TestCase testCase { get; set; }
public IWebDriver driver { get; set; }
[SetUp]
public void SetUp()
{
if(testCase.Environment == "UAT")
{
driver = new FireFoxDrive()
driver.NavigateTo("http://localhost/uat/Login");
}
// What if the testCase.ShouldPass is false?
// How can i generate my [Test] with ExpectedException?
}
[Test]
public void Test()
{
// code here with page object method chaining passing in testCase data objects
}
}
Может быть, я ошибаюсь в этом дизайне.Любые предложения, пожалуйста, о лучшем способе их распараллеливания?