Параллельное тестирование с MBUnit / Gallio с использованием тест-кейсов, управляемых данными - PullRequest
1 голос
/ 19 января 2012

Я много читал о 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  
      }
}

Может быть, я ошибаюсь в этом дизайне.Любые предложения, пожалуйста, о лучшем способе их распараллеливания?

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Как насчет этого?

public class TestCase
{
    public string Name { get; set; }
}

public static class TestCaseFactory
{
    public static IEnumerable<TestCase> TestCases()
    {
        yield return new TestCase { Name = "one" };
        yield return new TestCase { Name = "two" };
    }
}

[Factory(typeof(TestCaseFactory), "TestCases"), Parallelizable]
public class DataDrivenFixture
{
    private readonly TestCase testCase;

    public DataDrivenFixture(TestCase testCase)
    {
        this.testCase = testCase;
    }

    [SetUp]
    public void SetUp()
    {
        Console.WriteLine("SetUp " + testCase.Name);
    }

    [Test]
    public void Test()
    {
        Console.WriteLine("Test " + testCase.Name);
    }
}
0 голосов
/ 15 мая 2012

хорошее решение. а как насчет запуска тестов в разных браузерах? если я инициализирую IWebDriver в [FixtureSetUp], то браузеры открываются и запускают тесты, но с ошибками (в основном NoSuchElement).

public static IEnumerable<TestCase> TestCases()
        {
            yield return new TestCase { Name = "internet explorer" };
            yield return new TestCase { Name = "firefox" };
        }

[FixtureSetUp]
        public void SetUp()
        {
            Console.WriteLine("SetUp " + testCase.Name);
            switch (testCase.Name)
            {
                case "internet explorer":
                    driver = new InternetExplorerDriver();
                    break;
                case "chrome":
                    driver = new ChromeDriver();
                    break;
                case "firefox":
                    driver = new FirefoxDriver();
                    break;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...