SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
Меркушев Кирилл
Инженер по автоматизации тестирования
Я.Субботник, Минск, 31 августа
Матчеры	
  
польза использования и легкость
применения в ваших автотестах	
  
2
Проблемы	
  
«Спагетти»	
  
тесты	
  
Дублирование	
  
кода	
  
Сложности	
  оценки	
  
результата	
  
Дорога	
  к	
  матчерам	
  
	
  
Hamcrest	
  
Готовые	
  инструменты	
  
Рубрика:	
  сделай	
  сам	
  
Дорога	
  к	
  матчерам	
  
//assertTrue();
//assertFalse();
//assertEquals();
assertTrue(
"Fruit should be sweet - expected TRUE",
fruit.isSweet());
5
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFileExists(new_fl);
FileAssert.assertIsDirectory(new_fl);
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() +
File.separator + "innerFile"));
// ...
6
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFileExists(new_fl);
FileAssert.assertIsDirectory(new_fl);
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() + File.separator
+ "innerFile"));
DavAssert.assertResourceExists(turkishletters);
DavAssert.assertResourceExists("İSTİKLAL
MARŞI");
DavAssert.assertResourceExists("ı.txt");
DavAssert.assertResourceExists("i.txt");
DavAssert.assertResourceExists("ı");
// ...
7
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFileExists(new_fl);
FileAssert.assertIsDirectory(new_fl);
FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator +
"innerFile"));
FileAssert.assertIsFile(new File(new_fl.getAbsolutePath() + File.separator + "innerFile"));
FileAssert.assertFileContent(new File(new_fl.getAbsolutePath() + File.separator +
"innerFile"), "qwerty".getBytes());
FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator +
"innerDir"));
FileAssert.assertIsDirectory(new File(new_fl.getAbsolutePath() + File.separator +
"innerDir"));
DavAssert.assertResourceExists(turkishletters);
DavAssert.assertResourceExists("İSTİKLAL MARŞI");
DavAssert.assertResourceExists("ı.txt");
DavAssert.assertResourceExists("i.txt");
DavAssert.assertResourceExists("ı");
DavAssert.assertResourceExists("i");
DavAssert.assertFileContent(turkishletters, content);
DavAssert.assertFileContent("İSTİKLAL MARŞI", content);
DavAssert.assertFileContent("ı.txt", content);
DavAssert.assertFileContent("i.txt", content);
@Test
public void itShouldWork() {
checkThatAllWorks();
}
Дорога	
  к	
  матчерам	
  
9
Дорога	
  к	
  матчерам	
  
сheckThatAllWorks();	

