Матчеры	
  

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

Меркушев Кирилл
Инженер п...
37544	


2
37544	


3
37544	

Сложности	

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

4
Хватит	
  это	
  терпеть!	
  
5
Дорога	
  к	
  матчерам	
  
	
  

Hamcrest	
  
Готовые	
  инструменты	
  
Рубрика:	
  сделай	
  сам	
  
Дорога	
  к	
  матчерам	
  

//assertTrue();
//assertFalse();
//assertEquals();
assertTrue(
"Fruit should be sweet - expec...
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFi...
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFi...
Дорога	
  к	
  матчерам	
  
//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAssert.assertFi...
Дорога	
  к	
  матчерам	
  
@Test
public void itShouldWork() {
checkThatAllWorks();
}
Дорога	
  к	
  матчерам	
  
сheckThatAllWorks();	

//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f...
Дорога	
  к	
  матчерам	
  
@Test //1

//проверки
log.info("Checking local");
FileAssert.assertFileNotExists(f1);
FileAsse...
Дорога	
  к	
  матчерам	
  
@Test
public void
itShouldWorkToday1() {
checkThatAllWorksToday1();
}
@Test
public void
itShou...
Дорога	
  к	
  матчерам	
  

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

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

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

{Проверка}	
  
17

AND,	
  	
  OR,	
  	
  NOT	
  
Дорога	
  к	
  матчерам	
  
assertTrue(
"Fruit should be sweet - expected TRUE", fruit.isSweet()

);

{Описание,	
  Логика...
Дорога	
  к	
  матчерам	
  

assertThat	
  
JUnit	


assumeThat	
  
JUnit	


…	

select	
  
19

Lambdaj	


Объект	
  

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

	
  

Hamcrest	
  

Готовые	
  инструменты	
  
Рубрика:	
  сделай	
  сам	
  
Hamcrest	
  
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</d...
Hamcrest	
  
assertTrue("Fruit should be sweet", fruit.isSweet());
assertEquals("Fruit should be round",
Shape.ROUND, frui...
Hamcrest	
  
assertTrue("Fruit1 should be sweet", fruit1.isSweet());
assertTrue("Fruit2 should be sweet", fruit2.isSweet()...
Дорога	
  к	
  матчерам	
  

	
  
Hamcrest	
  

Готовые	
  инструменты	
  
Рубрика:	
  сделай	
  сам	
  
Готовые	
  инструменты	
  

Yandex-­‐qatools/matchers-­‐java	
  
http://bit.ly/yamatcher	


Derari/cthul/Regexp	

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

Yandex-­‐qatools/matchers-­‐java	
  
Webdriver-­‐matchers	
  
Collec^on-­‐matchers	
  
Matcher...
Webdriver-­‐matchers	
  

Href	
  

Name	
  

Afr	
  

27

Type	
  

Ac^on	
  

Placeholder	
  

Size	
  

Classname	
  

...
CollecAon-­‐matchers	
  
List<String> actual = asList("1", "2", "3");
List<String> expected = asList("3", "2", "1");
asser...
Matcher-­‐decorators	
  
// ожидание
assertThat(element, should(exists())
.whileWaitingUntil(timeoutHasExpired(SECONDS.toM...
Matcher-­‐decorators	
  
assertThat(mailsList,
should(hasMailWithSubject("Subject"))
.after(pageRefresh(driver))
.whileWai...
Дорога	
  к	
  матчерам	
  

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

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

TypeSafeMatcher<T>	
  
FeatureMatcher<U,V>	
  
TypeSafeDiagnosingMatcher<T>	
  
32
TypeSafeMatcher<T>	

// логика проверки
public boolean matchesSafely(T actual)!


!
// описание ожидаемого значения
public...
FeatureMatcher<U,V>	

public static Matcher<Fruit> sweet() {
return new FeatureMatcher<Fruit, Boolean>(
is(true),
"fruit s...
Меркушев Кирилл
Инженер по автоматизации
тестирования

lanwen@yandex.ru

twitter.com/delnariel
http://bit.ly/yamatcher
Upcoming SlideShare
Loading in …5
×

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

1,060 views

Published on

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

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,060
On SlideShare
0
From Embeds
0
Number of Embeds
665
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Матчеры   маленький  шаг  для  вас  и  огромный   для  ваших  автотестов   Меркушев Кирилл Инженер по автоматизации тестирования Тестовая среда, СПб, 30 ноября 2013
  2. 2. 37544 2
  3. 3. 37544 3
  4. 4. 37544 Сложности при оценке результатов 4
  5. 5. Хватит  это  терпеть!   5
  6. 6. Дорога  к  матчерам     Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам  
  7. 7. Дорога  к  матчерам   //assertTrue(); //assertFalse(); //assertEquals(); assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet());
  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")); // ... 8
  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("ı"); // ... 9
  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); 10
  11. 11. Дорога  к  матчерам   @Test public void itShouldWork() { checkThatAllWorks(); }
  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"); 12
  13. 13. Дорога  к  матчерам   @Test //1 //проверки 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"); @Test //2 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");
  14. 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(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 +
  15. 15. Дорога  к  матчерам   15
  16. 16. Дорога  к  матчерам   16
  17. 17. Дорога  к  матчерам   {Проверка}   {Проверка}   … {Проверка}   17 AND,    OR,    NOT  
  18. 18. Дорога  к  матчерам   assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet() ); {Описание,  Логика}   Матчер  
  19. 19. Дорога  к  матчерам   assertThat   JUnit assumeThat   JUnit … select   19 Lambdaj Объект   Матчер  
  20. 20. Дорога  к  матчерам     Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам  
  21. 21. Hamcrest   <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> </dependency>
  22. 22. Hamcrest   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()); assertThat( fruit, both(round()).and(sweet()).and(hasColor(Color.ORANGE)) );
  23. 23. Hamcrest   assertTrue("Fruit1 should be sweet", fruit1.isSweet()); assertTrue("Fruit2 should be sweet", fruit2.isSweet()); assertTrue("Fruit3 should be sweet", fruit3.isSweet()); assertThat(asList(fruit1, fruit2, fruit3), everyItem(is(sweet()))); // или assertThat(asList(fruit1, fruit2, fruit3), hasItem(not(sweet())));
  24. 24. Дорога  к  матчерам     Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам  
  25. 25. Готовые  инструменты   Yandex-­‐qatools/matchers-­‐java   http://bit.ly/yamatcher Derari/cthul/Regexp Github, … … python, c#, php 25
  26. 26. Готовые  инструменты   Yandex-­‐qatools/matchers-­‐java   Webdriver-­‐matchers   Collec^on-­‐matchers   Matcher-­‐decorators     26 http://bit.ly/yamatcher
  27. 27. Webdriver-­‐matchers   Href   Name   Afr   27 Type   Ac^on   Placeholder   Size   Classname   Target   Alt   Id   Title   Value   Text   Src   http://bit.ly/yamatcher
  28. 28. CollecAon-­‐matchers   List<String> actual = asList("1", "2", "3"); List<String> expected = asList("3", "2", "1"); assertThat(actual, hasSameItemsAsList(expected) .sameSorted()); 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" http://bit.ly/yamatcher
  29. 29. Matcher-­‐decorators   // ожидание assertThat(element, should(exists()) .whileWaitingUntil(timeoutHasExpired(SECONDS.toMillis(5)))); // преддействие assertThat(element, should(exists()).after(pageRefresh(driver))); // предпроверка assertThat(element, should(hasText("Text")).inCase(element, exists())); http://bit.ly/yamatcher
  30. 30. Matcher-­‐decorators   assertThat(mailsList, should(hasMailWithSubject("Subject")) .after(pageRefresh(driver)) .whileWaitingUntil(timeoutHasExpired() ); http://bit.ly/yamatcher
  31. 31. Дорога  к  матчерам     Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам  
  32. 32. Рубрика: сделай сам TypeSafeMatcher<T>   FeatureMatcher<U,V>   TypeSafeDiagnosingMatcher<T>   32
  33. 33. TypeSafeMatcher<T> // логика проверки public boolean matchesSafely(T actual)! 
 ! // описание ожидаемого значения public void describeTo(Description description) 
 ! // описание полученного значения protected void describeMismatchSafely(T item, Description mismatchDescription) 
 ! 33
  34. 34. FeatureMatcher<U,V> 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(); } }; } ! 34
  35. 35. Меркушев Кирилл Инженер по автоматизации тестирования lanwen@yandex.ru twitter.com/delnariel http://bit.ly/yamatcher

×