Systematyczny sposób testowania interfejsów API RESTful za pomocą curl?


14

Zauważyłem podczas testów integracyjnych, że faktycznie pracuję nad powtarzającymi się przypadkami użycia z interfejsami API (lub ogólnie interfejsami HTTP) sprawdzam tu i tam za pomocą bash + cURL.

Zaczyna wyglądać dość niechlujnie i trudniej go utrzymać. Po co dostarczać bałagan?

Typowe przypadki użycia to:

  • Sprawdź, czy adres URL zwraca kod odpowiedzi http, np. 200
  • Sprawdź, czy typ zawartości odpowiada MIME, którego potrzebujesz w takim przypadku
  • Sprawdź, czy zwrócona treść jest zgodna z pewnym wzorcem lub przechodzi abstrakcyjną procedurę sprawdzania poprawności

To, co do tej pory znalazłem i rozważam wykonalną opcję bez wymyślania koła, to:

  • wypróbuj PyCurl - mam nadzieję, że w pełni wdroży on wszystkie opcje cURL esp. proxy, ale także inne przełączniki, których mogę potrzebować
  • użyj wbudowanego testowania jednostek Pythona

Następnie mógłbym na przykład przeprowadzić jeden test jednostkowy na usługę, który chciałbym sprawdzić:

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

Czy ma to sens, czy istnieje oprzyrządowanie na wyższym poziomie (ale niezbyt skomplikowane, aby podnieść i zintegrować)?


1
Co to jest kod API? istnieje kilka zintegrowanych systemów testowych, a wybór jednego zwykle odbywa się w tym samym języku co testowany kod, aby ten sam program mógł zaktualizować oba.
Tensibai

mogą to być heterogeniczne i nie mam kontroli
Peter Muryshkin

1
Więc w jakim języku twój zespół jest bardziej komfortowy? Każde narzędzie zrobi, aby przetestować tego rodzaju rzeczy, od bash + curl po capistrano po wdrożeniu haków ...
Tensibai

2
W ekosystemie szefów kuchni znajdziesz inspec, który może odpowiedzieć na twoje pytanie za pomocą zasobu http , ale jest oparty na serverpec / rspec, więc jest bardziej światem rubinowym niż świat python, ale może warto spróbować.
Tensibai

2
Byłem pracuje nad pewnym kodem Pythona zrobić wywołań REST za pomocą wnioski biblioteki Pythona . Umożliwi to dodanie dowolnego nagłówka i obsługuje obsługę proxy HTTP (s), więc powinien być w stanie obsługiwać wszystkie funkcje curl. Możesz pożyczyć mój kod na własne potrzeby lub użyć go jako przykładu, jeśli jest pomocny.
James Shewey,

Odpowiedzi:


7

Możesz spojrzeć na takie narzędzia, jak Postman, który koncentruje się na testowaniu interfejsów API REST za pomocą JavaScript - ma kilka fajnych funkcji, ale nie używasz Pythona.

Zamiast tego sugerowałbym spojrzenie na wtyczki związane z REST dla pytest , frameworku testowego Python, który upraszcza kod testowy, jednocześnie uruchamiając testy napisane przy użyciu unittest.

Pytest ma ogromny zestaw wtyczek, które upraszczają różne zadania, w tym:

  • Tavern , która specjalizuje się w testowaniu interfejsów API REST i wydaje się tutaj bardzo istotna - coś w rodzaju „Postmana do testów jednostkowych Pythona”.

  • pytest-curl-report - podczas testowania z requestsbiblioteką wypisze curlpolecenie, którego możesz użyć do odtworzenia błędu z powłoki.

  • Testinfra - koncentruje się na testowaniu serwera (np. Stan pakietów systemu operacyjnego, plików, procesów itp., Zwykle testowany na zdalnych serwerach) - zdecydowanie zalecane, jeśli potrzebujesz tego typu np. Do testowania kodu Ansible.

    • Dla tych, którzy używają Puppet lub Chef, Testinfra jest podobny do Beaker (z RSpec), ServerSpec lub InSpec.

Jeśli nie podoba Tavern, można wykorzystania kursu pycurlz pytest, co sprawia, że łatwiej zdiagnozować dokładnie to, co nie powiodło się. Ten przykład z witryny pytest-curl-report wykorzystuje tylko ogólne funkcje 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 pozwala pisać wszystkie testy zwykłym tekstem asserti opcjonalnie zawierać pomocny komunikat jako część wyniku. Na przykład można napisać jeden z testów:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.