CodeceptJS — сучасні end2end тести для NodeJS

image
У світі NodeJS твориться повний хаос, кожен день з'являються нові фреймворки, розміри залежностей звичайного package.json виростають на сотні мегабайт, а бібліотека, яку ви додали в проект ще вчора, сьогодні вже морально застаріла. І якщо у світі фронтенд фреймворків вже намітилися явні фаворити: AngularJS, React, Vue, Ember, то що для приймального тестування абсолютно незрозуміло. Кожен фреймворк надає свій синтаксис і свої круті штуки, а також у кожного є свій характерний набір проблем. Наприклад, кожен по-своєму реалізує взаємодію з браузером, кожен по різному бореться з асинхронностью.
Ох, ця горезвісна асинхронність...
Так, асинхронність це круто, але в контексті приймального end-2-end тестування асинхронність це вічна проблема. Тести повинні мати лінійний вигляд, посоледовательности команд: я відкриваю сторінку, я клікаю кнопку, я хочу побачити потрібний мені текст. Кожна подібна команда в контексті JS буде виконуватися асинхронно, а тому подібна конструкція буде записана ланцюжком викликів:
client
.url('https://github.com/nightwatchjs/nightwatch')
.waitForElementVisible('body', 1000)
.assert.visible('.container h1 strong a')

всі команди змішані в одну, складно зрозуміти які команди доступні)
чи з допомогою багаторазових yield або await:
function*() { 
yield browser.url('http://google.com');
yield browser.click('#link');
var title = yield browser.getTitle()
console.log(title);
}

(надлишок керуючих конструкцій робить тест менш читабельним).
Тест, це насамперед код, але він повинен не тільки працювати, він повинен легко читатися і легко оновлюватися.
В ідеалі навіть нетехнічний персонал, наприклад, менеджер чи аналітик повинен розуміти що ж конкретно в проекті тестується і як. Описуючи end2end тести на низькому рівні, ми позбавляємо себе такої можливості.
Для вирішення описаних вище проблем (мультиинструментальность і асинхронність) з'явився CodeceptJS.
Це фреймворк дозволяє описувати тести на DSL високого рівня. Самі тести будуть виконуватися однією з популярних бібліотек на вибір: webdriverio, Protractor, NightmareJS. У більшості випадків вам не доведеться вчити синтаксис кожної з бібліотек, а використовувати готовий універсальний API. Ось як виглядає простий тест в CodeceptJS:
Scenario('search github', (I) => {
I. amOnPage('https://github.com/search');
I. fillField('Search GitHub', 'CodeceptJS');
I. pressKey('Enter');
I. see('Codeception/CodeceptJS', 'a');
});

Scenario('register', (I) => {
I. amOnPage('https://github.com');
within('.js-signup-form', function () {
I. fillField('user[login]', 'User');
I. fillField('user[email]', 'user@user.com');
I. fillField('user[password]', 'user@user.com');
I. click('button');
});
I. see('There were problems creating your account.');
});

Як же CodeceptJS дозволяє писати лінійні сценарії для тестів? Розкрию секрет: скрізь використовується глобальна ланцюжок промисов, в яку додаються нові й нові команди. Таким чином, CodeceptJS може легко реалізувати ті ж PageObjects:
Scenario('register', (I, RegisterPage) => {
RegisterPage.open();
RegisterPage.register({login: 'User', email: 'user@user.com', password: '123435'});
I. see('There were problems creating your account.');
I. click('Explore');
});

Таким чином ми перенесли команди з попереднього прикладу в окремо створений клас.
І справді, вийшло читабельно: всі команди описані як дії від першої особи, селектори мінімально перевантажують код технічною інформацією. Здавалося б, що можна зробити, щоб тест ще більш читабельним. Давайте напишемо його по-російськи!
Scenario('пробую написати реферат', (Я) => {
Я. на_странице('http://yandex.ru/referats');
Я. бачу("Написати реферат за");
Я. выбираю_опцию('Психології');
Я. клікаю("Написати реферат");
Я. бачу("Реферат з психології");
});

Так, це дійсний JS-код, який може бути виконаний у середовищі NodeJS без всяких транспайлеров!
Як вже було згадано в конфігурації ви легко зможете вибрати движок для вполнения тестів. Хочете стабільний і хороший webdriver API, використовуйте WebDriverIO, працюєте з Ангуляром — <a href=«codecept.io/angular/>увімкніть Protractor, хочете прискорити тести в 3 рази, відмовившись від webdriver, і запускаючи додаток всередині Electron, використовуйте Nightmare.
Звичайно, не можна осягнути не объятное і написати повну реалізацію всіх доступних дій для всіх движків. Але CodeceptJS дозволяє вам писати свої розширення і доповнювати поточну функціональність. Так, таким чином вам доведеться трохи попрацювати з низькорівневим API того ж webdriverio, але реалізувавши потрібний функціонал ви зможете використовувати його в сценаріях.
Що ще є в CodeceptJS:
  • покроковий висновок проходження тестів
  • режим інтерактивної паузи
  • генератори тестів, pageobjects, helpers
  • скоро з'явиться підтримка Appium
Як встановити CodeceptJS? Не так і складно
[sudo] npm install -g codeceptjs
codeceptjs init

Далі вам потрібно буде вибрати один із драйверів для вполнения тестів (Protractor, webdriverio, Nightmare) і встановити для них пакети. Команда
codeceptjs init
допоможе вам у цьому і підкаже як писати перший тест.
Проектом вже майже рік, CodeceptJS використовується в Британських і в Бразильських державних компаніях. Він безкоштовний і вільний як MIT.
Якщо ви ще не пробовалb його, у вас є чудова можливість! Якщо вже користуєтеся — пишіть свої коментарі. А також приєднуйтесь до розвитку проекту.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.