Automation works

Let's build automation that definitely works

Как писать плагины к SpecFlow. Проект Macro.SpecFlow

Постановка задачи

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

В общем захотелось писать в сценариях какое-то ключевое слово и чтоб потом оно заменялось на лету другим значением. Я называю это – макросы.
В таком случае, сценарий вида:

должен замениться на:

Самый простой и быстрый вариант – использовать Transformation. Мы даже жили некоторое время с таким решением, но оно не позволяет конвертировать в string и в object, входящим параметром должен быть любой другой тип. Некоторое время мы жили с MacroString типом, который являлся, просто, оберткой над string. Такой вариант не самый удобный и часто вызывал вопросы “Зачем иметь такой класс?”. Так что решил я написать плагин, готорый бы препроцесил сценарии и заменял макросы на результат выполнения функции.

Регистрация плагина

Есть несколько правил, которым нужно следовать, чтобы SpecFlow подхватывал ваш плагин:

  • Имя сборки должно заканчиваться на .SpecFlowPlugin
  • Должен быть добавлен атрибут [assembly:RuntimePlugin(typeof(Plugin))]
  • Должен быть класс, который реализует интерфейс IRuntimePlugin
  • В App.config’e тестового проекта в секции plugins нужно добавить наш плагин <add name=”Macro” type=”Runtime” />

CustomizeGlobalDependencies – событие, которое возникает единажды, при загрузке сборки. В этом же событии мы регистрируем ITestExecutionEngine, который будет обрабатывать текст сценария и тут же мы подгружаем все сборки с макросами.

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

Замена

С заменой все достаточно просто: нужно просто создать класс с методом, который будет заменять все слова, которые подпадают под регулярное выражение, на значение функции. Кроме того, значение должно храниться в классе и использоваться при следующем вызове, чтоб все замены одного выражения были эквивалентны.

Подгрузка классов

Штука в том, что SpecFlow – это плагин для VisualStudio, для которого я пишу плагин Macro.SpecFlow, для которого можно писть плагины… Так вот последние могут включены к любую сборку, эту сборку нужно указать в конфигурации и Macro.SpecFlow подгрузит все макросы.

Nuget и публикация плагина

Последний шаг – это публикация плагина. Для этого нужно создать nuget пакет и загрузить его на nuget.org

Для начала нужно создать nuspec файл и заполнить все соответствующия поля. У плагина есть зависимость на SpecFlow.CustomPlugin, поэтому нужно добавить dependency секцию и указать id пакета.

Код можно посмотреть на моем профиле в GitHub

WOX launcher – аналог Alfred для Windows

Если вы, как и я, искали аналог Alfred для Windows, то стоит посмотреть на Wox.

Из коробки он умеет искать файлы и приложения, заменяет командную строку и, наверное, еще что-то. Но самое интересное для меня – это плагины. Есть уже существующие, а можно писать и самому. Для меня крайне важна возможность расширения существующго функционала и свой первый wox – плагин я уже написал. (more…)

Selenium – ожидание загрузки страницы

Ожидание загрузки страницы – одна из самых частых проблем. Идеально если у вас классное приложение и на момент загрузки данных показывает какой-нибудь spinner. В этом случае можно просто проверять наличие такого элемента на страничке и если его нет, то, вероятнее всего, все даные подгрузились и можно продолжать взаимодействие с элементами. Можно ждать body элемент, можно проверять readyState у документа. Но сегодня я раскажу вам еще одну вожможноть – это PerformanceTiming.

(more…)

Параллельному запуску тестов ReportPortal и SpecFlow быть

Вышел долгожданный (по крайней мере мной) фикс бага для SpecFlow агента ReportPortal. Суть проблемы заключается в том, что ReportPortal создает пустые тест раны в случае параллельного запуска тестов.

Для решения проблемы пришлось чинить SpecFlow, в следствии чего вышла новая 2.3.1 версия, со сломанной обратной совместимостью. А также были внесены обновления в ReportPortal.SpecFlow клиент. Последний рабочий набор библиотек выглядит так: (more…)

