В данной статье не будет рассказано, что такое Selenium и Selenium WebDriver – по этому поводу написано уже множество замечательных статей.

Здесь я хочу привести лишь небольшой пример того, как можно протестировать клиентский код в MS Dynamics CRM.

Но думаю, парой слов о Selenium WebDriver обмолвиться все же можно.
Итак, Selenium WebDriver – это библиотека, которая позволяет управлять браузером: давать браузеру какие-то команды, заполнять элементы UI, считывать значения, запускать скрипты.

Итак, поехали!



Перво-наперво создадим стандартный Unit Test Project.



Visual Studio заботливо создаст для нас класс теста и метод теста – переименуем их в соответствии с нашей предметной областью.

Затем мы установим следующие штуки посредством nuget: Selenium.WebDriver и WebDriverIEDriver (коли IE является дефолтным браузером для MS Dynamics CRM).



Ну почти всю работу мы сделали:)
Теперь остается написать только наш юнит-тест.

Проверять наш тест будет следующий case: существует два поля «Предполагаемая сумма» и «Взвешенная сумма», при этом «Взвешенная сумма» должна равняться 30% от «Предполагаемая сумма». И данное значение должно устанавливаться клиентским скриптом.

namespace CrmSeleniumUnitTest
{
    [TestClass]
    public class OpportunityTests
    {
        [TestMethod]
        public void WeightedSummCalculate()
        {
            decimal estimatedValue = 1000m;
            decimal expectedWeightedValue = estimatedValue * 0.3m;

            string contentFrame = "contentIFrame";
            string estimatedValueId = "estimatedvalue";
            string weightedEstimatedValueId = "isv_weightedestimatedvalue";
            string weightedEstimatedValueAttribute = "value";

            var driver = new InternetExplorerDriver();

            driver.Navigate().GoToUrl("https://test.crm.crm");
            
            driver.SwitchTo().Frame(contentFrame);

            var estimatedValueElement = driver.FindElement(By.Id(estimatedValueId));

            estimatedValueElement.Clear();
            estimatedValueElement.SendKeys(Keys.Tab);
            estimatedValueElement.SendKeys(estimatedValue.ToString(CultureInfo.InvariantCulture));
            estimatedValueElement.SendKeys(Keys.Tab);

            Thread.Sleep(10000);

            var weightedValueElement = driver.FindElement(By.Id(weightedEstimatedValueId));

            var actualWeightedValue = Decimal.Parse(weightedValueElement.GetAttribute(weightedEstimatedValueAttribute),CultureInfo.InvariantCulture);

            driver.Quit();

            Assert.AreEqual(expectedWeightedValue, actualWeightedValue);
        }
    }
}


Запускаем тест.



Ну вот и все — коротенько и по делу:)

