SlideShare a Scribd company logo
1 of 83
Вам не нужен
Автоматизатор!
Нет:p
Нет:p
если знать как её
готовить;)
Нет:p
Но всему свое время:)
Начнем сначала…
Продукт
Шушпанчики
Юз кейсы (черновик)
Деревья
шпят
едят
бегают
висят
Норы
шпят
едят
бегают
During All
activities:
шуршпанят
Особенные случаи:
GIVEN шпят
WHEN есть кто за 2 метра
THEN становятся
невидимыми
Переходы:
деревья > норы
деревья < норы
Деревья
шпят *
едят *
бегают *
висят *
Норы
шпят *
едят *
бегают *
During All
activities:
шуршпанят
Особенные случаи:
GIVEN шпят
WHEN есть кто за 2 метра
THEN становятся
невидимыми
Переходы:
деревья > норы *
деревья < норы *
Выбираем высокоприоритетные
“фичи”
Деревья
шпят *
едят *
бегают *
висят *
Норы
шпят *
едят *
бегают *
Переходы:
деревья > норы *
деревья < норы *
Что бы автоматизировать в первую очередь
и побыстрей (Smoke)
Сценарий (End to End)
перебежать в нору
побегать
перебежать на дерево
повисеть
поесть
перебежать в нору
пошпать
Деревья
шпят
едят e
бегают
висят e
Норы
шпят e
едят
бегают e
During All
activities:
шуршпанят
Особенные случаи:
GIVEN шпят
WHEN есть кто за 2 метра
THEN становятся
невидимыми
Переходы:
деревья > норы e
деревья < норы e
Прослеживаем покрытие
Коробит?
будь DRY ;)
Улучшаем наглядность
будь DRY
ДействияКонтексты Норы Деревья шуршпанят?
побегать !!e ! !
повисеть - !!e !
поесть !! !!e !
пошпать !!e !! !
- невидимым ? !! !
Переходы:
норы > деревья e
норы < деревья e
ДействияКонтексты Норы Деревья шуршпанят?
побегать !!e ! !
повисеть - !!e !
поесть !! !!e !
пошпать !!e !! !
- невидимым ? !! !
Переходы:
норы > деревья e
норы < деревья e
Дыра в покрытии
E2E тест одной Фичи
перебежать на дерево
пошпать невидимым
перебежать в нору
побегать
перебежать на
дерево
повисеть
поесть
перебежать в нору
пошпать
Заканчиваем Smoke покрытие
E2E тест одной Фичи
перебежать на
дерево
пошпать невидимым
проверить
шуршпание
Используем момент для увеличения покрытия
перебежать в нору
побегать
перебежать на
дерево
повисеть
поесть
перебежать в нору
пошпать
ДействияКонтексты Норы Деревья шуршпанят?
побегать !!e ! !
повисеть - !!e !
поесть !! !!e !
пошпать !!e !! !
- невидимым ? !!f !f
Переходы:
норы > деревья e
норы < деревья e
ДействияКонтексты Норы Деревья шуршпанят?
побегать !!e !f !f
повисеть - !!e !f
поесть !!f !!e !f
пошпать !!e !!f !f
- невидимым ? !!f !f
Закончили Smoke? - Переходим к полному
(приемочному) покрытию с помощью фиче-
тестов
Советы: покрываем
функциональные юз-кейсы
высокого приоритета,
(пользователь будет использовать регулярно)
Советы: НЕ покрываем
низко-приоритетные проверки
проверки “всех возможных вариаций”
ДействияКонтексты Норы Деревья шуршпанят?
побегать !!e !f !f
повисеть - !!e !f
поесть !!f !!e !f
пошпать !!e !!f !f
- невидимым ? !!f !f
Нет низко-приоритетным проверкам
ДействияКонтексты Норы Деревья шуршпанят?
побегать !!e !f !f
- быстро
- медленно
повисеть - !!e !f
- низко
- высоко
поесть !!f !!e !f
- много
- мало
пошпать !!e !!f !f
Нет проверкам “всех возможных вариаций”
ДействияКонтексты Норы Деревья шуршпанят?
побегать !!e !f !f
- быстро
- медленно
повисеть - !!e !f
- низко
- высоко
поесть !!f !!e !f
- много
- мало
пошпать !!e !!f !f
Должны быть покрыты на уровне юнит тестов
разные вариации
одной “функции”
(дающие тот же
“user flow” )
Мы здесь =>
=> Только:
функциональны
е
юз-кейсы
высокого
приоритета
разные вариации
одной “функции”
Здесь =>
Избегаем =>
переносим
дополнительные
требования такие как
“разные типы даных”,
и другие “вариации функций”,
и т. д. …
<= в
=> из
Где код?
Спокойствие и только
спокойствие:)
Product
От
Product
До
Действия
бегать, висеть,
есть, шпать
создать, редактировать, удалить,
переключить (активная/завершенная),
переключить все
Контексты
норы, деревья
фильтры:
все, активные, завершенные
Действия
бегать, висеть,
есть, шпать
create, edit, delete, toggle, toggle all
Контексты
норы, деревья
фильтры:
all, active, completed
Одно и то же ;)
Сценарий (End to End)
перебежать в нору
побегать
перебежать на дерево
повисеть
поесть
перебежать в нору
пошпать
Сценарий (End to End)
given at todomvc
add "a"
toggle "a"
filter active
filter completed
edit "a" to "a edited"
toggle "a edited"
…
Добавляем ожидаемые результаты
given at todomvc
add "a"
toggle "a"
filter active
assert no tasks
filter completed
edit "a" to "a edited"
toggle "a edited"
assert no tasks
…
given at todomvc
add "a"
toggle "a"
filter active
assert no tasks
filter completed
edit "a" to "a edited"
toggle "a edited"
assert no tasks
…
Часто можем оставить “неявные” проверки
Демо
Начнем же кодить ;)
given at todomvc
add "a"
toggle "a"
filter active
assert no tasks
filter completed
edit "a" to "a edited"
toggle "a edited"
assert no tasks
…
Помогаем компьютеру понять код (на Java)
givenAtTodoMVC();
add("a");
toggle("a");
filterActive();
assertNoTasks();
filterCompleted();
edit("a", "a edited");
toggle("a edited");
assertNoTasks();
//…
public class TodoMVCTest {
@Test
public void testTasksLifeCycle(){
givenAtTodoMVC();
add("a");
toggle("a");
filterActive();
assertNoTasks();
filterCompleted();
edit("a", "a edited");
toggle("a edited");
assertNoTasks();
//...
}
}
public class TodoMVCTest {
@Test
public void testTasksLifeCycle(){
givenAtTodoMVC();
add("a");
toggle("a");
filterActive();
assertNoTasks();
filterCompleted();
edit("a", "a edited");
toggle("a edited");
assertNoTasks();
//...
}
}
?
public static void givenAtTodoMVC(){
open("https://todomvc4tasj.herokuapp.com/");
newTask.shouldBe(enabled);
}
givenAtTodoMVC();
public static SelenideElement newTask = $("#new-todo");
newTask
CSS Selector
CSS Selector ?
[id=“new-todo"] <=> #new-todo
public static SelenideElement newTask = $("#new-todo");
newTask
[id=“new-todo"] <=> #new-todo
public static void add(String taskText) {
newTask.setValue(taskText).pressEnter();
}
add("a");
public static void toggle(String taskText) {
tasks.findBy(exactText(taskText)).$(".toggle").click();
}
toggle("a");
public static void toggle(String taskText) {
tasks.findBy(exactText(taskText)).$(".toggle").click();
}
toggle("a");
public static ElementsCollection tasks = $$("#todo-list>li");
tasks
public static ElementsCollection tasks = $$("#todo-list>li");
tasks
public static void toggle(String taskText) {
tasks.findBy(exactText(taskText)).$(".toggle").click();
}
toggle("a");
public static void filterActive(){
$(By.linkText("Active")).click();
}
filterActive();
By.linkText("Active")
public static void assertNoTasks() {
tasks.filterBy(visible).shouldBe(empty);
}
assertNoTasks();
tasks.filterBy(visible).shouldBe(empty);
public class TodoMVCTest {
@Test
public void testTasksLifeCycle(){
givenAtTodoMVC();
add("a");
toggle("a");
filterActive();
assertNoTasks();
filterCompleted();
edit("a", "a edited");
toggle("a edited");
assertNoTasks();
//...
}
}
open("https://todomvc4tasj.herokuapp.com/");
newTask.shouldBe(enabled);
newTask = $("#new-todo");
tasks = $$("#todo-list>li");
newTask.setValue("a").pressEnter();
tasks.findBy(exactText("a")).$(".toggle").click();
$(By.linkText("Active")).click();
tasks.filterBy(visible).shouldBe(empty);
Просто?
End to End Юнит/1-фича-на-тест
Стиль тестов
перебежать на дерево
пошпать невидимым
перебежать в нору
побегать
перебежать на дерево
повисеть
поесть
перебежать в нору
пошпать
public void testFiltering(){
givenAtTodoMVC();
add("a");
toggle("a");
filterActive();
assertNoTasks();
filterCompleted();
edit("a", "a edited");
toggle("a edited");
assertNoTasks();
//...
}
public void testDelete(){
givenAtTodoMVC();
add("a");
delete("a");
assertNoTasks();
}
End to End Юнит/1-фича-на-тест
Стиль тестов
End to End
Плюсы
+ больше покрытия
за меньшее время
с меньшими усилиями во
время реализации POC для
фреймворка
+ интеграционное покрытие
+ в случае багов, дают
более полный
репорт
+ с репортах проще
идентифицировать
проблему
=>
+ меньше времени и
усилий на саппорт
“Фиче-тесты”
End to End
Когда использовать?
+ в начале, во время разработки
POC для фреймворка
+ в спешке, для покрытия как
можно большего количества
фич
+ для “черновиков”
+ для интеграционного
покрытия
+ для новых фич
+ на регулярной
основе, когда POC
утвержден
“Фиче-тесты”
Разве это было сложно? :)
Простые инструменты?
Easy tools?
Java: Selenide
Python: Selene is coming…
C#: NSelene is coming…
Ruby: Capybara
? JavaScript: Protractor
? PHP: Codeception
Как начать?
Выбрать язык
Выучить язык (книги, интерактивные туториалы, koans,
exercism.io, google.com, другое)
Выбрать “простые инструменты”
Найти ментора (друг, программист на проекте, it-чаты, форумы,
другое…)
Вперед!
Как выбрать язык?
Есть проект?
=> язык на котором пишут разработчики (бекенд)
Нет проекта но нужно побыстрее найти работу?
=> самый популярный язык на рынке
Нет проекта, не важна скорость нахождения работы,
важно удовольствие от процесса программирования?
=> язык который подходит вам по стилю
Нет простого инструмента для нужного
языка?
Недостаточно опыта?
=> попросить программистов помочь
Есть опыт/время?
=> реализовать самому
Послесловие
Есть хорошие практики в контексте,
но нет самых лучших практик.
(c) Cem Kaner, James Bach
Вопросы
Спасибо
github.com/yashaka
youtube.com/c/ItlabsNetUa
gitter.im/yashaka/better-selenium
slideshare.net/yashaka
yashaka@gmail.com@yashaka

More Related Content

Viewers also liked

Тестирование производительности для специалистов по автоматизации - зачем и как?
Тестирование производительности для специалистов по автоматизации - зачем и как?Тестирование производительности для специалистов по автоматизации - зачем и как?
Тестирование производительности для специалистов по автоматизации - зачем и как?SQALab
 
Язык программирования PHP
Язык программирования PHPЯзык программирования PHP
Язык программирования PHPVasiliy Gudoshnikov
 
Docker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous IntegrationDocker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous IntegrationSQALab
 
Оценка качества автотестов
Оценка качества автотестовОценка качества автотестов
Оценка качества автотестовSQALab
 
Winium — это как Selenium, только под Windows
Winium — это как Selenium, только под WindowsWinium — это как Selenium, только под Windows
Winium — это как Selenium, только под WindowsSQALab
 
Архитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной областиАрхитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной областиSQALab
 
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователейКак 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователейSQALab
 
Грабли тестировщика
Грабли тестировщикаГрабли тестировщика
Грабли тестировщикаSQALab
 
Mail.ru: Как вырастить в себе автоматизатора и разработчика
Mail.ru:  Как вырастить в себе автоматизатора и разработчикаMail.ru:  Как вырастить в себе автоматизатора и разработчика
Mail.ru: Как вырастить в себе автоматизатора и разработчикаMaxim Boguslavsky
 
Качественное тестовое задание? Без проблем!
Качественное тестовое задание? Без проблем!Качественное тестовое задание? Без проблем!
Качественное тестовое задание? Без проблем!SQALab
 
Беседа о тестовых данных
Беседа о тестовых данныхБеседа о тестовых данных
Беседа о тестовых данныхSQALab
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...SQALab
 
Quality Assurance vs. Quality Control, Future of Software Quality
Quality Assurance vs. Quality Control, Future of Software Quality Quality Assurance vs. Quality Control, Future of Software Quality
Quality Assurance vs. Quality Control, Future of Software Quality SQALab
 
Тренировка служебных тестировщиков
Тренировка служебных тестировщиковТренировка служебных тестировщиков
Тренировка служебных тестировщиковSQALab
 

Viewers also liked (14)

Тестирование производительности для специалистов по автоматизации - зачем и как?
Тестирование производительности для специалистов по автоматизации - зачем и как?Тестирование производительности для специалистов по автоматизации - зачем и как?
Тестирование производительности для специалистов по автоматизации - зачем и как?
 
Язык программирования PHP
Язык программирования PHPЯзык программирования PHP
Язык программирования PHP
 
Docker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous IntegrationDocker + Selenium Webdriver в рамках Continuous Integration
Docker + Selenium Webdriver в рамках Continuous Integration
 
Оценка качества автотестов
Оценка качества автотестовОценка качества автотестов
Оценка качества автотестов
 
Winium — это как Selenium, только под Windows
Winium — это как Selenium, только под WindowsWinium — это как Selenium, только под Windows
Winium — это как Selenium, только под Windows
 
Архитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной областиАрхитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной области
 
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователейКак 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
 
Грабли тестировщика
Грабли тестировщикаГрабли тестировщика
Грабли тестировщика
 
Mail.ru: Как вырастить в себе автоматизатора и разработчика
Mail.ru:  Как вырастить в себе автоматизатора и разработчикаMail.ru:  Как вырастить в себе автоматизатора и разработчика
Mail.ru: Как вырастить в себе автоматизатора и разработчика
 
Качественное тестовое задание? Без проблем!
Качественное тестовое задание? Без проблем!Качественное тестовое задание? Без проблем!
Качественное тестовое задание? Без проблем!
 
Беседа о тестовых данных
Беседа о тестовых данныхБеседа о тестовых данных
Беседа о тестовых данных
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
 
Quality Assurance vs. Quality Control, Future of Software Quality
Quality Assurance vs. Quality Control, Future of Software Quality Quality Assurance vs. Quality Control, Future of Software Quality
Quality Assurance vs. Quality Control, Future of Software Quality
 
Тренировка служебных тестировщиков
Тренировка служебных тестировщиковТренировка служебных тестировщиков
Тренировка служебных тестировщиков
 

More from SQALab

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиSQALab
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияSQALab
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...SQALab
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testingSQALab
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженSQALab
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииSQALab
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовSQALab
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовSQALab
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsSQALab
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеSQALab
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииSQALab
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеSQALab
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестированиеSQALab
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"SQALab
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовSQALab
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных системSQALab
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросSQALab
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...SQALab
 

More from SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
 
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
 

Вам не нужен Автоматизатор!