1 of 29

Хороший тест

-

простой тест

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

2 of 29

Selenide:

Нафига?

3 of 29

Don’t put logic in tests

@Test

public void shouldNavigateToPhotosPage() {

String baseUrl = "http://plus.google.com/";

Navigator nav = new Navigator(baseUrl);

nav.goToPhotosPage();

assertEquals(baseUrl + "/u/0/photos",

nav.getCurrentUrl());

}

http://googletesting.blogspot.com/2014/07/testing-on-toilet-dont-put-logic-in.html

4 of 29

Don’t put logic in tests

@Test

public void shouldNavigateToPhotosPage() {

Navigator nav = new Navigator("http://plus.google.com/");

nav.goToPhotosPage();

assertEquals("http://plus.google.com//u/0/photos",

nav.getCurrentUrl());

}

Упс!

5 of 29

Код

Тест

Общий алгоритм

Частные случаи

C = SQRT(A*A + B*B)

assert hyph(3,4) == 5

assert hyph(5,12) == 13

assert hyph(1,1) == 1.41

assert hyph(0,0) == 0

assert hyph(-1,3) -> error

6 of 29

Тесты

Код

сложный

простые

копипаст

нельзя

копипаст

можно

7 of 29

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

  • условия
  • переменные
  • вычисления
  • циклы

привносят в тесты ошибки!

А тем более:

  • Page Object
  • Factory
  • Builder
  • “карточки”
  • и т.д.

8 of 29

Усложнения в тесты

Стоит вносить осознанно

  • только по необходимости
  • понимая риски

9 of 29

Итак,

чем же хорош Selenide?

10 of 29

Selenide

экономит массу времени

  • позволяет начать очень просто
  • и усложнять при необходимости
  • при написании
  • при отладке
  • синтаксис + API
  • умное ожидание

(20%)

(80%)

11 of 29

Пример: Google search

12 of 29

Google search - Page Object

13 of 29

Selenide

новинки

14 of 29

  1. Автоматические скриншоты

15 of 29

На Jenkins - публичный URL:

build.gradle

16 of 29

2. Методы $.hover(), $.dragAndDrop()

17 of 29

3. Поиск родителей

  • $.parent()
  • $.closest(“table”)
  • $.closest(“.modal”)

18 of 29

4. $.uploadFile(File file)

19 of 29

4. $.uploadFile(File … files)

20 of 29

5. sizzle selectors

21 of 29

6. zoom in/out

22 of 29

7. Selenide profiler

Report for userCanReplyToIncomingMessages(ui.BankMessagesSpec)

+----------------------+---------------------------------------------+--------+----------+

|Element |Subject |Status |ms. |

+----------------------+---------------------------------------------+--------+----------+

|open |http://localhost:2070/ |PASSED |4669 |

|open |http://localhost:2070/fakeLogin?username=bob |PASSED |1324 |

|By.linkText: Quicky |click() |PASSED |793 |

|#btn-message-reply |click() |PASSED |1002 |

|By.name: message.text |should be(focused) |PASSED |57 |

|By.name: message.text |should have(text 'long thread') |PASSED |47 |

|By.name: message.text |set value(Hello world!) |PASSED |69 |

|#send-button |click() |PASSED |1051 |

|.alert-success |should be(visible) |PASSED |71 |

+--------------------+-----------------------------------------------+--------+----------+

23 of 29

8. fast set value

mvn -Dselenide.fastSetValue=true

@Before public void setUp() {

Configuration.fastSetValue = true;

}

или

24 of 29

8. fast set value

И тогда $.setValue() использует JavaScript

  • $.setValue(“john”) - быстро
  • $.sendKeys(“john”) - для autocompletion

который гораздо быстрее!

Ты сам можешь выбирать:

25 of 29

Благодарности

  • Alexandr Gavrilenko�Improved mechanism of closing webdrivers�
  • Sergey Shimkiv �Added method getWebDriverLogs()

26 of 29

Благодарности

  • Vladimir Denisov @proton72�Added support for BrowserMob proxy�
  • kumarunster �Possibility to log important Selenide Actions

27 of 29

Статистика скачиваний

28 of 29

Уникальных IP

29 of 29

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

@asolntsev

ru.selenide.org

Спасибо!