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.
Киев 2016
Первый в Украине фестиваль тестирования
Spock + Groovy
и чуть-чуть REST API
Ярослав Пернеровський
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 2016
SoapUI
Делаем жизнь проще: Spock + Groovy
Киев 2016
Java
RESTAssured
TestNG
Maven
Делаем жизнь проще: Spock + Groovy
Киев 2016
Groovy
RESTAssured
TestNG
Maven
Делаем жизнь проще: Spock + Groovy
Киев 2016
Groovy
RESTAssured
Spock
Maven
Делаем жизнь проще: Spock + Groovy
Киев 2016
Groovy
RESTClient
Spock
Maven
Делаем жизнь проще: Spock + Groovy
Киев 2016
Groovy
RESTClient
Spock
Maven
Делаем жизнь проще: Spock + Groovy
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 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 ...
Киев 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...
Киев 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:
...
Киев 2016
def name = 'QAFest'
def greeting = "Hello ${name}"
assert greeting.toString() == 'Hello QAFest'
def multiLineStr...
Киев 2016
def slurper = new groovy.json.JsonSlurper()
def result = slurper.parseText('''
{"conf":{"name":"QAFest","year":2...
Киев 2016
def xml = new XmlSlurper().parseText('''
<root>
<one a1="uno!"/>
<two>Some text!</two>
</root>
''')
assert xml.n...
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 2016
Testing
Framework
BDD
Specificatio
n
Mocking
Framework
Делаем жизнь проще: Spock + Groovy
Киев 2016
import spock.lang.*
class MyTestSpecification extends Specification {
// fields
// fixture methods
// feature me...
Киев 2016
Fields
def obj = new FirstClassObject()
def coll = new Collaborator()
@Shared res = new SharedResource()
Делаем ...
Киев 2016
Fixsture Methods
def setup() {}
//run before every feature method
def cleanup() {}
//run after every feature met...
Киев 2016
Feature Methods
def "user can login into app"() {
// blocks go here
}
Делаем жизнь проще: Spock + Groovy
Киев 2016
Blocks
• Нaстройка параметров теста (Setup)
• Выполнение воздействия на систему (Stimulus)
• Описание ожидаемого...
Киев 2016
setup:
when:
then:
expect:
cleanup:
where:
Setup
Stimulus
Response
Cleanup
Делаем жизнь проще: Spock + Groovy
Киев 2016
when:
def x = Math.max(1, 2)
then:
x == 2
expect:
Math.max(1, 2) == 2
Делаем жизнь проще: Spock + Groovy
Киев 2016
class DatabaseDrivenSpec extends Specification {
@Shared sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver")
...
Киев 2016
class DataDriven extends Specification {
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a |...
Киев 2016
@Stepwise
class StepwiseExtensionSpec extends Specification {
def "step 1"() {
expect: true
}
def "step 2"() {
e...
Киев 2016
@Ignore
class MySpec extends Specification { ... }
@IgnoreIf({ os.windows })
def "Везде, но не на винде"() { ......
Киев 2016
@Title("This is easy to read")
class ThisIsHarderToReadSpec extends
Specification { ... }
@Narrative("""
As a us...
Киев 2016
@Issue("http://my.jira/SP-1002")
class MySpec extends Specification {
@Issue("SP-1311")
def "Something wrong has...
Киев 2016Делаем жизнь проще: Spock + Groovy
Киев 2016
Спасибо!
Делаем жизнь проще: Spock + Groovy
Киев 2016
Groovy http://groovy-lang.org/documentation.html
Spock http://spockframework.org/spock/docs/1.1-rc-2/all_in_one....
Upcoming SlideShare
Loading in …5
×

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

404 views

Published on

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

Published in: Education
  • Be the first to comment

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 Что почитать

×