Передавать параметры в конструкторе – не самая хорошая идея

Заполнение объекта может быть реализовано в несколько способов. Один из них – это использование конструкторов или Helper методов. Но проблема в том, что таких методов может быть много, а также количество и тип входных параметров может меняться, что вызывает трудности при чтении. (more…)

REST API тестирование. Организация проекта

Наверное каждый, кто занимался UI тестированием приложений, слышал о Page Object и Page Factory патернах проектирования. И, уж точно, каждый из них знает в чем их преимущество. Но когда дело доходит до API, то тут начинается импровизация. Кто как придумал, кто как смог… кто-то формирует запросы в файлах, кто-то в классас, а кто-то и в тест методах не брезгует. Ниже я опишу вам как решал этот вопрос я у себя на проекте. (more…)

Resharper – горячие клавиши

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

Regular expression assistance
Ты всегда можешь отредактировать и проверить регулярное выражение прямо в Visual Studio с помощью ReSharper. Подсветка синтаксиса, автодополнение и проверка на ошибки. Если написать выражение прямо в Regex методе

Regex.Match("input", ".*")

то ReSharper подхватет его автоматически, а если это переменная, то решарперу нужно помочь через Alt+Enter => Mark as injected language => Mark as .NET Regular Expression. Автоматизаторы, которые используют в проекте SpecFlow, будут рады вдвойне, так как все перечисленные возможности можно использовать в Step Definition файлах.

Layouts
У себя, в Automation проекте, мы отделяем Page Objects, Steps, Tests на отдельные слои. Степы тоже делятся на Given, When и Then. А еще бывают Helper методы, а еще поля, свойства, конструкторы… и вот если у вас команда растет, то все это приобретает некоторую хаотичность. Понять, что уже реализовано, а что нет становится сложно. Все степы перемешанны, среди них есть методы, а может и конструкторы. Так вот: решение конечно же есть у решарпера. Можно составить свой собственный шаблон для форматирования, а дальше ReSharper все сделает за вас. Если у вас в классе полненйший хаос, то после “чистки” все ваши степы будут разбиты на группы, а в группах отсортированы по имени. Конструкторы вначале, а хелперы вконце. Просто нажми Ctrl+Alt+F.

Go to Everything/Type
Ты помнишь название класса или интерфейса, но не помнишь где он лежит? Просто нажми Ctrl+N, и начни вводить имя класса, ReSharper предложит все варианты совпадений и ты очень быстро сможешь перейти в нужный. А если имя длинное, то его точно не нужно писать полностью. Допустим у нас есть класс NotImplementedException в этом случае достаточно написать только заглавные буквы NIE и ReSharper сразу же предложит вам нужный вариант.

Go to Text for textual search
А если нужно сделать поиск по строкам, то нажимаем Ctrl+N N N. Все, теперь можно искать по строковым литералам. Не нужно открывать окно поиска и потом ходить по результатам, ReSharper сразу же покажет найденный варианты в выпадающем списке.

Go to Action
Не все горячие клавиши решарпера можно запомнить, для этого есть Actions. Установи курсор внутрь скоупа и после нажатия Alt+Enter отобразятся список недавних действий. Начни вводить имя экшина в поле ввода и Resharper выдаст список всех доступных действий по введенному слову.

Go to Related Files
Как найти редактируемый файл в Solution Explorer? Просто Shift+Alt+Enter. Просто выделит файл и перенесёт на него фокус.

Find Usages
Увидеть список всех использований метода, класса или переменной можно с помощью функции Find Usages – горячие клавиши Alt+F7

To-do Explorer
В C# language есть возможность оставлять комментарии, это строка, которая начинается с символов // comment. Если оставлять комментарии в формате //TODO your comment, то ReSharper поможет отследить все такие места и покажет список заданий после нажатия Ctrl+Alt+.

Live templates
Наверное, это моя любимая фича для автоматизатора. Она позволяет создавать умные снипеты и поэтому код можно писать в несколько раз быстрее и удобнее чем раньше.

Скачать полную схему в pdf можно по ссылке