Serenity bdd что это
Введение в автоматизацию тестирования BDD с помощью Serenity и Cucumber-JVM
В предыдущей статье мы рассмотрели, как можно использовать Serenity BDD с JUnit для написания чистых, читаемых автоматических приемочных тестов, и как Serenity также помогает вам создавать автоматизированные веб-тесты на основе WebDriver, которые легче понять и поддерживать. В этой статье мы будем использовать тот же пример домена, что и в предыдущей, но мы снова пройдемся по основам, поэтому вы можете сразу перейти к этой статье, даже если вы еще не читали предыдущую.
1. Основы BDD
Поведенческая разработка, которая является основной концепцией, лежащей в основе многих функций Serenity. Команда, использующая Behavior Driven Development, использует беседы и совместную работу на конкретных примерах для выработки общего понимания функций, которые они должны создавать. Беседы о конкретных примерах и контрпримеры — отличный способ избавиться от любых скрытых предположений или недопонимания относительно того, что должна делать функция.
Предположим, вы создаете сайт, где художники и ремесленники могут продавать свои товары онлайн. Одной из важных функций для такого сайта будет функция поиска. Вы можете выразить эту функцию, используя формат карты истории, обычно используемый в гибких проектах, таких как:
Чтобы сформировать общее понимание этого требования, вы можете обсудить несколько конкретных примеров. Разговор может идти примерно так:
И так далее. На практике многие из обсуждаемых примеров становятся «критериями приемлемости» для функций. И многие из этих критериев приемки становятся автоматическими приемочными испытаниями. Автоматизация тестов приемлемости обеспечивает ценную обратную связь для всей команды, так как эти тесты, в отличие от тестов модульных и интеграционных тестов, обычно выражаются в бизнес-терминах и могут быть легко понятны не разработчиками. И, как мы увидим далее в этой статье, отчеты, которые создаются при выполнении этих тестов, дают четкое представление о состоянии приложения.
2. Написание критериев приемки с помощью Cucumber-JVM
Cucumber — популярный инструмент автоматизации тестирования BDD. Cucumber-JVM — это Java-реализация Cucumber, на которой мы сосредоточимся в этой статье. В Cucumber вы выражаете критерии принятия в естественной, удобочитаемой форме. Например, мы могли бы написать пример «шерстяной шарф», упомянутый выше:
Иногда таблицы могут использоваться для суммирования нескольких разных примеров одного и того же сценария. В Gherkin вы можете использовать примеры таблиц, чтобы сделать это. Например, следующий сценарий иллюстрирует, как вы можете искать различные типы изделий из разных материалов:
В этой статье мы узнаем, как автоматизировать эти сценарии, используя Cucumber и Serenity BDD. Не беспокойтесь, если вы раньше не использовали Cucumber, поскольку мы рассмотрим достаточно примеров, чтобы вы могли увидеть, как он работает, даже если вы новичок в инструментах автоматизации тестирования BDD.
3. Написание исполняемых спецификаций с Cucumber и Serenity
3.1. Написание сценария
Давайте начнем с первого примера, описанного выше. В Cucumber сценарии хранятся в файлах объектов, которые содержат общее описание функции, а также ряд сценариев. Файл функций для приведенного выше примера вызывается search_by_keyword.feature и выглядит примерно так:
Эти файлы функций могут быть размещены в разных местах, но вы можете уменьшить объем конфигурации, который вам нужно сделать с Serenity, если вы поместите их в src/test/resources/features каталог.
Вы обычно организуете файлы объектов в подкаталогах, которые отражают требования более высокого уровня. Например, в следующей структуре каталогов у нас есть определения функций для нескольких функций более высокого уровня: search и shopping_cart :
3.2. Сценарий Бегун
3.3. Определения шагов
Файлы определений шагов должны находиться внутри или под пакетом, содержащим бегуны сценария:
Пакет бегуна сценария |
Сценарист бегун |
Определения шагов для участников сценария |
Библиотеки Serenity Step находятся в другом подпакете. |
3.4. Библиотеки «Шаг безмятежности»
Библиотека шагов Serenity — это обычный Java-класс с методами, помеченными @Step аннотацией, как показано здесь:
Библиотеки шагов часто используют объекты Page Objects, которые автоматически создаются |
В @Step аннотации указан метод, который будет отображаться как шаг в отчетах о тестировании. |
3.5. Объекты страницы
Объекты страницы содержат информацию о том, как тест взаимодействует с определенной веб-страницей. Они скрывают детали реализации WebDriver о том, как элементы на странице доступны и управляются с помощью более удобных для бизнеса методов. Подобно шагам, объекты Page являются повторно используемыми компонентами, которые облегчают понимание и обслуживание тестов.
Serenity автоматически создает экземпляры Page Objects для вас и внедряет текущий экземпляр WebDriver. Все, что вам нужно беспокоиться, это код WebDriver, который взаимодействует со страницей. И Serenity предлагает несколько быстрых клавиш, чтобы сделать это проще. Например, вот объект страницы для домашней страницы:
И вот второй объект страницы, который мы используем:
В обоих случаях мы скрываем реализацию WebDriver от способа доступа к элементам страницы внутри методов объекта страницы. Это делает код более легким для чтения и уменьшает количество мест, которые необходимо изменить, если страница изменена.
4. Отчетная и живая документация
Отчетность — одна из сильных сторон Серенити. Serenity не только сообщает о том, прошел ли тест или нет, но и документирует, что он сделал, в пошаговом описательном формате, который включает в себя данные теста и снимки экрана для веб-тестов. Например, следующая страница иллюстрирует результаты теста для наших первых критериев приемлемости:
Обратите внимание, как этот отчет точно воспроизводит пример из беседы с бизнесом, а также дает возможность перейти к «что», чтобы увидеть, как был выполнен определенный шаг, и (в данном случае), как выглядят соответствующие снимки экрана. как.
Ранее мы видели, как примеры таблиц могут быть отличным способом обобщить бизнес-логику; важно, чтобы эти таблицы были отражены в результатах испытаний, как показано здесь:
Но результаты тестов являются лишь частью картины. Также важно знать, какая работа была проделана и какая работа в процессе. При использовании Cucumber любой сценарий, содержащий шаги без соответствующих методов определения шагов, будет отображаться в отчетах как Ожидание (синий на графиках):
В предыдущем разделе мы увидели, как файлы объектов были организованы в каталоги, которые представляют функции или возможности более высокого уровня. Serenity будет использовать эту структуру пакета для группировки и агрегирования результатов тестирования для каждой функции. Таким образом, Serenity может сообщить о том, насколько хорошо было протестировано каждое требование, а также рассказать о требованиях, которые не были протестированы:
5. Вывод
Надеюсь, этого будет достаточно, чтобы вы почувствовали вкус Serenity и Cucumber-JVM.
Working with Serenity BDD Framework – An Overview
Build better apps with a low-code development approach
Learn how enterprises use low-code development to build new apps, extend legacy ones, and test them in order to achieve their digital transformation goals.
Serenity BDD Framework Overview
Serenity is an open-source reporting library that enables developers to write easily-understandable and better-structured acceptance criteria for test automation projects. In addition to generating meaningful reports for each test, the tool also shows the list of features tested in each test case. With the details of the executed tests and the requirements that were tested, Serenity BDD Framework allows you to better understand how an application works and what it does.
The good thing about Serenity BDD Framework is that it supports multiple automated acceptance testing solutions. You can use the tool along with JUnit to quickly write clean and maintainable acceptable criteria or integrate it with WebDriver to test web applications in Selenium. It also supports RestAssured to test REST API. Serenity allows you to use any Behaviour-driven Development (BDD) tool such as Cucumber. You can also use any test case management tool such as JIRA or choose a directory-based approach.
What is BDD?
BDD stands for Behavior-driven Development. It has actually evolved from Test-driven Development (TDD) that talks about writing the test cases before writing the code. BDD also takes the same approach but focuses on system behavior and user behavior. In a BDD environment, tests are written in shared language so that all stakeholders (technical and non-technical) will be able to understand how an application works. It also facilitates nice collaboration between different teams. The ability to write test cases in a common language such as English gives a big advantage for developers while preparing acceptance testing criteria. You can write test cases depicting real-time scenarios.
History and Main Concepts of BDD
It was Daniel Terhorst-North who pioneered the development of BDD methodology in 2003. Liz Keogh contributed to the concept in 2004 along with Chris Matts and developed the template ‘Given / When / Then’ for capturing user stories and converting them into an executable form. This concept was inspired by the ‘Domain Driven Design’ written by Eric Evans. Another inspiration was taken from the user story template ‘As a / I / So that’ created by Rachel Davies. In 2005, Dave Astels, David Chelimsky, Steven Baker and Aslak Hellesoy founded RSpec Project that supported BDD in Ruby. While improving this project, Aslak came up with a better version of RSpec Story Runner and he named it Cucumber.
In a BDD approach, requirements are converted into user stories and valid user scenarios.
An example of a BDD template is
Another example is
BDD comes with a minimal learning curve owing to the usage of a shared language. It provides seamless collaboration between different teams. Here, you are defining the behavior and not the test. So, the acceptance criteria is defined before developing the code which is beneficial for business owners as they get a clear understanding of how the application behaves instead of thinking about the features.
Cucumber and Serenity are a couple of popular BDD frameworks.
Getting Started with Serenity BDD Framework
These components run Serenity BDD Framework. They are all required.
Step 1: Install Java
To download Java, visit the following link:
Download the Java Development Kit (JDK)
Java SE 14.0.2 is the latest release for the Java Standard Edition Platform. Accept the license agreement and proceed with the download.
After the software downloads, double-click the application and install Java.
Choose the destination folder and click next.
The setup package installs Java on your machine. Click close to finish the installation.
To check if you successfully installed Java, open the command prompt, and type the version command.
Step 2: Configure Environment Variables
To use Java, you should configure environment variables. Add Java path under system variables and user variable settings. To do so,
Check if Java path is added under system variables and user variables path.
Now Java is ready for use.
Step 3: Install IDE
To write and execute tests using Serenity BDD Framework, you need a modern IDE. You can either choose IntelliJ or Eclipse. To install IntelliJ, visit the following website.
Click on the Download button to download the tool. IntelliJ is offered in two versions; Ultimate with a 30-day trial and Community version that is free and open-source. Choose the community version for the test purpose.
Now, double-click the IntelliJ software to being the installation procedure.
Click next and choose the installation location.
The next screen prompts you to customize installation options.
You can create a desktop shortcut or update the context menu. The important feature to note is the ‘Update PATH variable’ option. When you select it, it will automatically configure the environment variables. It means you don’t have to manually add the IntelliJ path to the system variables and user variables.
On the next screen, choose the start menu option and click next to proceed with the installation.
After the installation is completed, it will prompt for a restart. You can choose to manually restart it later.
After the system gets restarted, open the IntelliJ IDE. When you open it for the first time, it will prompt you to accept the privacy policy.
In the next screen, choose your preference for data sharing.
Now, the IDE opens up.
So, it is ready for use. You can choose the UI version Dracula (in dark mode) or Light (light mode)
Now, the tool is ready. You can choose a new project or open an existing one.
Step 4: Install Gradle
In order to execute tests and generate reports, you should add a built tool such as Maven or Gradle. You can download Maven here:
For Gradle, visit this link:
Create a folder called Gradle in C drive and unzip the Gradle package into that folder.
Step 5: Configure Environment Variable
To use Gradle, you should configure environment variables. Follow the steps mentioned in Step 2 to open the Environment Variables setting. Add the following path under system variables.
To check if Gradle is successfully configured, open a command prompt window and type the version command.
So, Gradle is working fine.
Step 6: Add Serenity BDD Plugin
To run your tests using Serenity BDD Framework, you should add the Serenity plugin. To do so, open the IntelliJ IDE.
Click on New Project. On the left side menu, choose Gradle.
Choose a name and the location of the build folder and click finish.
The tool will download the necessary files and create a new Gradle project.
After the build is completed, it will display a message that the build is successful.
Adding Serenity BDD Plugin
To apply the Serenity BDD Framework plugin to the project, open the build.gradle file and edit it with the following code.
Notice that the code mentions serenityVersion. The latest version is 2.2.12. When you run the code, it will install the Serenity plugin 2.2.12.
Along with the Serenity Gradle plugin, it will install all the dependencies. In this example, the Junit testing library is added. You can choose any other test library as well and add it under dependencies.
Now, open the command prompt window and type the following command.
The build is successful. The test reports are stored in the root folder – C:\ExperitestSerenity\target\site\serenity. When you open the index HTML file, you can check the test reports generated by Serenity BDD Framework. As we have added the continueOnFailure, the tests will continue even though some tests fail.
Running Your First Test
Here is a sample test using a demo site http://decohere.herokuapp.com. This project authenticates a user login task and checks if the user is able to log in and navigate to the welcome page.
Open your project ExperitestSerenity in the IntelliJ IDE.
Here is a list of packages and classes created for the project.
WhenAuthenticating.java
This is the main class that checks if the user is on the Home Page, logins to the account as an admin and successfully navigates to the welcome page.
[javascript] package ExperitestTC1.features.authentication; import ExperitestTC1.steps.DecohereUser; import net.serenitybdd.junit.runners.SerenityRunner; import net.thucydides.core.annotations.Managed; import net.thucydides.core.annotations.Steps; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.WebDriver; @RunWith(SerenityRunner.class) public class WhenAuthenticating < @Steps private DecohereUser user; @Managed(driver = "chrome") WebDriver browser; @Test public void shouldBeAbleToLoginAsAdmin() < user.isOnTheHomePage(); user.logsInAsAdmin(); user.shouldBeOnLandingPage(); >> [/javascript]
DecohereUser.java
This class provides the Home page details for the main class.
[javascript] package ExperitestTC1.steps; import ExperitestTC1.ui.DecohereHomePage; import ExperitestTC1.ui.LandingPage; import net.thucydides.core.annotations.Step; import static org.assertj.core.api.Assertions.assertThat; public class DecohereUser < private DecohereHomePage decohereHomePage; private LandingPage landingPage; @Step public void isOnTheHomePage() < decohereHomePage.open(); >@Step public void logsInAsAdmin() < decohereHomePage.loginAsAdmin(); >@Step public void shouldBeOnLandingPage() < assertThat(landingPage.noticeMessage()).isEqualTo("You are now logged in as admin@decohere.com."); >> [/javascript]
DecohereHomePage.java
This class provides the username and password to login to the site.
LandingPage.java
This class shows the welcome page message.
When you run the test in IntelliJ IDE, it will open the Decohere home page and signs-in to the account. The Serenity BDD will generate a report with the test details.
Summary
Serenity BDD Framework’s handy reporting library lets you run better structured and easier to understand acceptance tests. With reports getting generated for each action at every step, developers can understand how each feature is working and quickly identify errors. Serenity Step Libraries enable you to annotate methods with @Step annotation so that you can orchestrate calls to different layers such as databases, web services, and page objects. Overall, Serenity BDD Framework is a good choice when it comes to acceptance testing.
Continuous Testing is about breaking down barriers. See how important continuous testing in the cloud remains in 2021 with this webinar video.
Тестирование RESTful API при помощи Serenity и REST Assured на Kotlin
В этой заметке попробуем разобраться с тем, как на языке Kotlin написать тесты для проверки RESTful API приложения. В интернете полно статей про то, как писать подобные тесты на Java и Serenity, мы же воспользуемся Kotlin.
Какие технологии и библиотеки будем использовать:
Что такое Serenity BDD?
Краткий список возможностей:
Что такое Rest Assured?
Rest Assured — это Java-библиотека для тестирования RESTful API. Код, написанный с помощью этой библиотеки, имеет простой и понятный синтаксис. В тесте можно выполнить запрос к API буквально в одну строчку кода и при помощи DSL синтаксиса проверять полученный результат.
Подготовка
В оригинальной статье в качестве сборщика проекта используется maven, мы же воспользуемся Gradle. (https://gradle.org/maven-vs-gradle/)
Перед тем как приступить к написанию тестов, необходимо:
Настройка проекта в IDE
Создаем новый проект (Create new project), выбираем Gradle — Kotlin (Java):
Заполняем необходимые поля:
Указываем путь к gradle. У меня в MacOS он установлен через homebrew и Idea не находит его автоматически, поэтому я указываю путь руками: /usr/local/Cellar/gradle/4.2.1/libexec:
В итоге получаем пустой проект, с настроенным файлом конфигурации build.gradle, в котором все, что необходимо для написания кода на Kotlin, уже подключено.
Настройка зависимостей
Нам необходимо подключить следующие библиотеки:
Вносим изменения в build.gradle. Жирным шрифтом отмечены сделанные изменения относительно той версии, которая получилась после создания проекта.
Вот и вся настройка. Перейдем к написанию тестов.
Первый тест
Для написания тестов нам необходим какой-либо веб-сайт, работающий по RESTful API. Воспользуемся http://www.groupkt.com/, который предоставляет сервисы, с помощью которых, например, можно выполнить поиск страны по коду ISO при помощи метода API /country/get/iso2code/
Ниже приведён ответ сервера в формате JSON:
В папке serenity-rest-assured-automation/src/test/kotlin/tests/ создаем файл GroupktAPITest.kt и добавляем в него следующий текст:
Тест делает запрос на адрес http://services.groupkt.com/country/get/iso2code/RU и проверяет, что в ответе в поле RestResponse.result.name содержится значение “ Russian Federation”
Кстати, код взят из оригинальной статьи и автоматически конвертирован из Java в Kotlin при его вставке в Idea. При этом некоторые инструкции (when, is) были экранированы при помощи символа «, так как они являются ключевыми словами в Kotlin.
Попробуем запустить тест.
Запуск тестов
Тесты можно запускать двумя способами: через JUnit и через Gradle.
Чтобы запустить тесты через JUnit, в Idea надо навести мышь на значок запуска слева от строки, в которой объявлен класс и выбрать Run Test:
После прогона тестов (в нашем случае одного теста), внизу окна Idea отобразится результат тестирования:
Теперь настроим запуск тестов через Gradle и в дальнейшем будем пользоваться этим способом запуска.
3. Выбираем Gradle project из выпадающего списка
Сохраняем изменения и запускаем тест при помощи Gradle. После прогона увидим результат:
Посмотрим, как выглядит упавший тест. Для этого поменяем в тесте код страны и запустим тест заново:
В логе можно увидеть причину падения:
Возвращаем код страны обратно на RU.
Теперь добавим несколько тестов, чтобы проверить поиск других стран.
Добавляем еще тесты
Добавим поиск США и Индии по их ISO-кодам:
Полную версию можно посмотреть тут.
Если посмотреть на код, то можно увидеть, что в нём повторяются одни и те же инструкции для каждого теста:
Чтобы избавиться от повторяющихся фрагментов кода, в нашем случае можно:
Первый вариант хотя и является самым очевидным, но он не такой гибкий, как остальные. Что если нам понадобится добавить еще пару проверок для других тестов?
Рассмотрим второй вариант.
В Serenity тесты принято разбивать на небольшие блоки кода, которые затем можно использовать повторно при необходимости. Эти блоки называются “шагами”. Применяя подобный принцип на практике, можно перейти от использования технических формулировок (“код http-ответа = 200” или “выполни http запрос”) к выражениям, понятным обычному человеку: “действие было успешным” или “выполни поиск”. Поэтому всегда лучше начинать с реализации маленьких шагов, описывающих какие-либо действия, а затем использовать их для создания более сложных шагов и сценариев. В общем, чтобы сделать тесты легко поддерживаемыми необходимо использовать принцип DRY (Don’t Repeat Yourself)
Выносим шаги в отдельный пакет
Создаем новый файл src/test/kotlin/steps/CountriesSearchSteps.kt :
Обратите внимание, все шаги, которые мы создали, ничего не возвращают, а для передачи параметров между ними используется приватная переменная.
Класс и его методы объявлены как open. Это необходимо, чтобы Serenity мог корректно сформировать отчёт, детализируя его пошагово.
Запускаем прогон тестов. Он должен завершиться успешно.
Теперь мы можем спокойно добавить дополнительный шаг и применить его в одном тесте.
Параметризованные тесты
Библиотека Serenity имеет встроенные механизмы для создания параметризованных тестов. Тестовые данные можно подгружать из csv-файла или задать в коде. Рассмотрим второй вариант.
Что необходимо сделать:
В итоге Serenity при инициализации тестового класса будет передавать в него очередную порцию тестовых данных и запускать все тесты внутри класса. К тестовым данным можно получить доступ через атрибуты класса.
Отчёты
Чтобы формировался отчет, необходимо использовать команду aggregate, которую мы добавили ранее при настройке запуска тестов через Gradle.
Сформированный отчет можно найти в каталоге target/site/serenity/. Переходим в этот каталог и открываем файл index.html:
В отчете можно увидеть шаги, которые выполнялись в каждом тесте и даже результаты http- запросов.