91
Flaky tests Андрей Солнцев О нестабильных тестах и как с ними бороться twitter.com/asolntsev

Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Embed Size (px)

Citation preview

Page 1: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Flaky tests

Андрей Солнцев

О нестабильных тестахи как с ними бороться

twitter.com/asolntsev

Page 2: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

АДавтоматизаторов

Page 3: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Как у вас с автоматизацией?

Page 4: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

СТАБИЛЬНОСТИНЕТ!

Page 5: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Flaky test

- это тест, который падает иногда

Никогда не знаешь, баг или нет.

Page 6: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Ой, 30 тестов упало.Надо изучить!

… Впрочем, П……У….. !

Page 7: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Ой, 30 тестов упало.Надо изучить!

… Впрочем, Перезапущу!

Page 8: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Сколько у вас flaky тестов?

Часто слышу - 30%

Google - 1.5%https://testing.googleblog.com/2016/05/flaky-tests-at-google-and-how-we.html

Codeborne - 0.1%

Page 9: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Даже 1.5% - очень плохо!

Упало 15 из 1000

Упало 12 из 1000

Упало 18 из 1000

Нужен ручной контроль!

|

|

Page 10: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

И даже 0.1% - плохо:

Ни дня без красного билда!

Page 11: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Индустрия в опасности!

Page 12: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

План

1. Моя коллекция нестабильных тестов

2. Причины нестабильности

3. Как с ними бороться?

Page 13: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Моя коллекция

Page 14: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 1: классика

Этот динамический веб

Page 15: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

driver.navigate().to("https://www.google.com/");

driver.findElement(By.name("q")).sendKeys("selenide");

driver.findElement(By.name("btnK")).click();

assertEquals(9, driver.findElements(

By.cssSelector("#ires .g")).size());

Какая строчка тут может сломаться?

Page 16: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Какая строчка тут может сломаться?

ЛЮБАЯ!

Page 17: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

driver.navigate().to("https://www.google.com/");

driver.findElement(By.name("q")).sendKeys("selenide");

driver.findElement(By.name("btnK")).click();

assertEquals(9, driver.findElements(

By.cssSelector("#ires .g")).size());

Медленный интернет

Page 18: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

driver.navigate().to("https://www.google.com/");

driver.findElement(By.name("q")).sendKeys("selenide");

driver.findElement(By.name("btnK")).click();

assertEquals(9, driver.findElements(

By.cssSelector("#ires .g")).size());

Элемент не успел отрисоваться

Page 19: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

driver.navigate().to("https://www.google.com/");

driver.findElement(By.name("q")).sendKeys("selenide");

driver.findElement(By.name("btnK")).click();

assertEquals(9, driver.findElements(

By.cssSelector("#ires .g")).size());WebDriverException:Element <input value="Google Search" aria-label="Google Search" name="btnK" type="submit" jsaction="sf.chk"> is not clickable at point (448, 411). Other element would receive the click: <div class="sbqs_c">...</div>

Page 20: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

driver.navigate().to("https://www.google.com/");

driver.findElement(By.name("q")).sendKeys("selenide");

driver.findElement(By.name("btnK")).click();

assertEquals(9, driver.findElements(

By.cssSelector("#ires .g")).size());

Не все строки успели отрисоваться

Page 21: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Причины 90% flaky тестов:

● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS

Page 22: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS

Есть лекарство!

selenide.org

Page 23: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

@Test

