SlideShare a Scribd company logo
АВТОТЕСТЫ В
ФУНКЦИОНАЛЬНОМ
СТИЛЕ
КОНСТАНТИН НЕРАДОВСКИЙ
СБЕРБАНК ТЕХНОЛОГИИ
kneradovsky@gmail.com
telegram: @kneradovsky
ПОЧЕМУ
• Линейный код - что вижу, то пою.
• Много copy-n-paste. «копирование велосипедов»
• Assertions покрывают только «стандартные» проверки. Поэтому
не используется
• Низкое качество кода. NullPointerException бывает чаще чем кофе.
• Реиспользуемость - что это?
КАК?
• StreamAPI - коллекции
• Optional - исключает NullPointerException
• Лямбда выражения в WebDriverWait - исключает неожиданные
ElementNotFoundException
• Словари проверок - нет copy-n-paste
• Частичное применение функций - повышает реиспользуемость
• Лямбда выражения в Assert - удобные проверки
ПРИНЦИПЫ
ФУНКЦИОНАЛЬНЫЙ ПОДХОД
• First-Class
Functions - функции как объекты.
• High-Order
Functions - функции порождают функции
• Pure functions - результат зависит только от аргументов
• Closures - фиксирование контекста
• Immutable state неизменяемое состояние.
v = function a() {
return «a»;};
vf = function b() {
return v;};
function sum(a,b) {
return a+b;};
out = «outside»;
f = function c() {
return out+«a»;};
obj = function concat(o1,o2) {
return o3 = o1+o2;};
АНОНИМНЫЙ КЛАСС - РЕАЛИЗАЦИЯ ИНТЕРФЕЙСА
ЛЯМБДА ВЫРАЖЕНИЯ
(входные параметры) -> {реализация метода интерфейса}
Лямбда Анонимный класс
Predicate<String> t = s -> s.equals(«test»);
Predicate<String> t = new Predicate<String> {
public boolean test(String s) {
return s.equals(«test»);}
Runnable r = () -> {System.out.println(«a»);}
Runnable r = new Runnable {
public void run() {
System.out.println(«a»);}
Function<Integer,String> c = i -> i.toString();
Function f = new Function<Integer,String> {
String apply(Integer i) {
return i.toString();}
ЗАМЫКАНИЯ И ВЫЗОВ
ЛЯМБДА ВЫРАЖЕНИЯ
Замыкание
final String label = "element contents";
Predicate<WebElement> p = e -> e.getText().equals(label);
Вызов
Определение Вызов
Predicate<String> t = s -> s.equals(«test»); boolean result = t.test(«string1»);
Function<WebElement,String> m = e -> e.getText(); String text = m.apply(element);
Consumer<WebElement> c = e -> {e.click();} c.accept(element);
ФУНКЦИОНАЛЬНЫЕ ИНТЕРФЕЙСЫ
Java.util.function
• Consumer<T> – принять o -> {code;}
• Supplier<R> - вернуть () -> new MyObject()
• Function<T,R> – принять и вернуть o -> o.toString()
• Predicate<T> – принять что-то и вернуть boolean o -> o.equals(expected)
Любой интерфейс с одним методом
• Runnable () -> {code;}
• Comparable<T> o -> o.toString().compareTo(expected);
• и т.д.
NPE no more
OPTIONAL
Optional Эквивалент
ClassA c = ofNullable(a).orElse(b); ClassA c = a!=null ? a : b;
ClassA c = ofNullable(a).orElseGet(()->new
ClassA());
ClassA c = a!=null ? a : new ClassA();
ClassA c = ofNullable(a).orElseThrow(() -> new
AutotestError(«Error»));
ClassA c = a!=null ? a : throw new
AutotestError(«Error»)
JVM MAGIC
METHOD REFERENCE
Method Reference Пример Эквивалент
WebElement::getText
Function<WebElement,String> t =
WebElement::getText
Function<WebElement,String> t
= element -> element.getText()
ClassA::new Supplier<ClassA> s = ClassA::new
Supplier<ClassA>
s = () -> new ClassA();
УДОБНАЯ РАБОТА С ДАННЫМИ
STREAM API
Коллекция
list.stream()
Генерация
Stream.generate
sum, min, joining
groupingBy
reduce
collect …
java.util.stream
TRY – CHECKED EXECUTION AND STREAM API FOR OBJECTS
JAVASLANG
Try.of - аналог Optional.ofNullable, но перехватывает исключения
Try.of(ClassA::new).onFailure(exception -> {process exception});
Try.run - выполняет блок и перехватывает исключения
Try.run(()->element.click()).onFailure(e-> processException)
Try.filter - аналог Stream.filter, но для объектов
Try.of(ClassA::new).filter(ClassA::isEnabled).orElse(null);
Try.map - аналог Stream.map, но для объектов
Try.of(ClassA::new).filter(ClassA::toString).orElse(«default string»);
List<WebElement>.stream()
КОЛЛЕКЦИИ
Найти все видимые элементы .filter(WebElement::isDisplayed).toArray()
Вернуть текст элементов .map(WebElement::getText).toArray()
Отобрать все элементы с id=1
.filter(e->e.getAttribute(«id»).equals(«1»))
.toArray()
Function<Predicate<WebElement>,BaseMatcher<WebElement>> m
ASSERTS
Элемент el enabled assertThat(el,m.apply(WebElement::isEnabled))
Элемент el видим assertThat(el,m.apply(WebElement::isDisplayed))
Класс элемента содержит
class
assertThat(el,
m.apply(e->e.getAttribute(«class»).contains(«class1»)))
Q&A
СПАСИБО
… AND LET’S CODE
https://github.com/kneradovsky/java8fp_samples
kneradovsky@gmail.com
telegram: @kneradovsky
https://habrahabr.ru/post/301166/

More Related Content

PPTX
Нагрузочное тестирование JMeter Кожухов
PPTX
Грязная автоматизация
PPTX
Слои тестового фрамеворка. Что? Где? Когда?
PPT
6 лекция. тестирование производительности
PDF
Илья Кудинов
PDF
Проверка на прочность или нагрузочное тестирование с Jmeter
PPTX
Асинхронные вызовы в .NET
PDF
Автоматизация функционального тестирования REST API
Нагрузочное тестирование JMeter Кожухов
Грязная автоматизация
Слои тестового фрамеворка. Что? Где? Когда?
6 лекция. тестирование производительности
Илья Кудинов
Проверка на прочность или нагрузочное тестирование с Jmeter
Асинхронные вызовы в .NET
Автоматизация функционального тестирования REST API

What's hot (20)

PPTX
Высокоуровневый параллелизм
PPT
Анализируем результаты тестирования производительности с Graphite и Grafana
PDF
Приёмы функционального программирования в обычном JavaScript
PPTX
Тестирование отклика Web-интерфейса с JMeter и Selenium
PPTX
антон веснин Rails Application Servers
PDF
UICov - инструмент анализа покрытия UI-тестами
PPTX
Нагрузочное тестирование теория Кожухов
PDF
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
PDF
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
PDF
Wider than rails
PPTX
Service locator
PPT
3 лекция. презентация
PPTX
Поиск багов в поиске
PPTX
Система мониторинга Zabbix в процессах разработки и тестирования | Алексей Буров
PPT
Нагрузочное тестирование
PPT
02-lection-ka
PPTX
От простого к сложному: автоматизируем ручные тест-планы | Сергей Тимченко
PDF
Полуавтоматизация third-party API
PPTX
Automation Functional Testing in Agile Projects
PDF
Нагрузочное тестирование с помощью Яндекс.Танка
Высокоуровневый параллелизм
Анализируем результаты тестирования производительности с Graphite и Grafana
Приёмы функционального программирования в обычном JavaScript
Тестирование отклика Web-интерфейса с JMeter и Selenium
антон веснин Rails Application Servers
UICov - инструмент анализа покрытия UI-тестами
Нагрузочное тестирование теория Кожухов
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Wider than rails
Service locator
3 лекция. презентация
Поиск багов в поиске
Система мониторинга Zabbix в процессах разработки и тестирования | Алексей Буров
Нагрузочное тестирование
02-lection-ka
От простого к сложному: автоматизируем ручные тест-планы | Сергей Тимченко
Полуавтоматизация third-party API
Automation Functional Testing in Agile Projects
Нагрузочное тестирование с помощью Яндекс.Танка
Ad

Similar to Java 8. Autotests in a functional way. (20)

PDF
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
PPTX
Михаил Боднарчук Современное функциональное тестирование с Codeception
PDF
C# Desktop. Занятие 16.
PPTX
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
PDF
М. Боднарчук Современное функциональное тестирование с Codeception
PPTX
разработка бизнес приложений (8)
PPTX
PowerShell
PDF
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
PPTX
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
PDF
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
PPTX
knockout.js
PPTX
Повышение качества тестов и автоматическая валидация REST API документации
PPTX
Типичные ошибки начинающих писать тесты на WebDriver
PPTX
PPTX
Статический анализ кода: борьба с удорожанием ошибок
PDF
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
PPTX
Reactive Extensions
PPTX
Postman тестирование api v1.0 (1)
PDF
владивосток форум новости технологий 2015
PDF
Организация процесса ручного тестирования
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
Михаил Боднарчук Современное функциональное тестирование с Codeception
C# Desktop. Занятие 16.
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
М. Боднарчук Современное функциональное тестирование с Codeception
разработка бизнес приложений (8)
PowerShell
SECON'2016. Мухаметов Андрей, RxSwift && Apple TV - так ли хорошо всё новое?
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
knockout.js
Повышение качества тестов и автоматическая валидация REST API документации
Типичные ошибки начинающих писать тесты на WebDriver
Статический анализ кода: борьба с удорожанием ошибок
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Reactive Extensions
Postman тестирование api v1.0 (1)
владивосток форум новости технологий 2015
Организация процесса ручного тестирования
Ad

Java 8. Autotests in a functional way.

  • 2. ПОЧЕМУ • Линейный код - что вижу, то пою. • Много copy-n-paste. «копирование велосипедов» • Assertions покрывают только «стандартные» проверки. Поэтому не используется • Низкое качество кода. NullPointerException бывает чаще чем кофе. • Реиспользуемость - что это?
  • 3. КАК? • StreamAPI - коллекции • Optional - исключает NullPointerException • Лямбда выражения в WebDriverWait - исключает неожиданные ElementNotFoundException • Словари проверок - нет copy-n-paste • Частичное применение функций - повышает реиспользуемость • Лямбда выражения в Assert - удобные проверки
  • 4. ПРИНЦИПЫ ФУНКЦИОНАЛЬНЫЙ ПОДХОД • First-Class Functions - функции как объекты. • High-Order Functions - функции порождают функции • Pure functions - результат зависит только от аргументов • Closures - фиксирование контекста • Immutable state неизменяемое состояние. v = function a() { return «a»;}; vf = function b() { return v;}; function sum(a,b) { return a+b;}; out = «outside»; f = function c() { return out+«a»;}; obj = function concat(o1,o2) { return o3 = o1+o2;};
  • 5. АНОНИМНЫЙ КЛАСС - РЕАЛИЗАЦИЯ ИНТЕРФЕЙСА ЛЯМБДА ВЫРАЖЕНИЯ (входные параметры) -> {реализация метода интерфейса} Лямбда Анонимный класс Predicate<String> t = s -> s.equals(«test»); Predicate<String> t = new Predicate<String> { public boolean test(String s) { return s.equals(«test»);} Runnable r = () -> {System.out.println(«a»);} Runnable r = new Runnable { public void run() { System.out.println(«a»);} Function<Integer,String> c = i -> i.toString(); Function f = new Function<Integer,String> { String apply(Integer i) { return i.toString();}
  • 6. ЗАМЫКАНИЯ И ВЫЗОВ ЛЯМБДА ВЫРАЖЕНИЯ Замыкание final String label = "element contents"; Predicate<WebElement> p = e -> e.getText().equals(label); Вызов Определение Вызов Predicate<String> t = s -> s.equals(«test»); boolean result = t.test(«string1»); Function<WebElement,String> m = e -> e.getText(); String text = m.apply(element); Consumer<WebElement> c = e -> {e.click();} c.accept(element);
  • 7. ФУНКЦИОНАЛЬНЫЕ ИНТЕРФЕЙСЫ Java.util.function • Consumer<T> – принять o -> {code;} • Supplier<R> - вернуть () -> new MyObject() • Function<T,R> – принять и вернуть o -> o.toString() • Predicate<T> – принять что-то и вернуть boolean o -> o.equals(expected) Любой интерфейс с одним методом • Runnable () -> {code;} • Comparable<T> o -> o.toString().compareTo(expected); • и т.д.
  • 8. NPE no more OPTIONAL Optional Эквивалент ClassA c = ofNullable(a).orElse(b); ClassA c = a!=null ? a : b; ClassA c = ofNullable(a).orElseGet(()->new ClassA()); ClassA c = a!=null ? a : new ClassA(); ClassA c = ofNullable(a).orElseThrow(() -> new AutotestError(«Error»)); ClassA c = a!=null ? a : throw new AutotestError(«Error»)
  • 9. JVM MAGIC METHOD REFERENCE Method Reference Пример Эквивалент WebElement::getText Function<WebElement,String> t = WebElement::getText Function<WebElement,String> t = element -> element.getText() ClassA::new Supplier<ClassA> s = ClassA::new Supplier<ClassA> s = () -> new ClassA();
  • 10. УДОБНАЯ РАБОТА С ДАННЫМИ STREAM API Коллекция list.stream() Генерация Stream.generate sum, min, joining groupingBy reduce collect … java.util.stream
  • 11. TRY – CHECKED EXECUTION AND STREAM API FOR OBJECTS JAVASLANG Try.of - аналог Optional.ofNullable, но перехватывает исключения Try.of(ClassA::new).onFailure(exception -> {process exception}); Try.run - выполняет блок и перехватывает исключения Try.run(()->element.click()).onFailure(e-> processException) Try.filter - аналог Stream.filter, но для объектов Try.of(ClassA::new).filter(ClassA::isEnabled).orElse(null); Try.map - аналог Stream.map, но для объектов Try.of(ClassA::new).filter(ClassA::toString).orElse(«default string»);
  • 12. List<WebElement>.stream() КОЛЛЕКЦИИ Найти все видимые элементы .filter(WebElement::isDisplayed).toArray() Вернуть текст элементов .map(WebElement::getText).toArray() Отобрать все элементы с id=1 .filter(e->e.getAttribute(«id»).equals(«1»)) .toArray()
  • 13. Function<Predicate<WebElement>,BaseMatcher<WebElement>> m ASSERTS Элемент el enabled assertThat(el,m.apply(WebElement::isEnabled)) Элемент el видим assertThat(el,m.apply(WebElement::isDisplayed)) Класс элемента содержит class assertThat(el, m.apply(e->e.getAttribute(«class»).contains(«class1»)))
  • 14. Q&A СПАСИБО … AND LET’S CODE https://github.com/kneradovsky/java8fp_samples kneradovsky@gmail.com telegram: @kneradovsky https://habrahabr.ru/post/301166/