Комментарии (23)


  1. Elufimov
    25.12.2015 09:17
    +1

    И причём тут MS Dynamics CRM?


    1. TheHedgehog
      25.12.2015 09:19
      -3

      Тут показан один из методов тестирования клиентского кода, который можно применить в MS Dynamics CRM.
      Других адекватных нет, к сожалению. А что вы хотели увидеть особенного?


      1. Elufimov
        25.12.2015 09:31
        +2

        Я вижу супер простой тест через selenium в котором даже есть возможность найти элемент по id. Таким макаром можно было применить любой инструмент для функционального авто тестирования веб приложений. Учитывая это вся статья сводится к установке пары nuget пакетов и примера из любого туториала по selenium коих тысячи. А я ожидал, судя по заголовку, раскрытия уникальных особенностей тестирования MS Dynamics CRM.


        1. TheHedgehog
          25.12.2015 09:33
          -3

          Особенностей никаких, кроме driver.SwitchTo().Frame(contentFrame);

          Статья призвана показать, что такой подход возможен.
          Никаких уникальных особенностей быть и не может.


          1. Elufimov
            25.12.2015 09:50

            Никаких уникальных особенностей быть и не может.

            Не очень тогда понятно почему
            Других адекватных нет, к сожалению.


            1. TheHedgehog
              25.12.2015 09:54
              -1

              Из-за особенностей Dynamics CRM. Мы можем писать только обработчики событий, такое тестирование, как например, с использованием Karma, Jasmine тут не подходит. Мы можем лишь «протыкать» UI.


              1. Elufimov
                25.12.2015 10:13

                Итак, вы сравниваете связку karma + jasmine с связкой selenium + mstest и говорите что одно может делать функциональное тестирование веб приложений через ui браузеров, а другое не может. Ну да, действительно это так. Но и из этого автоматом не следует что selenium единственный инструмент который может тестировать MS Dynamics CRM. Или я не понял вашу мысль?


      1. VolCh
        25.12.2015 20:07
        +1

        А что вы хотели увидеть особенного?

        Хотя бы один нормальный тест всей системы. Начиная с заполнения базы фикстурами.


  1. TheHedgehog
    25.12.2015 10:16
    -1

    Я пытаюсь сказать, что адекватные инструменты вроде karma+jasmine не подходят для тестирования MS Dynamics CRM.
    И остаются только «протыкивалки», коих много. И вот WebDriver оказался весьма удачным вариантом.


    1. Elufimov
      25.12.2015 10:27

      Не вижу ничего не адекватного в использовании инструментов работающих непосредственно с браузером. Для каждой задачи свой инструмент и тестирование портала в реальном браузере имеет свои плюсы и свои минусы. Однако смысловая нагрузка статьи сжалась в одну строчку,

      Перед тестированием нужно переключиться на frame contentIFrame

      И то явно этой строчки нет, нужно вчитываться в пример.


      1. TheHedgehog
        25.12.2015 10:29
        -1

        Я и не говорил, что инструменты, работающие непосредственно с браузером, не адекватные.
        Просто по ряду причин, они лучше.


        1. Elufimov
          25.12.2015 10:37

          Ну как же так

          Я пытаюсь сказать, что адекватные инструменты вроде karma+jasmine не подходят для тестирования MS Dynamics CRM.

          Одни инструменты адекватны.
          И остаются только «протыкивалки», коих много.

          А те кто остались не адекватны.
          И да, чем они лучше и при каких условиях?


          1. TheHedgehog
            25.12.2015 10:39
            -1

            Я что-то вообще ничего не могу понять из вашего последнего поста.
            Можете сформулировать мысль доступно?


            1. Elufimov
              25.12.2015 10:51

              Я пока вас никак не могу понять. Одни средства у вас адекватны, другие не адекватны. Одни лучше, другие хуже. В статье это не разбирается Кто, почему, в каких условиях, при каких задачах лучше/хуже. Есть только «ряд причин» и «особенности» которые тоже не расписаны.


  1. TheHedgehog
    25.12.2015 10:53
    -6

    Ты баран? Где я сказал, что какие-то средства неадекватны? Я же черным по белому написал для MS Dynamics CRM.


    1. Elufimov
      25.12.2015 10:59
      +3

      Добрый день, сегодня пятница 25 декабря и я позволил себе наглость прочитать вашу статью, задавать по ней вопросы и цитировать ваши комментарии. Простите меня, я не хочу быть бараном. А если серьёзно, то я чуть выше цитировал ваш комментарий который дал мне повод увидеть у вас разделение о котором я говорю.


      1. TheHedgehog
        25.12.2015 11:04
        -1

        Поясняю: есть более подходящие, а есть менее подходящие инструменты. Вот karma+jasmine не подходит для MS Dynamics CRM, а Selenium подходит. И тут нигде не сказано, что какой-то инструмент неадекватен.


        1. Elufimov
          25.12.2015 11:09

          Я конечно могу продолжить и ещё раз процитировать комментарий где было про «адекватные» инструменты, но учитывая что тут не так много комментариев и его так и так видно, не буду. Да и после барана не сильно хочется продолжать общение.
          Однако желаю удачи в использовании выбранных инструментов и буду ждать следующих статей которые

          коротенько и по делу:)


  1. fufnf
    26.12.2015 09:21
    +1

    Thread.Sleep(10000);
    var weightedValueElement = driver.FindElement(By.Id(weightedEstimatedValueId));

    Почему именно 10000, а не, скажем 5000 или 20000?

    Конечно это жесткий костыль, который сильно влияет на производительность и стабильность тестов.
    Есть такая штука как WebDriverWait:
    IWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10))
    IWebElement element = wait.Until(driver => driver.FindElement(By.Id(weightedEstimatedValueId)));
    

    Будет ждать элемент, пока он не появится либо пока не произойдет таймаут.

    Еще вопрос, почему был выбран именно C#, а не JS, например, для этих целей?


    1. TheHedgehog
      28.12.2015 16:50

      А кто сказал, что на странице нет элемента с айдишником weightedEstimatedValueId и что этот элемент значение не имеет?
      и чего ждать, когда эту штуку может вычислять долговыполняющийся яваскриптовый код?


      1. fufnf
        28.12.2015 18:40

        Если я правильно понял, то слип именно для этого. Если нет, прошу прощения — поясните, пожалуйста, назначение слипа в тесте.


        1. TheHedgehog
          28.12.2015 19:17

          значение инпута, который имеет id «weightedEstimatedValueId» может устанавливаться путем выполнения яваскрипта, причем длительного давольно, поэтому тут есть вот такой слип. При этом устанавливается только значение weightedEstimatedValueId и не факт, что из какого-то дефолтного. И как бы нет такого условия, которого бы мы ожидали.


          1. fufnf
            28.12.2015 19:31

            Вас понял. В этом случае я бы ожидал, когда значение элемента управления станет expectedWeightedValue с помощью того же wait.Until. Тогда слип не потребуется.