35
Меркушев Кирилл Инженер по автоматизации тестирования Тестовая среда, СПб, 30 ноября 2013 Матчеры маленький шаг для вас и огромный для ваших автотестов

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

  • Upload
    yandex

  • View
    815

  • Download
    0

Embed Size (px)

DESCRIPTION

Эта замечательная технология почему-то до сих пор не очень популярна и, более того, не всем известна. Между тем за время своего существования она стала почти синонимом к выражению «лёгкая поддержка и развитие автотестов». Я хочу рассказать о том, что представляет из себя эта технология, обобщить знания о ней и поделиться готовыми решениями из нашей библиотеки матчеров.

Citation preview

Page 1: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Меркушев Кирилл Инженер по автоматизации тестирования Тестовая среда, СПб, 30 ноября 2013

Матчеры  маленький  шаг  для  вас  и  огромный  для  ваших  автотестов  

Page 2: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

2

37544

Page 3: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

3

37544

Page 4: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

4

37544

Сложности при оценке результатов

Page 5: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

5

Хватит  это  терпеть!  

Page 6: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Дорога  к  матчерам    

Hamcrest  

Готовые  инструменты  

Рубрика:  сделай  сам  

Page 7: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Дорога  к  матчерам  

//assertTrue(); //assertFalse(); //assertEquals(); assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet());

Page 8: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

8

Дорога  к  матчерам  

//проверки 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")); // ...

Page 9: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

9

Дорога  к  матчерам  //проверки 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("ı"); // ...

Page 10: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

10

Дорога  к  матчерам  //проверки 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);

Page 11: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

@Test public void itShouldWork() { checkThatAllWorks();

}

Дорога  к  матчерам  

Page 12: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

12

Дорога  к  матчерам  

с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");

Page 13: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

@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");

Page 14: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

@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(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 +

//проверки 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 +

//проверки 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 +

Page 15: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

15

Дорога  к  матчерам  

Page 16: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

16

Дорога  к  матчерам  

Page 17: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

17

Дорога  к  матчерам  

{Проверка}  {Проверка}  

{Проверка}  …

AND,    OR,    NOT  

Page 18: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet()

);

Дорога  к  матчерам  

Матчер  {Описание,  Логика}  

Page 19: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

19

Дорога  к  матчерам  

assertThat  JUnit

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

select  Lambdaj

assumeThat  JUnit

Page 20: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Hamcrest  

Готовые  инструменты  

Рубрика:  сделай  сам  

Дорога  к  матчерам  

 

Page 21: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Hamcrest  

<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> </dependency>

Page 22: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

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))

);

Page 23: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

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())));

Page 24: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Готовые  инструменты  

Рубрика:  сделай  сам  

Дорога  к  матчерам  

 Hamcrest  

Page 25: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

25

Готовые  инструменты  

http://bit.ly/yamatcher

Yandex-­‐qatools/matchers-­‐java  

Derari/cthul/Regexp

Github, …

… python, c#, php

Page 26: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

26

Готовые  инструменты  

Yandex-­‐qatools/matchers-­‐java  

Webdriver-­‐matchers  

Collec^on-­‐matchers  

Matcher-­‐decorators    

http://bit.ly/yamatcher

Page 27: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

27

Href   Name  

Size  

Afr  Alt  

Ac^on  

Title  Id  

Type  

Src  Value  

Placeholder  

Classname  

Target  

Text  

Webdriver-­‐matchers  

http://bit.ly/yamatcher

Page 28: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

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

Page 29: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

// преддействие 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

Page 30: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

assertThat(mailsList, should(hasMailWithSubject("Subject")) .after(pageRefresh(driver)) .whileWaitingUntil(timeoutHasExpired());

Matcher-­‐decorators  

http://bit.ly/yamatcher

Page 31: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Рубрика:  сделай  сам  

Дорога  к  матчерам  

 Hamcrest  

Готовые  инструменты  

Page 32: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

32

Рубрика: сделай сам

TypeSafeMatcher<T>  

FeatureMatcher<U,V>  

TypeSafeDiagnosingMatcher<T>  

Page 33: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

33

// логика проверки public boolean matchesSafely(T actual)!!// описание ожидаемого значения public void describeTo(Description description) !

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

TypeSafeMatcher<T>

Page 34: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

34

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>

Page 35: Кирилл Меркушев: Матчеры: маленький шаг для вас и огромный для ваших автотестов

Меркушев Кирилл

Инженер по автоматизации тестирования

[email protected]

twitter.com/delnariel http://bit.ly/yamatcher