BDD для фронтенда
Автоматизация тестирования
Cucumber, Cypress и Jenkins
Яковлев Александр
Frontend-разработчик
Ручное
тестирование UI
Behavior-Driven
Development
Процесс разработки
Ручное тестирование
8
часов
Регрессионное
тестирование
?
часов
Приемочное
тестирование
Cypress
JavaScript E2E testing framework.
https://github.com/cypress-io/cypress
https://cypress.io
Плюсы Cypress
Time Travel
Real time reload
Отладка в DevTools
Ожидание команд
Spies и stubs
Контроль http запросов
Минусы Cypress
Нет множественных вкладок
Нет мобильных событий
Нет поддержки iframe
Только Chrome
Наивный подход
describe(‘Filters panel’, () => {
it(‘should have filter products by group id’, () => {
cy.visit(‘/product’)
cy
.get(‘.qaGroupId’)
.type(‘Smartphones’);
cy
.find(‘.qaProducts’)
.should(‘have.length’, 3);
});
});
Cypress Tools
JQuery
в 2020 году?!
Наивный подход
describe(‘Filters panel’, () => {
it(‘should have filter products by group id’, () => {
cy.visit(‘/product’)
cy
.get(‘.qaGroupId’)
.type(‘Smartphones’);
cy
.find(‘.qaProducts’)
.should(‘have.length’, 3);
});
});
Page Object
Page Objects
productList
.getProductByName(‘Iphone XS’)
.delete();
filtersPanel
.setFilter(‘color’, ‘red’);
Html Wrapper
cy
.get(‘.qaProductItem’)
.contains(‘Iphone XS’)
.find(‘.qaDeleteBtn’)
.click();
Улучшенный вариант
describe(‘Filters panel’, () => {
it(‘should have filter products by group id’, () => {
productsPage.visit();
filtersPanel
.setFilter(‘Group ID’, ‘smartphones’);
productList
.should(‘have.length’, 3);
});
});
Двойной цикл разработки
BDD
Behavior-driven development - это методология разработки
программного обеспечения, являющаяся ответвлением
от методологии разработки через тестирование
Red Green Refactor
Плюсы BDD
Общий язык
Усиление взаимодействия
Быстрый цикл разработки
Живая документация
Cucumber
BDD Testing & Collaboration Tool
https://cucumber.io
Описание сценариев
#language: ru
@merchant
Функция: Поиск продуктов
Контекст:
Допустим я нахожусь на странице со списком продуктов
@smoke
Сценарий: Сброс поска продуктов по текстовым параметрам
Допустим я ищу продукты по "Group ID" "Some group id"
Когда я удаляю чипсу "Search results for "Some group id"
То на странице отображается список продуктов без примененного
поиска по фильтру "search-by"
Step definitions
When('я ищу {word} по фильтру/фильтрам {string} {array}',
function when(_, label, value) {
value.forEach(individualValue =>
this.filtersPanel
.setFilter(label, individualValue)
.then(xhr => cy.wrap(xhr).as('xhr')));
});
Then('на странице отображается список {word} без примененного поиска по
фильтру/фильтрам {string}',
function then(_, filter) {
expect(this.xhr.filters).not.to.have.property(filter);
});
QA review
Visual regression
Old New Diff
CI/CD
Main build
30
spec files
10 files
Report
10 files
10 files
Результат
8 1
часов
Регрессионное
тестирование
N N
часов
Приемочное
тестирование
a.yackovlev@corp.mail.ru
https://github.com/aleksandryackovlev
Александр Яковлев

BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, Александр Яковлев