Un moyen systématique de tester les API RESTful avec curl?

14

J'ai remarqué lors des tests d'intégration que je travaille en fait sur des cas d'utilisation récurrents avec des API reposantes (ou en général des interfaces HTTP) que je vérifie ici et là avec bash + cURL.

Il commence à sembler assez désordonné et devient plus difficile à entretenir. Pourquoi livrer des dégâts?

Les cas d'utilisation typiques sont:

  • Vérifiez qu'une URL renvoie un code de réponse http, par exemple 200
  • Vérifiez que le type de contenu correspond à certains MIME dont vous avez besoin dans ce cas
  • Vérifiez que le contenu retourné correspond à un modèle ou passe une procédure de validation abstraite

Ce que j'ai trouvé jusqu'à présent et que je considère comme une option réalisable sans réinventer la roue, c'est:

  • essayez PyCurl - dans l'espoir qu'il implémente pleinement toutes les options cURL esp. proxy mais aussi d'autres commutateurs dont je pourrais avoir besoin
  • utiliser le testng intégré de Python

Ensuite, je pourrais avoir, par exemple, un test unitaire par service que je voudrais vérifier:

import unittest, pycurl

class TestService (unittest.TestCase):

    def test_1(self):
        self.assertEqual(pycurl.returncode("some_url"), 200)

    def test_2(self):
        self.assertTrue(pycurl.response("some_url").matches ("xxx") )

    def test_3(self):
        self.assertTrue (pycurl.ContentType("some_url").equal("xxx"))

if __name__ == '__main__':
    unittest.main()

Est-ce que cela a du sens ou existe-t-il un outillage de plus haut niveau (mais pas trop complexe à prendre et à intégrer)?

Peter Muryshkin
la source
1
Qu'est-ce que le code API? il y a un tas de systèmes de test d'intégration et le choix se fait généralement dans la même langue que le code testé afin que le même développeur puisse mettre à jour les deux.
Tensibai
cela peut être hétérogène et je n'ai aucun contrôle
Peter Muryshkin
1
Alors, quelle est la langue avec laquelle votre équipe est la plus à l'aise? Chaque outil fera pour tester ce genre de choses, de bash + curl aux crochets capistrano post deploy ...
Tensibai
2
Dans l'écosystème du chef, vous trouverez inspec qui peut répondre à votre question avec la ressource http , mais il est basé sur serverspec / rspec, donc c'est plus un monde rubis qu'un monde python mais ça vaut le coup d'essayer.
Tensibai
2
J'ai travaillé sur du code python pour effectuer des appels REST à l' aide de la bibliothèque de requêtes de Python . Il vous permettra d'ajouter n'importe quel en-tête que vous souhaitez et prend en charge la prise en charge du proxy HTTP (s), il devrait donc être capable de prendre en charge toutes les fonctionnalités de curl. Vous êtes invités à emprunter mon code pour vos besoins ou à l'utiliser comme exemple s'il est utile.
James Shewey

Réponses:

7

Vous pouvez regarder des outils tels que Postman qui se concentre sur le test des API REST avec JavaScript - il a de belles fonctionnalités mais vous perdez l'utilisation de Python.

Au lieu de cela, je suggère de regarder les plugins liés à REST pour pytest , un framework de test Python qui simplifie votre code de test, tout en exécutant des tests écrits à l'aide de unittest.

  • Par exemple, l'écriture de tests paramétrés évite le code de test en double ennuyeux et sujet aux erreurs.

Pytest dispose d'un vaste ensemble de plugins qui simplifient diverses tâches, notamment:

  • Tavern , qui se spécialise dans le test des API REST et semble très pertinent ici - une sorte de "Postman for Python unit tests".

  • pytest-curl-report - lors des tests avec la requestsbibliothèque, imprimera une curlcommande que vous pouvez utiliser pour reproduire l'erreur à partir du shell.

  • Testinfra - se concentre sur les tests de serveur (par exemple, l'état des packages de système d'exploitation, des fichiers, des processus, etc., généralement testés sur des serveurs distants) - fortement recommandé si vous avez également besoin de ce type, par exemple pour tester le code Ansible.

    • Pour ceux qui utilisent Puppet ou Chef, Testinfra est similaire à Beaker (avec RSpec), ServerSpec ou InSpec.

Si vous n'aimez pas Tavern, vous pouvez bien sûr l'utiliser pycurlavec pytest, ce qui facilite le diagnostic de ce qui a échoué. Cet exemple du site pytest-curl-report utilise uniquement des fonctionnalités génériques de pytest:

$ py.test test.py
============================= test session starts ==============================
platform darwin -- Python 2.7.9 -- py-1.4.27 -- pytest-2.6.4
plugins: curl-report, httpbin, cache, capturelog, cov, flakes, pep8
collected 1 items

test.py F

=================================== FAILURES ===================================
______________________________ test_requests_get _______________________________

    def test_requests_get():
        r = requests.get('http://httpbin.org/get')
>       assert False
E       assert False

test.py:7: AssertionError

Pytest vous permet d'écrire tous les tests en clair assert, et éventuellement d'inclure un message utile dans la sortie. Par exemple, l'un de vos tests pourrait être écrit:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
RichVel
la source