Aller au contenu principal

Tester vos API swagger/openAPI avec Dredd

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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