Небольшое отступление:
Буквально пару месяцев назад у меня была прекрасная возможность начать автоматизацию с нулю в компании, где её вообще не было на моём любимом языке - C#.
Пошуршав в интернетах, я понял - что, в принципе, на C# нет в опенсорсе достаточно мощного и удобного фреймворка написанного для использования со SpecFlow (либо я его не нашёл).
К сожалению, на C# подобного я не нашёл и решил сам написать аналог.
Но, обстоятельства сложились так, что от BDD отказались (слава Богу, на мой взгляд), и я начал допиливать классический фреймворк, забросив specflow.
Но, учитывая что он всё же уже был написан, я решил его возродить и поддерживать, т.к. уже накопилось много плюшек, которые можно реализовать в нём.
(Проект фреймворка: https://github.com/Noksa/AAA)
Но, чтобы не заниматься этим просто так, я решил провести опрос.
Нужен ли конкретно вам подобный фреймворк и будете ли вы им пользоваться?
Да, нужен.
Попробовал(а) бы.
Нужен, но переход с существующего фреймворка слишком затратен.
Скачал и запусти ваши тесты, результат выполнения нашел только в тестовой консоли(надеюсь это пытается распарсить результаты, которых я не смог найти):
Allure + Nunit + Specflow - по моему, это слишком. Раньше использовал Nunit + Specflow. Через некоторое время Nunit выкинул - проще обновлять один фреймворк, чем сразу два(или больше).
Русский язык для написания фич и для сообщений о ошибках - ваш фреймворк, смогут испольовать только в проектах для стран бывшего СССР)
P.S. Код должен читаться как книга, а не как ребус. Возможно, это классный код, но как вы думаете, какой порог входа в ваш фреймворк? Какими минимальными знаниями должен обладать автоматизатор?
Попытаюсь ответить на ваши не заданные и заданные вопросы.
Попробуйте запустить студию под админскими правами, если запускаете тесты в ней. Это поможет.
У меня была похожая проблема, которая сама рассосалась и я не смог найти в чем была причина, т.к. она исчезла.
Видимо, не на совсем…
Аллюр отвечает за отчеты.
NUnit за запуск тестов. (Хотя, по большому счету, NUnit можно заменить на любой другой тестовый фреймворк, с которым дружит SpecFlow).
Ну а SpecFlow - понятное дело, за сами тесты.
Это недолго исправить, если в этом будет необходимость.
Для того, чтобы использовать этот фреймворк, вам достаточно просто добавлять свои методы.
Вам нет необходимости лезть во внутреннюю кухню, зачем Вам это?
В самом фреймворке есть всего два места, куда вы можете добавлять core-steps.
Класс с самой высокоуровневой абстракцией - CoreSteps.cs.
С этого места начинается каждое действие в ФФ.
Я для примера туда написал далеко не все возможные варианты.
может выглядеть в ФФ в зависимости от действия так:
И пользователь (заполняет поле) "Логин" значением "Мой логин"
или так:
И пользователь (заполняет поле) "Логин" "Мой логин"
или так:
И пользователь (сравнивает текст элемента) "Логин" со значением "Это не мой логин"
Все эти действия будут обработаны вышеуказанным методом.
И там таких методов много, но, возможно, не все.
Второе место - класс BasePage. Какие-то общие действия, которые встречаются чаще всего во многих проектах.
Например такой метод:
[ActionTitle("заполняет поле")]
public virtual void FillField(string elementTitle, string value)
{
var element = (AProxyElement) GetElementByTitle(elementTitle);
element.Clear();
element.SendKeys(value);
AllureSteps.AddSingleStep($"Поле '{elementTitle}' заполнено значением '{value}'.");
}
Этот метод можно использовать в любом из методов в классе CoreSteps.cs.
Т.е. метод, помеченный атрибутом [ActionTitleAttribute] можно поместить в скобки методов из CoreSteps.cs.
Например:
[StepDefinition("^пользователь \\((.*)\\) из таблицы$")]
public void ExecuteMethodByTitle(string actionTitle, Dictionary<string, string> dict)
{
PageManager.PageContext.CurrentPage.ExecuteMethodByTitle(actionTitle, dict);
}
Метод из BasePage.cs:
[ActionTitle("заполняет поле")]
public virtual void FillField(string elementTitle, string value)
{
var element = (AProxyElement) GetElementByTitle(elementTitle);
element.Clear();
element.SendKeys(value);
AllureSteps.AddSingleStep($"Поле '{elementTitle}' заполнено значением '{value}'.");
}
Всё вместе это будет выглядеть так:
И пользователь (заполняет поле) из таблицы
|Поле |Текст |
|Логин |МойЛогин |
|Пароль |МойПароль|
Естественно, у метода (заполняет поле) должна быть перегрузка с Dictionary.
Вот она:
public virtual void FillField(Dictionary<string, string> dictionary)
{
foreach (var keyValuePair in dictionary)
{
var element = GetElementByTitle(keyValuePair.Key) as IWebElement;
element.SendKeys(keyValuePair.Value);
AllureSteps.AddSingleStep($"Поле '{GetElementByTitle(keyValuePair.Key)}' заполнено значением '{keyValuePair.Value}'.");
}
}
Все остальные локальные методы, в том числе и их перегрузки - вы можете писать конкретно в pageobject и в блоках в конкретном проекте.
При необходимости изменения где-то локально общих методов из ядра - просто оверрайдить их, если они работают иначе (не писать новый с атрибутом - а просто оверрайднуть)
Фреймворк найдет их.
В ядре, по задумке, хранятся только общие действия, которые есть везде, и все они помечены как virtual, для того, чтобы можно было изменить реализацию на конкретной странице, если классическая не работает или работает не так, как задумано.
Каков минимальный уровень знания у автоматизатора должен быть - достаточный для того, чтобы он мог писать свои методы и помечать их атрибутом ActionTitle в ядре / в своих проектах.
А так же при необходимости дописывать core steps или изменять их, в данном случае так же знать регулярки.
У меня где-то завалялась презентация по этому фреймворку, если хотите, могу найти, там более понятным языком всё описано.
Что значит фреймворк со спекфлоу? Забиндженные шаги кликов и прочих экшенов?
То есть хочется написать свои хардкодные шаги? и на русском языке? Не, я понимаю, что в атрибут можно написать все что уогодно, но русский язык это… ну короче не для всех
Все давно есть. Плагин для спекфлоу, который в конце теста записывает JSON файлы Аллюра. Какой раннер будет у спеклофлоу - без разницы.
Угу.
Что-то типа этого на Java => GitHub - sbtqa/page-factory: Java framework for functional UI test automation in the BDD style
Где для старта написания авто-тестов не нужно ничего делать, кроме как подключить либу с фреймворком и написать ФФ с экшенами, попутно естественно создав pageobjects.
Понятно, что всё равно какие-то экшены будут свои и их придётся дописывать - либо в ядро либо в проект конкретного приложения, но это вопрос наполнения, который легко решается.
Ну, написать можно сразу на нескольких языках, просто добавив много атрибутов с соответствующей фразой, хоть на всех языках мира. Просто я не стал заморачиваться и написал только русский язык
А так методы могут выглядеть так:
[ActionTitle("заполняет поле")]
[ActionTitle("fills field")]
[ActionTitle("füllt das Feld")]
public virtual void FillField(string elementTitle, string value)
{
var element = (AProxyElement) GetElementByTitle(elementTitle);
element.Clear();
element.SendKeys(value);
AllureSteps.AddSingleStep($"Поле '{elementTitle}' заполнено значением '{value}'.");
}
ну и так далее, тоже самое и для coresteps.
На мой взгляд куда проще использовать что-то универсальное для всех проектов и уже готовое, чем писать свои экшены, которые делают тоже самое.
Если только вы занимаетесь написанием тестов в BDD стиле, то конечно всё это не имеет смысла. (хотя тогда и BDD не имеет смысла)
Посыл фреймворка же здесь такой, что ваш словарь действий будет одинаковым для всех проектов, за исключением индивидуальных под проект действий (коих обычно бывает немного).
А это в свою очередь позволит пользователям писать ФФ на любом проекте используя общий словарь действий, а не искать в конфлюенсе словарь под каждый проект со своим стилем написания действий и объяснением что же это действие делает.
Например пользователь просто будет знать, что в любом проекте достаточно написать фразу
Если же действия описываются для каждого проекта конкретно свои, то пользователю придется знать стиль написания/название экшена.
Ну а реализация самого действия может за счет виртуального метода меняться от проекта к проекту или от страницы к странице, но пользователь, который пишет ФФ этого знать не будет, для него всё равно текст действия везде будет оставаться таким же.
Если надо оверрайднуть метод(ы) для всего проекта в целом, а не для конкретной страницы/блока, то, если мне не изменяет память, созданием одного базового класса сейчас не обойтись, т.к. их нужно будет два - для блоков и для страниц, в них овверайдить методы, и уже от них наследовать блоки/страницы.
Но я давно не смотрел уже, если действительно нужно два класса - то, конечно, это требует изменения.