Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,192 views

Published on

Сама по себе технология матчеров не нова: в нынешнем виде она была залита в репозиторий в июле 2012 года, а появилась и того раньше. Но, несмотря на это, многие о ней до сих пор не слышали или почему-то избегают. В докладе рассказано о преимуществах этой технологии и представлена наша библиотека матчеров.

Published in: Technology, Education
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Меркушев Кирилл Инженер по автоматизации тестирования Я.Субботник, Минск, 31 августа Матчеры   польза использования и легкость применения в ваших автотестах  
  2. 2. 2 Проблемы   «Спагетти»   тесты   Дублирование   кода   Сложности  оценки   результата  
  3. 3. Дорога  к  матчерам     Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам  
  4. 4. Дорога  к  матчерам   //assertTrue(); //assertFalse(); //assertEquals(); assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet());
  5. 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. 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. 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. 8. @Test public void itShouldWork() { checkThatAllWorks(); } Дорога  к  матчерам  
  9. 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. 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. 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 +
  12. 12. 12 Дорога  к  матчерам  
  13. 13. 13 Дорога  к  матчерам  
  14. 14. 14 Дорога  к  матчерам   {Проверка}   {Проверка}   {Проверка}   … AND,    OR,    NOT  
  15. 15. assertTrue( "Fruit should be sweet - expected TRUE", fruit.isSweet() ); Дорога  к  матчерам   Матчер   {Описание,  Логика}  
  16. 16. 16 Дорога  к  матчерам   assertThat   JUnit Объект   Матчер   select   Lambdaj assumeThat   JUnit …
  17. 17. Hamcrest   Готовые  инструменты   Рубрика:  сделай  сам   Дорога  к  матчерам    
  18. 18. Hamcrest   <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> </dependency>
  19. 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. 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. 21. Готовые  инструменты   Рубрика:  сделай  сам   Дорога  к  матчерам     Hamcrest  
  22. 22. 22 Готовые  инструменты   http://bit.ly/yamatcher Yandex-­‐qatools/matchers-­‐java   Derari/cthul/Regexp Github, … … python, c#, php
  23. 23. 23 Готовые  инструменты   Yandex-­‐qatools/matchers-­‐java   Webdriver-­‐matchers   Collec^on-­‐matchers   Matcher-­‐decorators     http://bit.ly/yamatcher
  24. 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. 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. 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
  27. 27. assertThat(mailsList, should(hasMailWithSubject("Subject")) .after(pageRefresh(driver)) .whileWaitingUntil(timeoutHasExpired() ); Matcher-­‐decorators   http://bit.ly/yamatcher
  28. 28. Рубрика:  сделай  сам   Дорога  к  матчерам     Hamcrest   Готовые  инструменты  
  29. 29. 29 Рубрика: сделай сам TypeSafeMatcher<T>   FeatureMatcher<U,V>   TypeSafeDiagnosingMatcher<T>  
  30. 30. 30 // логика проверки public boolean matchesSafely(T actual)! 
 ! // описание ожидаемого значения public void describeTo(Description description) 
 ! // описание полученного значения protected void describeMismatchSafely(T item, Description mismatchDescription) 
 ! TypeSafeMatcher<T>
  31. 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. 32. Меркушев Кирилл Инженер по автоматизации тестирования lanwen@yandex.ru twitter.com/delnariel http://bit.ly/yamatcher

×