public void userCanLogin() {

open(“http://localhost:8080/login”);

$(By.name(“username”).setValue(“john”);

$(“#submit”).click();

$(“.menu”).shouldHave(text(“Hello, John!”));

}

Динамика: Selenide поможет!

Page 24: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Умные ожидания

Забудьте про Ajax

$(".loading_progress").shouldBe(visible);

$(By.name("gender")).should(disappear);

$("#menu")

.shouldHave(text("Hello"), text("John!"))

.shouldBe(enabled, selected);

Page 25: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

$(".loading_progress").shouldBe(visible);

Все $.should*() методымогут подождать

до 4 секунд

Умные ожидания

Page 26: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

$(".loading_progress").shouldBe(visible);

mvn -Dselenide.timeout=8000

Умные ожидания

Все $.should*() методымогут подождать

до 4 секунд

Page 27: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 2: nbob

Это невозможно!

Page 28: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Хотим залогиниться юзером “bob”.

Page 29: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

А в поле почему-то “nbob”.

nbob

Page 30: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Но слова “nbob” нет нигде в проекте...

nbob

Page 31: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

@Test

public void loginKiosk() {

open(“http://localhost:9000/kiosk”);

$(“body”).click();

$(By.name(“username”)).sendKeys(“bob”);

$(“#login”).click();

}

Смотрим код:

Page 32: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Виновата эта строка:

@Test

public void loginKiosk() {

open(“http://localhost:9000/kiosk”);

$(“body”).click(); // появляется “n” $(By.name(“username”)).sendKeys(“bob”);

$(“#login”).click();

}

Page 33: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет
Page 34: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

$(“body”).click(); // появляется “n”

Page 35: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

$(“body”).click(); // появляется “n”

Page 36: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Зачем это было?

Когда-то это вставили, чтобы (наверное) убрать фокус с поля:

$(“body”).click();

Мораль:

Не надо вставлять что попало в <body>!

Page 37: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Почему тесты нестабильные?

● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS● Размер окна браузера● Суета!● ...

Page 38: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Configuration.startMaximized = true;

Configuration.browserSize = ”1024x768”;

плохо:

хорошо:

Page 39: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 3: Фантомные счета

Миллион совпадений

Page 40: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 3: фантомные счета

$$("#loans .loan").shouldHave(size(5));

Page 41: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 3: фантомные счета

$$("#loans tbody tr").shouldHave(size(5));

Но иногда - ListSizeMismatch :

expected: = 5, actual: 6

Откуда-то берётся лишний счёт!

Page 42: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 3: фантомные счета

// Создаёт счётLoansTest

100500 др. тестов...

// Ожидает 5 счетовAccountsTest

Page 43: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Loa...

Acc...

Создаёт счёт

Ожидает 5 счетов

@After

public void cleanup() { loans.delete(

“where id = 6”);

}

КЭШ

Page 44: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

AccountService

@CacheFor(“5mn”)

public List<Account> accounts(...) {

return ...

}

Page 45: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

public class UITest {

@Before

public void setUp() {

api.clearCache();

}

}public class AccountsTest

extends UITest {

@Before

public void setUp() {

open(“/accounts”);

}

}

Page 46: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

public class UITest {

@Before

public void setUp() {

api.clearCache();

}

}public class AccountsTest

extends UITest {

@Before

public void setUp() {

open(“/accounts”);

}

}

Page 47: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Мораль:1. Clean code в тестах ТОЖЕ ВАЖЕН!2. Используйте проверки в IDEA:

Page 48: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

LoansTest

AccountsTest

> 5 минут

< 5 минут

- Тест ok

Зависит от скорости и порядка:

(кэш счетов - 5 минут)

- Тест NOK 100500 других тестов

Page 49: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS● Размер окна браузера

Почему тесты нестабильные?

● Кэш приложения● Данные от предыдущих тестов● Время ● ...

Page 50: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 4: Время Java

миллисекунды или наносекунды?

Page 51: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Случай:Иногда тест падает, потому что ...дата платежа - в будущем

assert payment.time <= new Date();

// иногда падает!…payment.time = new Date();

Как такое возможно?

Page 52: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Смотрим лог приложения:19:35:25,145 [1e8-453] INFO request Payments.success 127.0.0.1 ccd4be41-fed9-4637-aee6-57e6c50ced85 Desktop c-private paymentId=100006 -> RenderTemplate /app/views/Payments/success.html -3254 ms

Page 53: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

19:35:25,145 [1e8-453] INFO request Payments.success 127.0.0.1 ccd4be41-fed9-4637-aee6-57e6c50ced85 Desktop c-private paymentId=100006 -> RenderTemplate /app/views/Payments/success.html -3254 ms

Смотрим лог приложения:

Page 54: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Логируем текущее времяFri Jun 23 23:58:34 MSK 2017

Fri Jun 23 23:58:35 MSK 2017

Fri Jun 23 23:58:36 MSK 2017

Fri Jun 23 23:58:37 MSK 2017

Fri Jun 23 23:58:35 MSK 2017

Fri Jun 23 23:58:39 MSK 2017

Fri Jun 23 23:58:40 MSK 2017

Page 55: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Разгадка векаНа сервере дженкинса запущено два разных сервиса для синхронизации времени - ntp и systemd-timesyncd:

$ ps aux | grep ntp

ntp 3485 0.0 0.0 110040 4556 ? Ssl Jun20 0:22 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 114:123

$ ps aux | grep systemd-timesyncd

systemd+ 832 0.0 0.0 100324 2404 ? Ssl Jun15 0:56 /lib/systemd/systemd-timesyncd

Page 56: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Разгадка векаНа сервере дженкинса запущено два разных сервиса для синхронизации времени - ntp и systemd-timesyncd:

Конечно, они используют разные сервера и мешают друг другу.

Page 57: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

System.currentTimeMillis()

long start = System.currentTimeMillis();

… тра-ля-ля ...long end = System.currentTimeMillis();

log.info(“Loaded in {} ms”, end-start);

Page 58: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

System.nanoTime()

long start = System.nanoTime();

… тра-ля-ля ...long end = System.nanoTime();

log.info(“Loaded in {} ms”,

(end-start)/10000000);

Page 59: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Я всю жизнь думал, что

System.currentTimeMillis() == System.nanoTime() / 1_000_000;

А вот и НЕТ!

System.currentTimeMillis() - реальная датаSystem.nanoTime() - некий счётчик

● Гарантированно растёт● Связан со случайным моментом времени

Page 60: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 5: Проклятие зелёной кнопки

Помогло только видео

Page 61: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пример 6: Почему зависает Chrome?

Расследование длиной в 2 года

Page 62: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Проблема

Иногда Chrome зависает● “Build is running 36 hours….”

Since 2014

Thread dump показывает:● Chromedriver зависает!● Обычно в момент закрытия

Page 63: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Поток висит в таком состоянии:

"Forwarding get on session 1a9a42 to remote"

java.lang.Thread.State: RUNNABLE

at java.net.SocketInputStream.socketRead0(Native Method)

at org.apache.http..(SessionInputBufferImpl.java:139)

at org.openqa.selenium...(ApacheHttpClient.java:144)

at com.codeborne.selenide.Selenide.open(Selenide.java:51)

at ui.UITest.fastLogin(UITest.java:337)

at ui.mobile...(MobileLoanEarlyRepaymentSpec.java:19)

Page 64: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

1. Таймаут для открытия/закрытия браузера● Открывать браузер в отдельном потоке● Закрывать браузер в отдельном потоке● Таймаут 15 секунд, до 3 попыток

Результат:● Не помогло Sep 2015

Наши попытки

Page 65: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

2. Убивать старые процессы chromeДжоб в Jenkins “kill-chrome”

● killall --older-than 1h chromedriver● killall --older-than 1h chrome

Результат:● Не помогло Nov 2015

Наши попытки

Page 66: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

3. Включить debug логи приложения4. Включить debug логи вебдрайвера

Mar 2016

Результат:● Ничего не нашли

Наши попытки

Page 67: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

5. Переоткрывать браузерПосле каждых 20 тестов:

● Закрыть браузер● Открыть браузер

Результат:● Проблема стала повторяться чаще!● УРА! Mar 2016

Наши попытки

Page 68: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

6. Попытаемся повторить проблему● Цикл 1..1000

○ Открыть браузер○ open(“http://localhost:9000/app”)○ Закрыть браузер

Результат:● Повторяется стабильно!● После каждых ~80 итераций Mar 2016

Наши попытки

Page 69: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

И наконец...● Случайно оставил тест бегать● Через 20 минут - что я вижу:

● 5, 4, 3, 2, 1 ...● … и тест продолжается!!!

Page 70: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Результат:● Chrome вовсе не зависает● Chrome чего-то ждёт

Page 71: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Путём исключения нашли:

<script type="text/javascript">

var timeout =

setTimeout(sessionWatcher);

</script>

Прогер, помни:● document.ready или $(function);

Page 72: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Правильно так:

<script type="text/javascript">

var timeout;

$(function() {

timeout = setTimeout(...);

});

</script>

Page 73: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

2 ГОДА, КАРЛ!!!

Page 74: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Успешной оказалась самая нелепая и

бессмысленная попытка

Как ни странно,

Page 75: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Почему тесты бывают нестабильными?

Page 76: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Типичные проблемы:● Ajax запросы: скорость, порядок● Скорость JS● Размер окна браузера● Кэш● Время● Стабильность браузера● UI эффекты● Параллельные браузеры (потеря фокуса)

Page 77: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

● БАГИ!○ Трудновоспроизводимые○ Нереальные○ Некритичные○ Usability

А также:

И поэтому никто их исправлять не будет :(

Page 78: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Профилактика

1. Пирамида

2. Selenide

3. Эмуляторы сервисов

4. Чистая база перед каждым тестом

Page 79: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Пирамида - это обязательно!

700шт

7000шт

нестабильно

стабильно

40 м.

1 м.

Page 80: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Вооружитесь:

Page 81: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

1. Логи предыдущих билдов

finally {

stage("Reports") {

junit 'build/test-results/**/*.xml'

artifacts =

'build/reports/**/*,build/test-results/**/*,logs/**/*'

archiveArtifacts artifacts: artifacts

}

}

Jenkinsfile

Page 82: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Вооружитесь:

1. Логи предыдущих билдов

2. Скриншоты

Page 83: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Вооружитесь:

1. Логи предыдущих билдов

2. Скриншоты

3. Видео ……..

Page 84: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Видео - вариант 1:

@Test @Video

public void flakyTest() {

….

}

http://automation-remarks.com/video-recorder-java/

Page 85: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

@Rule

public BrowserWebDriverContainer chrome =

new BrowserWebDriverContainer()

.withRecordingMode(RECORD_ALL, new File("build"))

.withDesiredCapabilities(chrome());

testcontainers.orgВидео - вариант 2:

Page 86: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Разработчики!

Они без вас не справятся!

Участвуйте в тестировании

Page 87: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Менеджеры!

Иначе ваши деньги псу под хвост

Позвольте разрабам участвовать в тестировании!

Page 88: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Автоматизаторы!

Page 89: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Когда вернётесь,

2. Вооружитесь

1. Проведите профилактику

3. И ждите

Page 90: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Радуйтесь!

И когда тест упадёт-

Вы выходите на охоту

Page 91: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет

Андрей Солнцев@asolntsev

ru.selenide.org