¿Una forma sistemática de probar las API RESTful con curl?

14

Durante las pruebas de integración, he notado que en realidad trabajo en casos de uso recurrentes con API relajantes (o en interfaces HTTP generales) que verifico aquí y allá con bash + cURL.

Comienza a verse bastante desordenado y se vuelve más difícil de mantener. ¿Por qué entregar desorden?

Los casos de uso típicos son:

  • Compruebe que una URL devuelve el código de respuesta http, por ejemplo, 200
  • Verifique que el tipo de contenido coincida con el MIME que necesita en ese caso
  • Compruebe que el contenido devuelto coincide con algún patrón o pasa un procedimiento de validación abstracta

Lo que he encontrado hasta ahora y considero una opción viable sin reinventar la rueda, es:

  • pruebe PyCurl, con la esperanza de que implemente completamente todas las opciones de cURL especialmente. proxy pero también otros interruptores que pueda necesitar
  • use la unidad de prueba incorporada de Python

Entonces podría tener, por ejemplo, una prueba de unidad por servicio que me gustaría verificar:

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()

¿Tiene sentido o hay herramientas más de alto nivel (pero no demasiado complejas para recoger e integrar)?

Peter Muryshkin
fuente
1
¿Qué es el código API? hay un montón de sistemas de prueba de integración y la elección de uno generalmente se realiza en el mismo idioma que el código que se está probando para que el mismo desarrollador pueda actualizar ambos.
Tensibai
esto puede ser heterogéneo y no tengo control
Peter Muryshkin
1
Entonces, ¿en qué idioma se siente más cómodo su equipo? Cada herramienta servirá para probar este tipo de cosas, desde bash + curl hasta capistrano post desplegar ganchos ...
Tensibai
2
En el ecosistema de chef encontrará inspec que puede responder a su pregunta con el recurso http , pero se basa en serverpec / rspec, por lo que es más un mundo de rubíes que un mundo de python, pero vale la pena intentarlo.
Tensibai
2
He estado trabajando en algún código de Python para hacer llamadas REST usando la biblioteca de solicitudes de Python . Le permitirá agregar cualquier encabezado que desee y admite la compatibilidad con proxy HTTP (s), por lo que debería ser capaz de admitir todas las características de curl. Puede pedir prestado mi código para sus necesidades o usarlo como ejemplo si es útil.
James Shewey

Respuestas:

7

Podrías mirar herramientas como Postman, que se enfoca en probar las API REST con JavaScript: tiene algunas características agradables, pero pierdes el uso de Python.

En cambio, sugeriría buscar complementos relacionados con REST para pytest , un marco de prueba de Python que simplifica su código de prueba, mientras sigue ejecutando pruebas escritas usando unittest.

  • Por ejemplo, escribir pruebas parametrizadas evita códigos de prueba duplicados aburridos y propensos a errores.

Pytest tiene un gran conjunto de complementos que simplifican varias tareas, que incluyen:

  • Tavern , que se especializa en probar API REST y parece muy relevante aquí, una especie de "Postman para pruebas unitarias de Python".

  • pytest-curl-report : al probar con la requestsbiblioteca, imprimirá un curlcomando que puede usar para reproducir el error desde el shell.

  • Testinfra : se centra en las pruebas del servidor (p. Ej., Estado de los paquetes del sistema operativo, archivos, procesos, etc., generalmente probados en servidores remotos). Se recomienda encarecidamente si también necesita este tipo, p. Ej., Para probar el código Ansible.

    • Para aquellos que usan Puppet o Chef, Testinfra es similar a Beaker (con RSpec), ServerSpec o InSpec.

Si no te gusta la taberna, se puede, por supuesto, el uso pycurlcon pytest, lo que hace que sea más fácil de diagnosticar exactamente lo que falló. Este ejemplo del sitio pytest-curl-report usa solo características genéricas 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 le permite escribir todas las pruebas con un plano asserty, opcionalmente, incluir un mensaje útil como parte de la salida. Por ejemplo, una de sus pruebas podría escribirse:

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