Successfully reported this slideshow.

QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тестирования REST API с использованием Groovy+Spock.

2

Share

Upcoming SlideShare
Crawler 2
Crawler 2
Loading in …3
×
1 of 37
1 of 37

QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тестирования REST API с использованием Groovy+Spock.

2

Share

Традиционно, на проектах где back-end писан на Java, фреймворк тестирования тоже строится на технологиях Java. С одной стороны это оправдано единообразием и уже готовым тулсетом у разработчиков. Но с другой стороны немного усложняет вход в автоматизацию для тестировщиков, не знакомых с тонкостями Java. Новичкам, конечно, можно посоветовать более простые для понимания варианты написания тестов на Ruby или Python, но это уже совсем другой мир, и совсем другой геморрой для DevOps. Очень неплохим вариантом в такой ситуации мне видится использование языка программирования Groovy в паре с тест фреймворком Spock. Эта связка позволяет писать понятные REST API тесты на базе уже существующей Java инфраструктуры.
В докладе на примерах посмотрим как это сделать и попытаемся для себя понять есть ли у такого подхода будущее или это просто баловство для ленивых.

Традиционно, на проектах где back-end писан на Java, фреймворк тестирования тоже строится на технологиях Java. С одной стороны это оправдано единообразием и уже готовым тулсетом у разработчиков. Но с другой стороны немного усложняет вход в автоматизацию для тестировщиков, не знакомых с тонкостями Java. Новичкам, конечно, можно посоветовать более простые для понимания варианты написания тестов на Ruby или Python, но это уже совсем другой мир, и совсем другой геморрой для DevOps. Очень неплохим вариантом в такой ситуации мне видится использование языка программирования Groovy в паре с тест фреймворком Spock. Эта связка позволяет писать понятные REST API тесты на базе уже существующей Java инфраструктуры.
В докладе на примерах посмотрим как это сделать и попытаемся для себя понять есть ли у такого подхода будущее или это просто баловство для ленивых.

More Related Content

More from QAFest

Related Books

Free with a 14 day trial from Scribd

See all

QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тестирования REST API с использованием Groovy+Spock.

  1. 1. Киев 2016 Первый в Украине фестиваль тестирования Spock + Groovy и чуть-чуть REST API Ярослав Пернеровський
  2. 2. Киев 2016Делаем жизнь проще: Spock + Groovy
  3. 3. Киев 2016Делаем жизнь проще: Spock + Groovy
  4. 4. Киев 2016Делаем жизнь проще: Spock + Groovy
  5. 5. Киев 2016Делаем жизнь проще: Spock + Groovy
  6. 6. Киев 2016Делаем жизнь проще: Spock + Groovy
  7. 7. Киев 2016 SoapUI Делаем жизнь проще: Spock + Groovy
  8. 8. Киев 2016 Java RESTAssured TestNG Maven Делаем жизнь проще: Spock + Groovy
  9. 9. Киев 2016 Groovy RESTAssured TestNG Maven Делаем жизнь проще: Spock + Groovy
  10. 10. Киев 2016 Groovy RESTAssured Spock Maven Делаем жизнь проще: Spock + Groovy
  11. 11. Киев 2016 Groovy RESTClient Spock Maven Делаем жизнь проще: Spock + Groovy
  12. 12. Киев 2016 Groovy RESTClient Spock Maven Делаем жизнь проще: Spock + Groovy
  13. 13. Киев 2016Делаем жизнь проще: Spock + Groovy
  14. 14. Киев 2016 def (a, b, c) = [10, 20, 'foo'] def nums = [1, 3, 5] def a, b, c (a, b, c) = nums def (day, month, year) = "1st November 2016".split() Делаем жизнь проще: Spock + Groovy
  15. 15. Киев 2016 for ( i in 0..9 ) {} for ( i in [0, 1, 5, 6, 15] ) {} def map = ['abc':1, 'def':2, 'xyz':3] def x = 0 for ( e in map ) { x += e.value } Делаем жизнь проще: Spock + Groovy
  16. 16. Киев 2016 def (x, y, z) = [2, 7, 5 ] def calc = { a,b -> a*b+1 } assert calc(x,y) == [x,z].sum() Condition not satisfied: calc(x,y) == [x,z].sum() | | | | | | | 15 2 7 | 2 5 7 false Делаем жизнь проще: Spock + Groovy
  17. 17. Киев 2016 def name = 'QAFest' def greeting = "Hello ${name}" assert greeting.toString() == 'Hello QAFest' def multiLineString = ''' line one line two line three ''' println "---+" * 5 + "---" ---+---+---+---+---+--- Делаем жизнь проще: Spock + Groovy
  18. 18. Киев 2016 def slurper = new groovy.json.JsonSlurper() def result = slurper.parseText(''' {"conf":{"name":"QAFest","year":2016, "tracks":["junior", "main"]}} ''') assert result.conf.name == 'QAFest' assert result.conf.year == 2016 assert result.conf.tracks.size() == 2 assert result.conf.tracks[0] == 'junior' assert result.conf.tracks[1] == 'main' Делаем жизнь проще: Spock + Groovy
  19. 19. Киев 2016 def xml = new XmlSlurper().parseText(''' <root> <one a1="uno!"/> <two>Some text!</two> </root> ''') assert xml.name() == 'root' assert xml.one[0].@a1 == 'uno!' assert xml.two.text() == 'Some text!' xml.children().each{ assert it.name() in ['one','two'] } Делаем жизнь проще: Spock + Groovy
  20. 20. Киев 2016Делаем жизнь проще: Spock + Groovy
  21. 21. Киев 2016 Testing Framework BDD Specificatio n Mocking Framework Делаем жизнь проще: Spock + Groovy
  22. 22. Киев 2016 import spock.lang.* class MyTestSpecification extends Specification { // fields // fixture methods // feature methods // helper methods } Делаем жизнь проще: Spock + Groovy
  23. 23. Киев 2016 Fields def obj = new FirstClassObject() def coll = new Collaborator() @Shared res = new SharedResource() Делаем жизнь проще: Spock + Groovy
  24. 24. Киев 2016 Fixsture Methods def setup() {} //run before every feature method def cleanup() {} //run after every feature method def setupSpec() {} //run before the first feature method def cleanupSpec() {} //run after the last feature method Делаем жизнь проще: Spock + Groovy
  25. 25. Киев 2016 Feature Methods def "user can login into app"() { // blocks go here } Делаем жизнь проще: Spock + Groovy
  26. 26. Киев 2016 Blocks • Нaстройка параметров теста (Setup) • Выполнение воздействия на систему (Stimulus) • Описание ожидаемого ответа системы (Response) • Очистка после теста (Cleanup) Делаем жизнь проще: Spock + Groovy
  27. 27. Киев 2016 setup: when: then: expect: cleanup: where: Setup Stimulus Response Cleanup Делаем жизнь проще: Spock + Groovy
  28. 28. Киев 2016 when: def x = Math.max(1, 2) then: x == 2 expect: Math.max(1, 2) == 2 Делаем жизнь проще: Spock + Groovy
  29. 29. Киев 2016 class DatabaseDrivenSpec extends Specification { @Shared sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver") def setupSpec() { sql.execute("create table maxdata (a int,b int,c int)") sql.execute("insert into maxdata values (2,7,7),(5,4,5),(9,9,9)") } def "maximum of two numbers"() { expect: Math.max(a, b) == c where: [a, b, c] << sql.rows("select a,b,c from maxdata") } } Делаем жизнь проще: Spock + Groovy
  30. 30. Киев 2016 class DataDriven extends Specification { def "maximum of two numbers"() { expect: Math.max(a, b) == c where: a | b || c 3 | 5 || 5 7 | 0 || 7 0 | 0 || 0 } } Делаем жизнь проще: Spock + Groovy
  31. 31. Киев 2016 @Stepwise class StepwiseExtensionSpec extends Specification { def "step 1"() { expect: true } def "step 2"() { expect: true } def "step 3"() { expect: true } } Делаем жизнь проще: Spock + Groovy
  32. 32. Киев 2016 @Ignore class MySpec extends Specification { ... } @IgnoreIf({ os.windows }) def "Везде, но не на винде"() { ... } @Requires({ os.windows }) def "Люблю Windows"() { ... } @Timeout(value = 5, unit = MINUTES) def "Ушла на 5 минут"() { ... } Делаем жизнь проще: Spock + Groovy
  33. 33. Киев 2016 @Title("This is easy to read") class ThisIsHarderToReadSpec extends Specification { ... } @Narrative(""" As a user I want drink So go bar """) class HelpUserToGetToTheBar () { ... }
  34. 34. Киев 2016 @Issue("http://my.jira/SP-1002") class MySpec extends Specification { @Issue("SP-1311") def "Something wrong has happened"() { ... } @Issue(["SP-1911", "FO-3334"]) def "Then I have two related issues"() { ... } }
  35. 35. Киев 2016Делаем жизнь проще: Spock + Groovy
  36. 36. Киев 2016 Спасибо! Делаем жизнь проще: Spock + Groovy
  37. 37. Киев 2016 Groovy http://groovy-lang.org/documentation.html Spock http://spockframework.org/spock/docs/1.1-rc-2/all_in_one.html RESTClient https://github.com/jgritman/httpbuilder/wiki/RESTClient Allure http://allure.qatools.ru/ SoapUI https://www.soapui.org/downloads/soapui.html RESTful http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm HTTP RFC https://tools.ietf.org/html/rfc2616#section-5 JSON HAL https://tools.ietf.org/id/draft-kelly-json-hal-03.txt Делаем жизнь проще: Spock + Groovy Что почитать

Editor's Notes

  • Приветствие
    Зовут
    Занимаюсь
    Кто вы ?
    Поговорим об некоторых инструментах автоматизации тестирования АПИ

    Где это ?
  • Что такое REST API зачем и когда нам надо его тестировать?
    Спросить про то, стоит ли рассказать про это или и так все понятно?
     Roy Fielding), одним из создателей протокола «HTTP»,

    REST архитектурный стиль взаимодействия компонентов распределённого приложения в сети.
    Representational State Transfer (REST)
  • С точки зрения тестировщика тестирование Рест это - слать реквесты и анализировать респонсы
    Рассмотрим что сабой являет запрос
    это НТТР который специфицорован под контекст общения
    джсон

    Для тестирования через рест нам нужно уметь :

    слать/получать НТТР сообщения
    парсить JSON, XML
  • Change pic!
  • switch / case for any type
  • Expected 7 actual 15

    http://meetspock.appspot.com/
  • interpolated 
  • Parsing Json XML
  • http://meetspock.appspot.com/
  • Interaction Based Testing Data Driven Testing
  • Фазы
  • RESTClient has convenience methods for get, put post delete, head
    The response data is always parsed and buffered in-memory
    The returned HttpResponseDecorator instance gives convenient access to headers and the parsed response data
  • ×