flaky tests · pdf file · 2017-12-10flaky test - это тест, который...
TRANSCRIPT
![Page 1: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/1.jpg)
Flaky tests
Андрей Солнцев
О нестабильных тестахи как с ними бороться
twitter.com/asolntsev
![Page 2: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/2.jpg)
АДавтоматизаторов
![Page 3: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/3.jpg)
Как у вас с автоматизацией?
![Page 4: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/4.jpg)
СТАБИЛЬНОСТИНЕТ!
![Page 5: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/5.jpg)
Flaky test
- это тест, который падает иногда
Никогда не знаешь, баг или нет.
![Page 6: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/6.jpg)
Ой, 30 тестов упало.Надо изучить!
… Впрочем, П……У….. !
![Page 7: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/7.jpg)
Ой, 30 тестов упало.Надо изучить!
… Впрочем, Перезапущу!
![Page 8: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/8.jpg)
Сколько у вас 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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/9.jpg)
Даже 1.5% - очень плохо!
Упало 15 из 1000
Упало 12 из 1000
Упало 18 из 1000
Нужен ручной контроль!
|
|
![Page 10: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/10.jpg)
И даже 0.1% - плохо:
Ни дня без красного билда!
![Page 11: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/11.jpg)
Индустрия в опасности!
![Page 12: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/12.jpg)
План
1. Моя коллекция нестабильных тестов
2. Причины нестабильности
3. Как с ними бороться?
![Page 13: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/13.jpg)
Моя коллекция
![Page 14: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/14.jpg)
Пример 1: классика
Этот динамический веб
![Page 15: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/15.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/16.jpg)
Какая строчка тут может сломаться?
ЛЮБАЯ!
![Page 17: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/17.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/18.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/19.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/20.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/21.jpg)
Причины 90% flaky тестов:
● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS
![Page 22: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/22.jpg)
● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS
Есть лекарство!
selenide.org
![Page 23: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/23.jpg)
@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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/24.jpg)
Умные ожидания
Забудьте про 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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/25.jpg)
$(".loading_progress").shouldBe(visible);
Все $.should*() методымогут подождать
до 4 секунд
Умные ожидания
![Page 26: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/26.jpg)
$(".loading_progress").shouldBe(visible);
mvn -Dselenide.timeout=8000
Умные ожидания
Все $.should*() методымогут подождать
до 4 секунд
![Page 27: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/27.jpg)
Пример 2: nbob
Это невозможно!
![Page 28: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/28.jpg)
Хотим залогиниться юзером “bob”.
![Page 29: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/29.jpg)
А в поле почему-то “nbob”.
nbob
![Page 30: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/30.jpg)
Но слова “nbob” нет нигде в проекте...
nbob
![Page 31: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/31.jpg)
@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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/32.jpg)
Виновата эта строка:
@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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/33.jpg)
![Page 34: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/34.jpg)
$(“body”).click(); // появляется “n”
![Page 35: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/35.jpg)
$(“body”).click(); // появляется “n”
![Page 36: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/36.jpg)
Зачем это было?
Когда-то это вставили, чтобы (наверное) убрать фокус с поля:
$(“body”).click();
Мораль:
Не надо вставлять что попало в <body>!
![Page 37: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/37.jpg)
Почему тесты нестабильные?
● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS● Размер окна браузера● Суета!● ...
![Page 38: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/38.jpg)
Configuration.startMaximized = true;
Configuration.browserSize = ”1024x768”;
плохо:
хорошо:
![Page 39: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/39.jpg)
Пример 3: Фантомные счета
Миллион совпадений
![Page 40: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/40.jpg)
Пример 3: фантомные счета
$$("#loans .loan").shouldHave(size(5));
![Page 41: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/41.jpg)
Пример 3: фантомные счета
$$("#loans tbody tr").shouldHave(size(5));
Но иногда - ListSizeMismatch :
expected: = 5, actual: 6
Откуда-то берётся лишний счёт!
![Page 42: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/42.jpg)
Пример 3: фантомные счета
// Создаёт счётLoansTest
100500 др. тестов...
// Ожидает 5 счетовAccountsTest
![Page 43: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/43.jpg)
Loa...
Acc...
Создаёт счёт
Ожидает 5 счетов
@After
public void cleanup() { loans.delete(
“where id = 6”);
}
КЭШ
![Page 44: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/44.jpg)
AccountService
@CacheFor(“5mn”)
public List<Account> accounts(...) {
return ...
}
![Page 45: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/45.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/46.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/47.jpg)
Мораль:1. Clean code в тестах ТОЖЕ ВАЖЕН!2. Используйте проверки в IDEA:
![Page 48: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/48.jpg)
LoansTest
AccountsTest
> 5 минут
< 5 минут
- Тест ok
Зависит от скорости и порядка:
(кэш счетов - 5 минут)
- Тест NOK 100500 других тестов
![Page 49: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/49.jpg)
● Ajax запросы: скорость● Ajax запросы: порядок● Скорость JS● Размер окна браузера
Почему тесты нестабильные?
● Кэш приложения● Данные от предыдущих тестов● Время ● ...
![Page 50: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/50.jpg)
Пример 4: Время Java
миллисекунды или наносекунды?
![Page 51: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/51.jpg)
Случай:Иногда тест падает, потому что ...дата платежа - в будущем
assert payment.time <= new Date();
// иногда падает!…payment.time = new Date();
Как такое возможно?
![Page 52: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/52.jpg)
Смотрим лог приложения: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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/53.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/54.jpg)
Логируем текущее время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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/55.jpg)
Разгадка векаНа сервере дженкинса запущено два разных сервиса для синхронизации времени - 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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/56.jpg)
Разгадка векаНа сервере дженкинса запущено два разных сервиса для синхронизации времени - ntp и systemd-timesyncd:
Конечно, они используют разные сервера и мешают друг другу.
![Page 57: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/57.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/58.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/59.jpg)
Я всю жизнь думал, что
System.currentTimeMillis() == System.nanoTime() / 1_000_000;
А вот и НЕТ!
System.currentTimeMillis() - реальная датаSystem.nanoTime() - некий счётчик
● Гарантированно растёт● Связан со случайным моментом времени
![Page 60: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/60.jpg)
Пример 5: Проклятие зелёной кнопки
Помогло только видео
![Page 61: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/61.jpg)
Пример 6: Почему зависает Chrome?
Расследование длиной в 2 года
![Page 62: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/62.jpg)
Проблема
Иногда Chrome зависает● “Build is running 36 hours….”
Since 2014
Thread dump показывает:● Chromedriver зависает!● Обычно в момент закрытия
![Page 63: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/63.jpg)
Поток висит в таком состоянии:
"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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/64.jpg)
1. Таймаут для открытия/закрытия браузера● Открывать браузер в отдельном потоке● Закрывать браузер в отдельном потоке● Таймаут 15 секунд, до 3 попыток
Результат:● Не помогло Sep 2015
Наши попытки
![Page 65: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/65.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/66.jpg)
3. Включить debug логи приложения4. Включить debug логи вебдрайвера
Mar 2016
Результат:● Ничего не нашли
Наши попытки
![Page 67: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/67.jpg)
5. Переоткрывать браузерПосле каждых 20 тестов:
● Закрыть браузер● Открыть браузер
Результат:● Проблема стала повторяться чаще!● УРА! Mar 2016
Наши попытки
![Page 68: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/68.jpg)
6. Попытаемся повторить проблему● Цикл 1..1000
○ Открыть браузер○ open(“http://localhost:9000/app”)○ Закрыть браузер
Результат:● Повторяется стабильно!● После каждых ~80 итераций Mar 2016
Наши попытки
![Page 69: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/69.jpg)
И наконец...● Случайно оставил тест бегать● Через 20 минут - что я вижу:
● 5, 4, 3, 2, 1 ...● … и тест продолжается!!!
![Page 70: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/70.jpg)
Результат:● Chrome вовсе не зависает● Chrome чего-то ждёт
![Page 71: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/71.jpg)
Путём исключения нашли:
<script type="text/javascript">
var timeout =
setTimeout(sessionWatcher);
</script>
Прогер, помни:● document.ready или $(function);
![Page 72: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/72.jpg)
Правильно так:
<script type="text/javascript">
var timeout;
$(function() {
timeout = setTimeout(...);
});
</script>
![Page 73: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/73.jpg)
2 ГОДА, КАРЛ!!!
![Page 74: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/74.jpg)
Успешной оказалась самая нелепая и
бессмысленная попытка
Как ни странно,
![Page 75: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/75.jpg)
Почему тесты бывают нестабильными?
![Page 76: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/76.jpg)
Типичные проблемы:● Ajax запросы: скорость, порядок● Скорость JS● Размер окна браузера● Кэш● Время● Стабильность браузера● UI эффекты● Параллельные браузеры (потеря фокуса)
![Page 77: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/77.jpg)
● БАГИ!○ Трудновоспроизводимые○ Нереальные○ Некритичные○ Usability
А также:
И поэтому никто их исправлять не будет :(
![Page 78: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/78.jpg)
Профилактика
1. Пирамида
2. Selenide
3. Эмуляторы сервисов
4. Чистая база перед каждым тестом
![Page 79: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/79.jpg)
Пирамида - это обязательно!
700шт
7000шт
нестабильно
стабильно
40 м.
1 м.
![Page 80: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/80.jpg)
Вооружитесь:
![Page 81: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/81.jpg)
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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/82.jpg)
Вооружитесь:
1. Логи предыдущих билдов
2. Скриншоты
![Page 83: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/83.jpg)
Вооружитесь:
1. Логи предыдущих билдов
2. Скриншоты
3. Видео ……..
![Page 84: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/84.jpg)
Видео - вариант 1:
@Test @Video
public void flakyTest() {
….
}
http://automation-remarks.com/video-recorder-java/
![Page 85: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/85.jpg)
@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 - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/86.jpg)
Разработчики!
Они без вас не справятся!
Участвуйте в тестировании
![Page 87: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/87.jpg)
Менеджеры!
Иначе ваши деньги псу под хвост
Позвольте разрабам участвовать в тестировании!
![Page 88: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/88.jpg)
Автоматизаторы!
![Page 89: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/89.jpg)
Когда вернётесь,
2. Вооружитесь
1. Проведите профилактику
3. И ждите
![Page 90: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/90.jpg)
Радуйтесь!
И когда тест упадёт-
Вы выходите на охоту
![Page 91: Flaky tests · PDF file · 2017-12-10Flaky test - это тест, который падает иногда Никогда не знаешь, баг или нет](https://reader031.vdocuments.mx/reader031/viewer/2022021501/5aaa10187f8b9a8b188da51e/html5/thumbnails/91.jpg)
Андрей Солнцев@asolntsev
ru.selenide.org