Aller au contenu principal

Tester vos API swagger/openAPI avec Dredd

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Logo Dredd

Après vous avoir présenté une méthode utilisant postman/newman je suis parti d’une autre solution et je suis tombé sur dredd qui est nettement plus simple à mettre en oeuvre. En effet il fonctionne sans aucune création de fichier puisqu’il se base sur le fichier de déclaration de l’API.

Installation de Dredd

Dredd est basé sur Node.js et donc avant de l’installer il faut installer nodejs. Je vais vous montrer au passage une méthode d’installation des packages nodejs sans avoir besoin de recourir à sudo.

apt install nodejs npm
mkdir "${HOME}/.npm-packages"
npm config set prefix "${HOME}/.npm-packages"

Ajouter les lignes suivantes à votre fichier .bahsrc

NPM_PACKAGES="${HOME}/.npm-packages"
export PATH="$PATH:$NPM_PACKAGES/bin"

Recharger votre environnement et lancer les commandes suivantes :

npm install -g npm
dredd --help

Lancer ses premiers tests avec Dredd

Dredd possède une série d’option mais personnellement je préfère utiliser le fichier de configuration. Pour créer ce fichier de configuration il suffit de lancer la commande dredd init et de répondre aux questions. Mais avant on va récupérer le créer le fichier swagger permettant de tester le petstore.

vi swagger.yaml

Collez ceci dedans :

openapi: 3.0.1
info:
title: Swagger Petstore
version: 1.0.0
servers:
- url: https://petstore.swagger.io/v2
paths:
/pet/{petId}:
get:
tags:
- "pet"
summary: "Find pet by ID"
description: "Returns a single pet"
operationId: "getPetById"
produces:
- "application/xml"
- "application/json"
parameters:
- name: "petId"
in: "path"
description: "ID of pet to return"
required: true
type: "integer"
format: "int64"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/Pet"

components:
schemas:
Category:
type: object
properties:
id:
type: integer
format: int64
name:
type: string
xml:
name: Category
Tag:
type: object
properties:
id:
type: integer
format: int64
name:
type: string
xml:
name: Tag
Pet:
required:
- name
- photoUrls
type: object
properties:
id:
type: integer
format: int64
category:
$ref:#/components/schemas/Category’
name:
type: string
example: doggie
photoUrls:
type: array
xml:
name: photoUrl
wrapped: true
items:
type: string
tags:
type: array
xml:
name: tag
wrapped: true
items:
$ref:#/components/schemas/Tag’
status:
type: string
description: pet status in the store
enum:
- available
- pending
- sold
xml:
name: Pet

Maintenant générons le fichier de configuration de Dredd.

dredd init
? Location of the API description document swagger.yaml
? Command to start the API server under
? Host of the API under https://petstore.swagger.io/v2/
? Do you want to use hooks to customize Dredd’s behavior? No
? Do you want to report your tests to the Apiary inspector? No
? Dredd is best served with Continuous Integration. Do you want to create CI configuration? No

Le fichier de config est crée et se nomme dredd.yml vous pouvez modifier le contenu comme ceci :

color: true
dry-run: null
hookfiles: null
language: null
require: null
server: nom
server-wait: 3
init: false
custom: {}
names: false
only: []
reporter: []
output: []
header: []
sorted: false
user: null
inline-errors: false
details: false
method: []
loglevel: error
path: []
hooks-worker-timeout: 5000
hooks-worker-connect-timeout: 1500
hooks-worker-connect-retry: 500
hooks-worker-after-connect-wait: 100
hooks-worker-term-timeout: 5000
hooks-worker-term-retry: 500
hooks-worker-handler-host: 127.0.0.1
hooks-worker-handler-port: 61321
config: ./dredd.yml
blueprint: ./swagger.yaml
endpoint: ’https://petstore.swagger.io/v2’

Maintenant on peut lancer le test de l’API :

dredd

pass: GET (200) /pet/123 duration: 1211ms
request:
method: GET
uri: /pet/123
headers:
User-Agent: Dredd/12.1.0 (Linux 5.3.0-18-generic; x64)

body:



expected:
headers:

statusCode: 200


actual:
statusCode: 200
headers:
date: Wed, 16 Oct 2019 17:33:18 GMT
access-control-allow-origin: *
access-control-allow-methods: GET, POST, DELETE, PUT
access-control-allow-headers: Content-Type, api_key, Authorization
content-type: application/json
connection: close
server: Jetty(9.2.9.v20150224)

bodyEncoding: utf-8
body:
{
"id": 123,
"name": "doggie",
"photoUrls": [],
"tags": [],
"status": "available"
}

complete: 1 passing, 0 failing, 0 errors, 0 skipped, 1 total
complete: Tests took 1218ms

Et voila notre test est terminé. Vous pouvez aller plus loin en lisant la documentation du site