Projeto de exemplo para implementação de testes para API's GraphQL utilizando o Karate DSL.
- KARATE
- url
- def
- read
- request
- method
- status
- match
- response
- text (mais importante neste contexto)
- JAVA
- Faker
- JUnit4
.
├── src
│ └── test
│ └── java
│ ├── pokeapi
│ │ ├── java
│ │ │ ├── BaseRunner.java
│ │ │ └── PokemonFaker.java
| | ├── queries
| | | ├── charmander-pokemon-only-name.graphql
| | | ├── pikachu-pokemon-and-attacks.graphql
| | | ├── pokemon-and-attacks-by-name.graphql
| | | ├── pokemon-full-data.graphql
│ │ │ └── pokemon-only-name-by-id.graphql
│ │ ├── PokeApiTest.java
│ │ ├── Pokemon.feature
│ │ ├── pokemon-contract.json
│ │ └── pokemon-full-data-contract.json
│ ├── karate-config.js
│ └── logback-test.xml
├── README.md
└── pom.xml
Considerando este contexto, onde o objetivo é testar uma API GraphQL, os principais arquivos e pacotes são: Pokemon.feature e queries (onde encontramos todas as consultas).
No arquivo Pokemon.feature temos a implementação dos testes, assim como as devidas validações de status, contrato e regras de negócio. Veja um exemplo:
Scenario Outline: Validar pokemon <pokemon_nome>
Given def query = read('classpath:pokeapi/queries/pokemon-and-attacks-by-name.graphql')
And def variables = { name: '<pokemon_nome>' }
And request { query: '#(query)', variables: '#(variables)' }
When method post
Then status 200
And match $.data.pokemon.name == '<pokemon_nome>'
* print 'response:', response
Examples:
|pokemon_nome|
|Pikachu |
|Charmander |
|Squirtle |
|Charizard |
Como visto no exemplo acima, para permitir o reaproveitamento de código, salvamos as queries em arquivos externos e referenciamos estes durante o teste utilizando os comandos def & read. No exemplo, o arquivo com a query é o pokemon-and-attacks-by-name.graphql:
query PokemonAndAttacks($name: String) {
pokemon(name: $name) {
id
number
name
attacks {
special {
name
type
damage
}
}
}
}
Nos demais arquivos temos implementações auxiliares, como: funções comuns para execução e geração de relatórios, geração de nomes de pokemons de forma aleatória, contrato de api utilizado para asserções durante o teste e arquivos de configurações do Karate DSL.