Un modo sistematico per testare le API RESTful con l'arricciatura?


14

Durante i test di integrazione ho notato che in realtà lavoro su casi d'uso ricorrenti con API riposanti (o in interfacce HTTP generali) che controllo qua e là con bash + cURL.

Inizia a sembrare piuttosto disordinato e diventa più difficile da mantenere. Perché consegnare pasticcio?

I casi d'uso tipici sono:

  • Verifica che un URL restituisca un codice di risposta http, ad esempio 200
  • Verifica che il tipo di contenuto corrisponda ad alcuni MIME necessari in quel caso
  • Verificare che il contenuto restituito corrisponda a qualche modello o che passi una procedura di convalida astratta

Quello che ho trovato finora e considero un'opzione praticabile senza reinventare la ruota, è:

  • provalo con PyCurl - nella speranza implementa completamente tutte le opzioni cURL esp. proxy ma anche altri switch di cui potrei aver bisogno
  • usa il test unit integrato di Python

Quindi potrei avere, ad esempio, un test unitario per servizio che vorrei controllare:

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

Ha senso o esiste una strumentazione di alto livello (ma non troppo complessa per essere acquisita e integrata)?


1
Qual è il codice API? c'è un sacco di sistemi di test di integrazione e la scelta di uno di solito viene eseguita nella stessa lingua del codice testato in modo che lo stesso sviluppatore possa aggiornare entrambi.
Tensibai,

questo può essere eterogeneo e non ho controllo
Peter Muryshkin,

1
Qual è la lingua con cui la tua squadra è più a suo agio? Ogni strumento farà per testare questo tipo di cose, da bash + curl a capistrano post hook ganci ...
Tensibai

2
Nell'ecosistema chef troverai inspec che può rispondere alla tua domanda con la risorsa http , ma è basato su serverpec / rspec, quindi è più un mondo rubino che un mondo pitone ma può valere la pena provare.
Tensibai,

2
Ho lavorato su alcuni codici Python per effettuare chiamate REST utilizzando la libreria delle richieste di Python . Ti consentirà di aggiungere qualsiasi intestazione che desideri e supporta il supporto proxy HTTP (s), quindi dovrebbe essere in grado di supportare tutte le funzionalità di curl. Puoi prendere in prestito il mio codice per le tue esigenze o usarlo come esempio se è utile.
James Shewey,

Risposte:


7

Potresti esaminare strumenti come Postman che si concentra sul test delle API REST con JavaScript: ha alcune belle funzionalità ma perdi l'uso di Python.

Invece, suggerirei di guardare plug-in relativi a REST per pytest , un framework di test Python che semplifica il codice di test, mentre continua a eseguire test scritti usando unittest.

  • Ad esempio, la scrittura di test con parametri evita il codice di test duplicato noioso e soggetto a errori.

Pytest ha un enorme set di plugin che semplificano varie attività, tra cui:

  • Tavern , che è specializzato nel testare API REST e sembra molto rilevante qui - una specie di "Postman per test unit Python".

  • pytest-curl-report - durante il test con la requestslibreria, stamperà un curlcomando che puoi usare per riprodurre l'errore dalla shell.

  • Testinfra - si concentra sui test del server (ad es. Stato dei pacchetti del sistema operativo, file, processi, ecc., Di solito testati su server remoti) - fortemente raccomandato se è necessario anche questo tipo, ad esempio per testare il codice Ansible.

    • Per coloro che usano Puppet o Chef, Testinfra è simile a Beaker (con RSpec), ServerSpec o InSpec.

Se non lo fai come Taverna, è possibile di utilizzo naturalmente pycurlcon pytest, il che rende più facile diagnosticare esattamente ciò che non è riuscito. Questo esempio dal sito pytest-curl-report utilizza solo funzionalità generiche di 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 ti consente di scrivere tutti i test con un semplice asserte facoltativamente includere un messaggio utile come parte dell'output. Ad esempio, uno dei tuoi test potrebbe essere scritto:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.