Eine systematische Methode zum Testen von RESTful-APIs mit curl?


14

Während des Integrationstests ist mir aufgefallen, dass ich tatsächlich an wiederkehrenden Anwendungsfällen mit restful APIs (oder generell HTTP-Schnittstellen) arbeite, die ich hier und da mit bash + cURL überprüfe.

Es sieht ziemlich chaotisch aus und ist schwerer zu warten. Warum Chaos ausliefern?

Typische Anwendungsfälle sind:

  • Überprüfen Sie, ob eine URL den http-Antwortcode zurückgibt, z. B. 200
  • Überprüfen Sie, ob der Inhaltstyp mit einem MIME-Wert übereinstimmt, den Sie in diesem Fall benötigen
  • Überprüfen Sie, ob der zurückgegebene Inhalt einem bestimmten Muster entspricht, oder bestehen Sie eine abstrakte Validierungsprozedur

Was ich bisher gefunden habe und für eine praktikable Option halte, ohne das Rad neu zu erfinden, ist:

  • Probieren Sie es mit PyCurl aus - in der Hoffnung, dass es alle cURL-Optionen vollständig implementiert, insb. Proxy aber auch andere Schalter, die ich möglicherweise benötige
  • benutze Pythons eingebaute Unit testng

Dann könnte ich zum Beispiel einen Unit Test pro Service haben, den ich überprüfen möchte:

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

Ist dies sinnvoll oder gibt es ein höherwertigeres (aber nicht zu komplexes, um es aufzunehmen und zu integrieren) Werkzeug?


1
Was ist der API-Code? Es gibt eine Reihe von Integrationstestsystemen. Die Auswahl eines Systems erfolgt normalerweise in derselben Sprache wie der getestete Code, sodass derselbe Entwickler beide aktualisieren kann.
Tensibai

Dies kann heterogen sein und ich habe keine Kontrolle
Peter

1
Was ist die Sprache, mit der sich Ihr Team am wohlsten fühlt? Jedes Tool wird diese Art von Dingen testen, von Bash + Curl bis Capistrano Post
Deploy

2
Im Chef-Ökosystem finden Sie inspec, das Ihre Frage mit der http-Ressource beantworten kann , aber es basiert auf serverspec / rspec. Es ist also eher eine Rubin-Welt als eine Python-Welt, aber möglicherweise einen Versuch wert.
Tensibai

2
Ich habe an einem Python-Code gearbeitet, um REST-Aufrufe mit Pythons Anforderungsbibliothek durchzuführen . Damit können Sie jeden gewünschten Header hinzufügen und HTTP (s) -Proxy-Unterstützung unterstützen, sodass alle Funktionen von curl unterstützt werden sollten. Gerne können Sie meinen Code für Ihre Bedürfnisse ausleihen oder ihn als Beispiel verwenden, wenn er hilfreich ist.
James Shewey

Antworten:


7

Sie könnten sich Tools wie Postman ansehen, die sich auf das Testen von REST-APIs mit JavaScript konzentrieren - es hat einige nette Funktionen, aber Sie verlieren die Verwendung von Python.

Stattdessen würde ich vorschlagen, in REST-bezogenen Plugins nach pytest zu suchen , einem Python- Testframework , das Ihren Testcode vereinfacht, während weiterhin Tests ausgeführt werden, die mit geschrieben wurden unittest.

  • Das Schreiben parametrisierter Tests vermeidet beispielsweise langweiligen und fehleranfälligen doppelten Testcode.

Pytest verfügt über eine Vielzahl von Plugins, die verschiedene Aufgaben vereinfachen, darunter:

  • Tavern , die sich auf das Testen von REST-APIs spezialisiert hat und hier von hoher Relevanz zu sein scheint - eine Art "Postman für Python-Unit-Tests".

  • pytest-curl-report - Beim Testen mit der requestsBibliothek wird ein curlBefehl gedruckt, mit dem Sie den Fehler aus der Shell reproduzieren können.

  • Testinfra - konzentriert sich auf Servertests (z. B. Status von Betriebssystempaketen, -dateien , -prozessen usw., die normalerweise auf Remoteservern getestet werden) - wird dringend empfohlen, wenn Sie diesen Typ auch benötigen, z. B. um Ansible-Code zu testen.

    • Für diejenigen, die Puppet oder Chef verwenden, ähnelt Testinfra Beaker (mit RSpec), ServerSpec oder InSpec.

Wenn Sie Tavern nicht mögen, können Sie es natürlich pycurlmit verwenden pytest, was es einfacher macht, genau zu diagnostizieren, was fehlgeschlagen ist. In diesem Beispiel auf der Website für Pytest-Curl-Berichte werden nur allgemeine Pytest-Funktionen verwendet:

$ 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

Mit Pytest können Sie alle Tests mit einem einfachen Text schreiben assertund optional eine hilfreiche Nachricht als Teil der Ausgabe hinzufügen . Zum Beispiel könnte einer Ihrer Tests geschrieben werden:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.