1 of 49

Интеграция автотестов

в процесс разработки

2 of 49

Обо мне

2

Казаченко Александр

Фронтенд-разработчик, Tinkoff.ru

​

shoom3301@gmail.com

3 of 49

Протестируем google

3

Действие: ввести поисковый запрос

Проверка: результат содержит слово “автотесты”

4 of 49

4

клац-клац-клац

Passed!

5 of 49

Зачем нам автотесты?

5

  • Лучше понимаем функционал приложения

6 of 49

Зачем нам автотесты?

6

  • Безопасный рефакторинг

7 of 49

Зачем нам автотесты?

7

  • Continuous delivery

8 of 49

Continuous delivery

8

Development

Version control

Build & unit tests

Automated acceptance tests

User acceptance tests

Release

Automated acceptance tests

9 of 49

9

Что имеем?

10 of 49

Angular SPA

10

11 of 49

Testrail

11

Testrail - test case manager

  • “База данных” тест кейсов
  • Запуск и отчеты выполнения тестов

12 of 49

Testrail

12

13 of 49

Аналоги testrail

13

14 of 49

14

Что такое тест-кейс?

15 of 49

Структура тест кейса

15

Preconditions

Steps

Expect

16 of 49

Preconditions

16

beforeEach(async () => {

await appPageObject.login();

await appPageObject.openMainPage();

});

​

17 of 49

Steps (Page object)

17

get conversationInput(): ElementFinder {

return byAutomationId('conversation-input');

}

​

@Step('Заполнить поле ввода темы для нового диалога')

async setNewConversationCaption(caption: string) {

const {conversationInput} = this;

​

await waitFor(conversationInput);

await conversationInput.sendKeys(caption);

}

​

18 of 49

Test

18

it('[171924] Кнопка "отправить" активна, если введен текст',

async () => {

await appPageObject.setText(someText);

​

const {sendButton} = appPageObject;

​

await waitFor(sendButton);

​

await expect(sendButton.isEnabled()).toBe(true);

});

​

19 of 49

Teamcity CI

19

Build

Unit tests & lint

Deploy

20 of 49

Освежим память

20

  • SPA
  • Testrail
  • Autotests
  • Teamcity CI

21 of 49

21

Что будем делать?

22 of 49

Testrail time!

22

23 of 49

Связывание кейсов в коде и в testrail

23

it('[171881] Менеджер заходит на карточку...

​

it('[171882] Менеджер кликает на стрелку...

​

it('[171883] Менеджер жмет на пункт меню...

​

Code

Testrail

24 of 49

Запуск автотестов в teamcity

24

  • send RunId
  • send TaskId

API request

Click

Testrail

Trigger

Teamcity

  • add env.runId
  • run protractor

Click

Trigger

25 of 49

25

26 of 49

Protractor

26

Protractor - e2e тест-фреймворк на основе WebDriverJS

  • NodeJs приложение
  • Запускает тесты в реальном браузере
  • Выполняет действия как реальный пользователь

27 of 49

RunId

27

Run - запуск автотестов и результат их выполнения

  • Содержит список кейсов, которые хотим выполнить
  • Можно выбрать произвольный набор кейсов
  • Отображает результат выполнения тестов

28 of 49

Run

28

29 of 49

Освежим память

29

  • связь кейсов в testrail и коде
  • runId в environment
  • protractor - nodejs приложение

30 of 49

Загрузка кейсов из testrail

30

перед запуском

Protractor

Testrail

загружаем кейсы

сохраняем кейсы

кейсы из run’а

запрос к API

по runId

31 of 49

Фильтрация кейсов

31

Загруженные

​

  • 171924
  • 171926
  • 171927

В коде

​

it('[171924] Кнопка "отправить" неактивна...

​

it('[171925] Менеджер не может управлять...

​

it('[171926] После ввода текста и темы диалога...

​

it('[171927] После нажатия кнопки "отправить"….

​

it('[171930] Подсказки бота отсутствую...

32 of 49

Статус кейса inWork

32

перед запуском теста

отправляем статус “в работе”

устанавливаем статус теста

запрос к API

с statusId

Protractor

Testrail

33 of 49

Результат выполнения кейса

33

перед запуском теста

отправляем статус

устанавливаем статус теста

запрос к API

с statusId

Protractor

Testrail

не успешно

успешно

34 of 49

Освежим память

34

  • загрузка кейсов из testrail
  • фильтрация кейсов
  • статус “в работе” перед выполнением
  • успешный | не успешный статус после выполнения

35 of 49

Запуск автотестов на pull request

35

36 of 49

Запуск автотестов на pull request

36

Features - описание функциональностей в виде тэгов

  • группируем кейсы по функциональностям
  • запускаем только те кейсы, которые относятся к PR

37 of 49

Features тэги в jira

37

38 of 49

Features тэги в testrail

38

39 of 49

Связь через features

39

Jira

Testrail

  • Meow
  • Woof

40 of 49

Триггер запуска автотестов

40

Pull request

Unit tests & lint

Build

Deploy

protractor

41 of 49

Немного магии

41

42 of 49

Загрузка features из jira

42

#!/bin/bash

JIRAID=%dep.PullRequestBuild.JiraTaskId%

FEATURES=$(curl -s -k -u $PASS -X GET

-H "Content-Type: application/json" https://jira/rest/api/2/search?jql=id=$JIRAID

| python -c 'import json,sys;obj=json.load(sys.stdin);

[sys.stdout.write(i+",") for i in obj[u"issues"][0][u"fields"][u"customfield_7777"]]')

echo "##teamcity[setParameter name='env.TESTS_FEATURES' value='$FEATURES']"

echo "##teamcity[setParameter name='env.URL' value='https://$JIRAID.some-app.tinkoff.ru']"

43 of 49

Загрузка и фильтрация кейсов

43

перед запуском

загружаем кейсы

фильруем кейсы по features

запускаем только кейсы

с соот-ми features

44 of 49

PR build result

44

45 of 49

PR build result

45

46 of 49

Закрепим

46

  • указываем features в jira
  • указываем features в testrail
  • триггер автотестов после сборки и деплоя
  • загружаем кейсы из testrail и фильтуем по features
  • запускаем только кейсы с указанными features

47 of 49

47

Какие профиты?

48 of 49

Профиты

48

  • связанность кейсов в testrail и коде
  • запуск произвольного набора автотестов
  • автоматический запуск автотестов на PR

49 of 49

49

Спасибо!

Источники информации:

https://goo.gl/UyViTK