Tester vos API swagger/openAPI avec Dredd
Publié le :
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 npmmkdir "${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 npmdredd --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.1info: title: Swagger Petstore version: 1.0.0servers:- url: https://petstore.swagger.io/v2paths: /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: truedry-run: nullhookfiles: nulllanguage: nullrequire: nullserver: nomserver-wait: 3init: falsecustom: {}names: falseonly: []reporter: []output: []header: []sorted: falseuser: nullinline-errors: falsedetails: falsemethod: []loglevel: errorpath: []hooks-worker-timeout: 5000hooks-worker-connect-timeout: 1500hooks-worker-connect-retry: 500hooks-worker-after-connect-wait: 100hooks-worker-term-timeout: 5000hooks-worker-term-retry: 500hooks-worker-handler-host: 127.0.0.1hooks-worker-handler-port: 61321config: ./dredd.ymlblueprint: ./swagger.yamlendpoint: ’https://petstore.swagger.io/v2’
Maintenant on peut lancer le test de l’API :
dredd
pass: GET (200) /pet/123 duration: 1211msrequest:method: GETuri: /pet/123headers: User-Agent: Dredd/12.1.0 (Linux 5.3.0-18-generic; x64)
body:
expected:headers:
statusCode: 200
actual:statusCode: 200headers: 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-8body:{ "id": 123, "name": "doggie", "photoUrls": [], "tags": [], "status": "available"}
complete: 1 passing, 0 failing, 0 errors, 0 skipped, 1 totalcomplete: Tests took 1218ms
Et voila notre test est terminé. Vous pouvez aller plus loin en lisant la documentation du site ↗