python testing integration-testing vcr

¿Existe una alternativa de python a la biblioteca de VCR de Ruby?



testing integration-testing (3)

Existe un puerto de videograbadora Python llamado VCR.py desarrollado en los últimos años.

Si ya sabe cómo usar la videograbadora y se siente cómodo con ella, también podría considerar la posibilidad de ejecutar un servidor proxy local de ruby ​​(que use algo como un rack) con la videograbadora cargada. Luego puede probar el código en cualquier idioma ... solo asegúrese de que las solicitudes HTTP se dirijan a través de su servidor local. Este es uno de los usos principales del middleware de rack de VCR . He usado esto para probar código no ruby ​​antes y funcionó muy bien.

Me gustaría usar el impresionante mecanismo de "grabación / reproducción" de la biblioteca de VCR de Ruby o Betamax para la JVM . ¿Hay una biblioteca de Python que funciona de la misma manera? Si no es así, ¿cómo prueba las llamadas de sus clientes REST sin preocuparse de que la prueba sea lenta y escamosa?


También hay un betamax para python que recomendaría de todo corazón.


Tanto VCR.py como VCR.py han sido sugeridos en otras respuestas. Quería señalar una diferencia que podría dictar cuál puede usar.

Betamax espera que pase un requests.Session creado previamente. Objeto de requests.Session al configurarlo para la prueba. Esto significa que el objeto de sesión debe originarse desde dentro de la prueba, y no en el código bajo prueba. De la documentación:

with Betamax(self.session) as vcr: vcr.use_cassette(''user'') resp = self.session.get(''https://api.github.com/user'', auth=(''user'', ''pass'')) assert resp.json()[''login''] is not None

En mi caso, el objeto de sesión se crea dentro del código que necesito probar. En este caso, betamax quedó fuera de cuestión.

Por otro lado, VCR.py parchea la pila HTTP de Python en un nivel inferior, por lo que esto funciona perfectamente:

import requests import vcr def my_func(): session = requests.Session() response = session.get(''https://.com/'') print(response.text[:200]) def test_my_func(): with vcr.use_cassette(''/tmp/cassette.yaml''): my_func()