🛑 Данный туториал отображается на GitHub 🔴 не корректно! Это лишь исходник.
Правильная версия https://www.epic1h.com/cypress_test_flight

Туториал: первый полет на Cypress

Подойдет тем, кто хочет начать писать автоматизированные тесты.

👍 Что сделаем

💪 Минутка мотивации

Задача End-To-End тестов — нажимать на кнопки, вводить данные в поля формы, двигать мышкой — как это делал бы человек.

Заставь компьютер работать за себя! Ты тут босс 😎

🙋‍ Перед началом

😍 Живая обратная связь

Каждый вторник я провожу бесплатные онлайн стендапы в Zoom.

Если у тебя есть вопрос или проблема, подключайся:

@[Anton Breslavsky|https://t.me/breslavsky_anton|assets/anton.jpg]

Что бы следить за анонсами новых туториалов подписывайся на телеграмм канал


🔢 Шаги

❗ Внимание! Cypress обновил свой сайт после выхода видео.

Записанное видео, немного не соответствует туториалу и будет скоро обновлено.

Если ты любишь сначала смотреть, а потом делать 📹 Видео-туториал

+1. Инициализируем проект

Node.js — среда выполнения Java Script и менеджер пакетов npm.

Не получается 📹

Главный навык хорошего IT специалиста — уметь гуглить!

Научись формулировать вопросы и получать ответы самостоятельно.

Начни вести свой собственный словарь терминов.

Крутая фишка 😎

Можно выполнить команду npm init -y ~"В конспект" и файл package.json будет создан сразу.

🤷‍♂️ Зачем мне это?

Инициализация — первый этап любого проекта.

Ты должен проснуться в 3 часа ночи и знать как начать новый проект.

📹 Мое объяснение


+2. Ставим Cypress

Не получается 📹
Где найти все доступные версии Cypress?

На вкладке версии пакета Cypress в репозитории менеджера пакетов NPM https://www.npmjs.com/package/cypress

Почему мы используем Cypress 9, а не 12?
  • Твоя задача изучить основы, которые не меняются от версии к версии.
  • Я отдельно научу тебя обновлять фреймворк до любой версии.

🤷‍♂️ Зачем мне это?

Пакеты — это наборы готового кода, написанные другими разработчиками. ~"В конспект"

Зачем писать велосипеды, если их уже кто-то написал и выложил?

Легче найти нужный пакет, типа Cypress на https://npmjs.com, установить и начать использовать.

📹 Мое объяснение


+3. Первый запуск Cypress

Не получается 📹

🤷‍♂️ Зачем мне это?

Ты должен знать как запускать Cypress в режиме разработки тестов.

📹 Мое объяснение


+4. Запуск примера теста

Не получается 📹

📹 Мое объяснение


+5. Пишем свой тест

it('should do subscribe to news letter', () => {

cy.visit('https://www.cypress.io/');

});
Назойливая 🤦‍️ **mocha**

Visual Code постоянно добавляет строчку const { it } = require("mocha"); и код не работает?

  • Пропиши в начале файла теста: ~"В конспект"
    ///<reference types="cypress" />
    
Не получается 📹

❗ Всегда используй для названия тестов шаблон it('should do something...

📹 Мое объяснение


+6. Открываем форму подписки

it('should do subscribe to news letter', () => {

    cy.visit('https://www.cypress.io/');
    cy.get('.footer-form > .border').click();

});

+7. Заполняем форму подписки

it('should do subscribe to news letter', () => {

    cy.visit('https://www.cypress.io/');
    cy.get('.footer-form > .border').click();
    cy.wait(1000);
    cy.get('#subscribe-email').type('test@test.ru');

});
Не получается 📹

На самом деле wait плохая практика. Скоро ты узнаешь почему.

📹 Мое объяснение


+8. Отправляем форму подписки

it('should do subscribe to news letter', () => {

    cy.visit('https://www.cypress.io/');
    cy.get('.footer-form > .border').click();
    cy.wait(1000);
    cy.get('#subscribe-email').type('test@test.ru');
    cy.get('.flex > .block').click();
    cy.get('.border-t > .border').click();

});
Не получается 📹

📹 Мое объяснение


+9. Проверяем подписку

it('should subscribe to news letter', () => {

    cy.visit('https://www.cypress.io/');
    cy.get('.footer-form > .border').click();
    cy.wait(1000);
    cy.get('#subscribe-email').type('test@test.ru');
    cy.get('.flex > .block').click();
    cy.get('.border-t > .border').click();
    cy.get('.leading-36px').should('have.text', 'Thank you for subscribing!');

});
Не получается 📹

🤷‍♂️ Зачем мне это?

❗ Тесты не просто должны кликать по кнопкам!

Задача тестов — проверять правильность работы программы!

Кликнул → проверь результат! ~"В конспект"

📹 Мое объяснение


+10. Запускаем Cypress в Headless

+  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "test": "cypress run"
+  }
Не получается 📹

🤷‍♂️ Зачем мне это?

Ты должен знать как запускать Cypress в режиме прогона тестов.

Уже совсем скоро, именно с помощью этой команды, ты будешь запускать свои тесты на своем сервере!

📹 Мое объяснение


+11. Ломаем тест

- 'Thank you for subscribing!'
+ 'Thank you for subscribing!!!'
Не получается 📹

Бинго 🥳

🤷‍♂️ Зачем мне это?

Тесты могут ломаться в будущем. Ты должен уметь искать причины и исправлять их.


Та да 🥳 Ты дошел до конца.

🙏 Фидбек пожалуйста

Полезный материал?

* 🤩 Очень полезный материал
* 😃 В целом полезный
* 😐 Возможно что-то пригодится
* 😒 Нет ничего полезного
* 😬 Абсолютно бесполезно


**Спасибо за ответ!**

Все ли было понятно?

* 🤩 Все понятно на 100%
* 😃 В целом все понятно
* 😐 Что-то понятно, что-то нет
* 😒 Понял только малую часть
* 😬 Ничего не понял


**Спасибо за ответ!**

Как тебе такой формат туториала?

* 🤩 Очень удобно
* 😃 Мне понравилось
* 😐 Нормально
* 😒 Не удобно
* 😬 Ужасно


**Спасибо за ответ!**

👨‍🎓 Чему ты научился


😭 Домашка

Выбери точный селектор для элемента:

<p id="success">Thank you for subscribing!</p>
- [ ] `cy.get('id=success')`
- [x] `cy.get('p#success')`
- [ ] `cy.get('p.success')`


Селектор по [id](https://www.w3schools.com/cssref/sel_id.php)

<p class="success message">Thank you for subscribing!</p>
- [ ] `cy.get('[class=success]')`
- [ ] `cy.get('p#class')`
- [x] `cy.get('p.success.message')`


Селектор по классам `class="xyz zyx"`

<p data-cy="success">Thank you for subscribing!</p>
- [x] `cy.get('p[data-cy=success]')`
- [ ] `cy.get('data-cy=success')`
- [ ] `cy.get('p.data-cy.success')`


Селектор по [аттрибутам](https://www.w3schools.com/cssref/sel_attribute_value.php)

<p data-cy="success xyzXYZ">Thank you for subscribing!</p>
- [x] `cy.get('p[data-cy^=success]')`
- [ ] `cy.get('p[data-cy.=success]')`
- [ ] `cy.get('p[data-cy?=success]')`


Селектор по [начальному значению аттрибута](https://www.w3schools.com/cssref/sel_attr_begin.php)

<p data-cy="xyzXYZ success">Thank you for subscribing!</p>
- [ ] `cy.get('p[data-cy.=success]')`
- [x] `cy.get('p[data-cy$=success]')`
- [ ] `cy.get('p[data-cy#=success]')`


Селектор по [конечному значению аттрибута](https://www.w3schools.com/cssref/sel_attribute_value_lang.php)

<p data-cy="xyzXYZ success XYZxyz">Thank you for subscribing!</p>
- [ ] `cy.get('p[data-cy^=success]')`
- [x] `cy.get('p[data-cy*=success]')`
- [ ] `cy.get('p[data-cy$=success]')`


Селектор по [содержимому значения аттрибута](https://www.w3schools.com/cssref/sel_attr_contain.php)

У тебя есть HTML документ:

<h1 class="subscription">News letter subscription</h1>
<form>
  <input name="email" type="email">
  <input name="confirm-email" type="email">
  <button type="submit">Submit</button>
</form>

<h1 class="disclaimer">Disclaimer</h1>
<p>The content of this message is confidential.</p>

Заполни код:

cy.get('?|h1.subscription|?').should('have.text', 'News letter subscription');
// email input
cy.get('?|input[name=email]|?').type('?');
// confirm email input
cy.get('?|input[name=confirm-email]|?').type('?');
// submit button
cy.get('?|button[type=submit]|?').click();

🤩 Хочу еще

Не хватило? Поиграйся с https://automationteststore.com/

📹 Видео-ответы

  1. Почему не получается установить Cypress 9?
  2. Почему хорошо начать программировать через авто-тестирование?
  3. Что важно знать при написании авто-тестов?
  4. Как тестировщик взаимодействует с разработчиками?
  5. Можно ли в Cypress через Xpath искать элементы?
  6. Какой уровень английского должен быть у тестировщика?
  7. Как заставить себя изучать английский язык?
  8. В чем задача туториалов?
  9. Как найти проект для портфолио тестировщика?