//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFileExists(new_fl);
FileAssert.assertIsDirectory(new_fl);
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() + File.separator +
"innerFile"));
FileAssert.assertIsFile(new
File(new_fl.getAbsolutePath() + File.separator +
"innerFile"));
FileAssert.assertFileContent(new
File(new_fl.getAbsolutePath() + File.separator +
"innerFile"), "qwerty".getBytes());
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() + File.separator +
"innerDir"));
FileAssert.assertIsDirectory(new
File(new_fl.getAbsolutePath() + File.separator +
"innerDir"));
DavAssert.assertResourceExists(turkishletters);
DavAssert.assertResourceExists("İSTİKLAL MARŞI");
DavAssert.assertResourceExists("ı.txt");
DavAssert.assertResourceExists("i.txt");
DavAssert.assertResourceExists("ı");
DavAssert.assertResourceExists("i");
@Test //1 @Test //2
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFileExists(new_fl);
FileAssert.assertIsDirectory(new_fl);
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() + File.separator +
"innerFile"));
FileAssert.assertIsFile(new
File(new_fl.getAbsolutePath() + File.separator +
"innerFile"));
FileAssert.assertFileContent(new
File(new_fl.getAbsolutePath() + File.separator +
"innerFile"), "qwerty".getBytes());
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() + File.separator +
"innerDir"));
FileAssert.assertIsDirectory(new
File(new_fl.getAbsolutePath() + File.separator +
"innerDir"));
DavAssert.assertResourceExists(turkishletters);
DavAssert.assertResourceExists("İSTİKLAL
MARŞI");
+	
  
FileAssert.assertFileContent(new
File(new_fl.getAbsolutePath() + File.separator +
"innerFile"), "qwerty".getBytes());
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() + File.separator +
"innerDir"));
DavAssert.assertResourceExists(turkishletters);
DavAssert.assertResourceExists("İSTİKLAL
MARŞI");
@Test
public void
itShouldWorkToday1() {
checkThatAllWorksToday1();
}
@Test
public void
itShouldWorkToday2() {
checkThatAllWorksToday2();
}
@Test
public void
itShouldWorkToday3() {
checkThatAllWorksToday3();
checkThatAllWorksToday4();
}
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(
f1);
FileAssert.assertFileExists(new
_fl);
FileAssert.assertIsDirectory(ne
w_fl);
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() +
File.separator + "innerFile"));
FileAssert.assertIsFile(new
File(new_fl.getAbsolutePath() +
File.separator + "innerFile"));
FileAssert.assertFileContent(ne
w File(new_fl.getAbsolutePath()
+ File.separator +
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(
f1);
FileAssert.assertFileExists(new
_fl);
FileAssert.assertIsDirectory(ne
w_fl);
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() +
File.separator + "innerFile"));
FileAssert.assertIsFile(new
File(new_fl.getAbsolutePath() +
File.separator + "innerFile"));
FileAssert.assertFileContent(ne
w File(new_fl.getAbsolutePath()
+ File.separator +
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(
f1);
FileAssert.assertFileExists(new
_fl);
FileAssert.assertIsDirectory(ne
w_fl);
FileAssert.assertFileExists(new
File(new_fl.getAbsolutePath() +
File.separator + "innerFile"));
FileAssert.assertIsFile(new
File(new_fl.getAbsolutePath() +
File.separator + "innerFile"));
FileAssert.assertFileContent(ne
w File(new_fl.getAbsolutePath()
+ File.separator +
12
Дорога	
  к	
  матчерам	
  
13
Дорога	
  к	
  матчерам	
  
14
Дорога	
  к	
  матчерам	
  
{Проверка}	
  
{Проверка}	
  
{Проверка}	
  
…	

AND,	
  	
  OR,	
  	
  NOT	
  
assertTrue(
"Fruit should be sweet - expected TRUE", fruit.isSweet()
);
Дорога	
  к	
  матчерам	
  
Матчер	
  
{Описание,	
  Логика}	
  
16
Дорога	
  к	
  матчерам	
  
assertThat	
  
JUnit	

Объект	
   Матчер	
  
select	
  
Lambdaj	

assumeThat	
  
JUnit	

…
Hamcrest	
  
Готовые	
  инструменты	
  
Рубрика:	
  сделай	
  сам	
  
Дорога	
  к	
  матчерам	
  
	
  
Hamcrest	
  
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</dependency>
assertTrue("Fruit should be sweet", fruit.isSweet());
assertEquals("Fruit should be round",
Shape.ROUND, fruit.getShape());
assertEquals("Fruit should be orange",
Color.ORANGE, fruit.getColor());
Hamcrest	
  
assertThat(
fruit,
both(round()).and(sweet()).and(hasColor(Color.ORANGE))
);
assertTrue("Fruit1 should be sweet", fruit1.isSweet());
assertTrue("Fruit2 should be sweet", fruit2.isSweet());
assertTrue("Fruit3 should be sweet", fruit3.isSweet());
Hamcrest	
  
assertThat(asList(fruit1, fruit2, fruit3),
everyItem(is(sweet())));
// или
assertThat(asList(fruit1, fruit2, fruit3),
hasItem(not(sweet())));
Готовые	
  инструменты	
  
Рубрика:	
  сделай	
  сам	
  
Дорога	
  к	
  матчерам	
  
	
  
Hamcrest	
  
22
Готовые	
  инструменты	
  
http://bit.ly/yamatcher	

Yandex-­‐qatools/matchers-­‐java	
  
Derari/cthul/Regexp	

Github, …	

… python, c#, php
23
Готовые	
  инструменты	
  
Yandex-­‐qatools/matchers-­‐java	
  
Webdriver-­‐matchers	
  
Collec^on-­‐matchers	
  
Matcher-­‐decorators	
  	
  
http://bit.ly/yamatcher
24
Href	
   Name	
  
Size	
  
Afr	
  
Alt	
  
Ac^on	
  
Title	
  
Id	
  
Type	
  
Src	
  Value	
  
Placeholder	
  
Classname	
  
Target	
  
Text	
  
Webdriver-­‐matchers	
  
http://bit.ly/yamatcher
Expected: Lists contains same items and
sorted equally
but:
(Not sorted correctly) [<2>]:
-> "Expected 3 on position [0], but was - 1"
-> "Expected 1 on position [2], but was - 3"
List<String> actual = asList("1", "2", "3");
List<String> expected = asList("3", "2", "1");
assertThat(actual, hasSameItemsAsList(expected)
.sameSorted());
CollecAon-­‐matchers	
  
http://bit.ly/yamatcher
// преддействие
assertThat(element,
should(exists()).after(pageRefresh(driver)));
// предпроверка
assertThat(element,
should(hasText("Text")).inCase(element, exists()));
// ожидание
assertThat(element, should(exists())
.whileWaitingUntil(timeoutHasExpired(SECONDS.toMillis(5))));
Matcher-­‐decorators	
  
http://bit.ly/yamatcher
assertThat(mailsList,
should(hasMailWithSubject("Subject"))
.after(pageRefresh(driver))
.whileWaitingUntil(timeoutHasExpired()
);
Matcher-­‐decorators	
  
http://bit.ly/yamatcher
Рубрика:	
  сделай	
  сам	
  
Дорога	
  к	
  матчерам	
  
	
  
Hamcrest	
  
Готовые	
  инструменты	
  
29
Рубрика: сделай сам
TypeSafeMatcher<T>	
  
FeatureMatcher<U,V>	
  
TypeSafeDiagnosingMatcher<T>	
  
30
// логика проверки
public boolean matchesSafely(T actual)!


!
// описание ожидаемого значения
public void describeTo(Description description)


!
// описание полученного значения
protected void describeMismatchSafely(T item,
Description mismatchDescription)


!
TypeSafeMatcher<T>
31
public static Matcher<Fruit> sweet() {
return new FeatureMatcher<Fruit, Boolean>(
is(true),
"fruit should be sweet",
"sweet -"
) {
@Override
protected Boolean featureValueOf(Fruit f) {
return fruit.isSweet();
}
};
}
!
FeatureMatcher<U,V>
Меркушев Кирилл
Инженер по автоматизации
тестирования
lanwen@yandex.ru
twitter.com/delnariel
http://bit.ly/yamatcher

Más contenido relacionado

Destacado

Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.jsВячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.jsYandex
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Yandex
 
Angie carolina barrera monzo
Angie carolina barrera monzoAngie carolina barrera monzo
Angie carolina barrera monzoMalena Barrera
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьYandex
 
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения..."Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...Yandex
 
"Securing eCommerce with Data Metrics". Corey Benninger, Etsy
"Securing eCommerce with Data Metrics". Corey Benninger, Etsy"Securing eCommerce with Data Metrics". Corey Benninger, Etsy
"Securing eCommerce with Data Metrics". Corey Benninger, EtsyYandex
 

Destacado (6)

Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.jsВячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
Вячеслав Олиянчук — Яндекс.Авто 2.0 на Node.js
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
 
Angie carolina barrera monzo
Angie carolina barrera monzoAngie carolina barrera monzo
Angie carolina barrera monzo
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. Асинхронность
 
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения..."Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...
"Быстрое обнаружение вредоносного ПО для Android с помощью машинного обучения...
 
"Securing eCommerce with Data Metrics". Corey Benninger, Etsy
"Securing eCommerce with Data Metrics". Corey Benninger, Etsy"Securing eCommerce with Data Metrics". Corey Benninger, Etsy
"Securing eCommerce with Data Metrics". Corey Benninger, Etsy
 

Más de Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

Más de Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Кирилл Меркушев — Матчеры: польза использования и легкость применения в ваших автотестах

  • 1. Меркушев Кирилл Инженер по автоматизации тестирования Я.Субботник, Минск, 31 августа Матчеры   польза использования и легкость применения в ваших автотестах  
  • 2. 2 Проблемы   «Спагетти»   тесты   Дублирование   кода   Сложности  оценки   результата  
  • 3. Дорога  к  матчерам     Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам  
  • 4. Дорога  к  матчерам   //assertTrue(); //assertFalse(); //assertEquals(); assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet());
  • 5. 5 Дорога  к  матчерам   //проверки log.info("Checking local"); FileAssert.assertFileNotExists(f1); FileAssert.assertFileExists(new_fl); FileAssert.assertIsDirectory(new_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); // ...
  • 6. 6 Дорога  к  матчерам   //проверки log.info("Checking local"); FileAssert.assertFileNotExists(f1); FileAssert.assertFileExists(new_fl); FileAssert.assertIsDirectory(new_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); DavAssert.assertResourceExists(turkishletters); DavAssert.assertResourceExists("İSTİKLAL MARŞI"); DavAssert.assertResourceExists("ı.txt"); DavAssert.assertResourceExists("i.txt"); DavAssert.assertResourceExists("ı"); // ...
  • 7. 7 Дорога  к  матчерам   //проверки log.info("Checking local"); FileAssert.assertFileNotExists(f1); FileAssert.assertFileExists(new_fl); FileAssert.assertIsDirectory(new_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertIsFile(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertFileContent(new File(new_fl.getAbsolutePath() + File.separator + "innerFile"), "qwerty".getBytes()); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerDir")); FileAssert.assertIsDirectory(new File(new_fl.getAbsolutePath() + File.separator + "innerDir")); DavAssert.assertResourceExists(turkishletters); DavAssert.assertResourceExists("İSTİKLAL MARŞI"); DavAssert.assertResourceExists("ı.txt"); DavAssert.assertResourceExists("i.txt"); DavAssert.assertResourceExists("ı"); DavAssert.assertResourceExists("i"); DavAssert.assertFileContent(turkishletters, content); DavAssert.assertFileContent("İSTİKLAL MARŞI", content); DavAssert.assertFileContent("ı.txt", content); DavAssert.assertFileContent("i.txt", content);
  • 8. @Test public void itShouldWork() { checkThatAllWorks(); } Дорога  к  матчерам  
  • 9. 9 Дорога  к  матчерам   сheckThatAllWorks(); //проверки log.info("Checking local"); FileAssert.assertFileNotExists(f1); FileAssert.assertFileExists(new_fl); FileAssert.assertIsDirectory(new_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertIsFile(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertFileContent(new File(new_fl.getAbsolutePath() + File.separator + "innerFile"), "qwerty".getBytes()); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerDir")); FileAssert.assertIsDirectory(new File(new_fl.getAbsolutePath() + File.separator + "innerDir")); DavAssert.assertResourceExists(turkishletters); DavAssert.assertResourceExists("İSTİKLAL MARŞI"); DavAssert.assertResourceExists("ı.txt"); DavAssert.assertResourceExists("i.txt"); DavAssert.assertResourceExists("ı"); DavAssert.assertResourceExists("i");
  • 10. @Test //1 @Test //2 Дорога  к  матчерам   //проверки log.info("Checking local"); FileAssert.assertFileNotExists(f1); FileAssert.assertFileExists(new_fl); FileAssert.assertIsDirectory(new_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertIsFile(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertFileContent(new File(new_fl.getAbsolutePath() + File.separator + "innerFile"), "qwerty".getBytes()); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerDir")); FileAssert.assertIsDirectory(new File(new_fl.getAbsolutePath() + File.separator + "innerDir")); DavAssert.assertResourceExists(turkishletters); DavAssert.assertResourceExists("İSTİKLAL MARŞI"); +   FileAssert.assertFileContent(new File(new_fl.getAbsolutePath() + File.separator + "innerFile"), "qwerty".getBytes()); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerDir")); DavAssert.assertResourceExists(turkishletters); DavAssert.assertResourceExists("İSTİKLAL MARŞI");
  • 11. @Test public void itShouldWorkToday1() { checkThatAllWorksToday1(); } @Test public void itShouldWorkToday2() { checkThatAllWorksToday2(); } @Test public void itShouldWorkToday3() { checkThatAllWorksToday3(); checkThatAllWorksToday4(); } Дорога  к  матчерам   //проверки log.info("Checking local"); FileAssert.assertFileNotExists( f1); FileAssert.assertFileExists(new _fl); FileAssert.assertIsDirectory(ne w_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertIsFile(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertFileContent(ne w File(new_fl.getAbsolutePath() + File.separator + //проверки log.info("Checking local"); FileAssert.assertFileNotExists( f1); FileAssert.assertFileExists(new _fl); FileAssert.assertIsDirectory(ne w_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertIsFile(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertFileContent(ne w File(new_fl.getAbsolutePath() + File.separator + //проверки log.info("Checking local"); FileAssert.assertFileNotExists( f1); FileAssert.assertFileExists(new _fl); FileAssert.assertIsDirectory(ne w_fl); FileAssert.assertFileExists(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertIsFile(new File(new_fl.getAbsolutePath() + File.separator + "innerFile")); FileAssert.assertFileContent(ne w File(new_fl.getAbsolutePath() + File.separator +
  • 14. 14 Дорога  к  матчерам   {Проверка}   {Проверка}   {Проверка}   … AND,    OR,    NOT  
  • 15. assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet() ); Дорога  к  матчерам   Матчер   {Описание,  Логика}  
  • 16. 16 Дорога  к  матчерам   assertThat   JUnit Объект   Матчер   select   Lambdaj assumeThat   JUnit …
  • 17. Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам   Дорога  к  матчерам    
  • 19. assertTrue("Fruit should be sweet", fruit.isSweet()); assertEquals("Fruit should be round", Shape.ROUND, fruit.getShape()); assertEquals("Fruit should be orange", Color.ORANGE, fruit.getColor()); Hamcrest   assertThat( fruit, both(round()).and(sweet()).and(hasColor(Color.ORANGE)) );
  • 20. assertTrue("Fruit1 should be sweet", fruit1.isSweet()); assertTrue("Fruit2 should be sweet", fruit2.isSweet()); assertTrue("Fruit3 should be sweet", fruit3.isSweet()); Hamcrest   assertThat(asList(fruit1, fruit2, fruit3), everyItem(is(sweet()))); // или assertThat(asList(fruit1, fruit2, fruit3), hasItem(not(sweet())));
  • 21. Готовые  инструменты   Рубрика:  сделай  сам   Дорога  к  матчерам     Hamcrest  
  • 23. 23 Готовые  инструменты   Yandex-­‐qatools/matchers-­‐java   Webdriver-­‐matchers   Collec^on-­‐matchers   Matcher-­‐decorators     http://bit.ly/yamatcher
  • 24. 24 Href   Name   Size   Afr   Alt   Ac^on   Title   Id   Type   Src  Value   Placeholder   Classname   Target   Text   Webdriver-­‐matchers   http://bit.ly/yamatcher
  • 25. Expected: Lists contains same items and sorted equally but: (Not sorted correctly) [<2>]: -> "Expected 3 on position [0], but was - 1" -> "Expected 1 on position [2], but was - 3" List<String> actual = asList("1", "2", "3"); List<String> expected = asList("3", "2", "1"); assertThat(actual, hasSameItemsAsList(expected) .sameSorted()); CollecAon-­‐matchers   http://bit.ly/yamatcher
  • 26. // преддействие assertThat(element, should(exists()).after(pageRefresh(driver))); // предпроверка assertThat(element, should(hasText("Text")).inCase(element, exists())); // ожидание assertThat(element, should(exists()) .whileWaitingUntil(timeoutHasExpired(SECONDS.toMillis(5)))); Matcher-­‐decorators   http://bit.ly/yamatcher
  • 28. Рубрика:  сделай  сам   Дорога  к  матчерам     Hamcrest   Готовые  инструменты  
  • 29. 29 Рубрика: сделай сам TypeSafeMatcher<T>   FeatureMatcher<U,V>   TypeSafeDiagnosingMatcher<T>  
  • 30. 30 // логика проверки public boolean matchesSafely(T actual)! 
 ! // описание ожидаемого значения public void describeTo(Description description) 
 ! // описание полученного значения protected void describeMismatchSafely(T item, Description mismatchDescription) 
 ! TypeSafeMatcher<T>
  • 31. 31 public static Matcher<Fruit> sweet() { return new FeatureMatcher<Fruit, Boolean>( is(true), "fruit should be sweet", "sweet -" ) { @Override protected Boolean featureValueOf(Fruit f) { return fruit.isSweet(); } }; } ! FeatureMatcher<U,V>
  • 32. Меркушев Кирилл Инженер по автоматизации тестирования lanwen@yandex.ru twitter.com/delnariel http://bit.ly/yamatcher