Cara sistematis untuk menguji RESTful APIs dengan curl?

14

Saya perhatikan selama pengujian integrasi bahwa saya benar-benar bekerja pada kasus penggunaan berulang dengan API yang tenang (atau dalam antarmuka HTTP umum) saya periksa di sana-sini dengan bash + cURL.

Itu mulai terlihat sangat berantakan dan semakin sulit untuk dipertahankan. Mengapa mengirim kekacauan?

Kasus penggunaan umum adalah:

  • Periksa apakah URL mengembalikan kode respons http, misalnya 200
  • Periksa bahwa jenis konten cocok dengan beberapa MIME yang Anda butuhkan dalam kasus itu
  • Periksa apakah konten yang dikembalikan cocok dengan beberapa pola, atau melewati prosedur validasi abstrak

Apa yang saya temukan sejauh ini dan mempertimbangkan opsi yang bisa diterapkan tanpa menciptakan kembali roda, adalah:

  • coba dengan PyCurl - dengan harapan itu sepenuhnya mengimplementasikan semua opsi cURL esp. proxying tetapi juga switch lain yang mungkin saya butuhkan
  • gunakan unit testng bawaan Python

Maka saya dapat memiliki, misalnya, satu tes unit per layanan yang ingin saya periksa:

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

Apakah ini masuk akal atau ada alat yang lebih tinggi (tetapi tidak terlalu rumit untuk mengambil dan mengintegrasikan)?

Peter Muryshkin
sumber
1
Apa itu kode API? ada banyak sistem uji integrasi dan memilih satu biasanya dilakukan pada bahasa yang sama dengan kode yang diuji sehingga pengembang yang sama dapat memperbarui keduanya.
Tensibai
ini bisa heterogen dan saya tidak punya kendali
Peter Muryshkin
1
Jadi, bahasa apa yang paling nyaman bagi tim Anda? Setiap alat akan melakukan untuk menguji hal-hal semacam ini, dari bash + curl ke capistrano post deploy hooks ...
Tensibai
2
Dalam ekosistem chef Anda akan menemukan inspec yang dapat menjawab pertanyaan Anda dengan sumber daya http , tetapi didasarkan pada serverpec / rspec, jadi ini lebih merupakan dunia ruby ​​daripada dunia python tetapi mungkin patut dicoba.
Tensibai
2
Saya telah mengerjakan beberapa kode python untuk melakukan panggilan REST menggunakan pustaka permintaan Python . Ini akan memungkinkan Anda menambahkan header apa pun yang Anda inginkan dan mendukung dukungan proxy HTTP, sehingga harus mampu mendukung semua fitur curl. Anda boleh meminjam kode saya untuk kebutuhan Anda atau menggunakannya sebagai contoh jika itu membantu.
James Shewey

Jawaban:

7

Anda bisa melihat alat-alat seperti Postman yang berfokus pada pengujian REST APIs dengan JavaScript - ia memiliki beberapa fitur bagus tetapi Anda kehilangan penggunaan Python.

Sebagai gantinya, saya sarankan melihat plugin terkait REST untuk pytest , kerangka uji Python yang menyederhanakan kode pengujian Anda, sambil tetap menjalankan tes yang ditulis menggunakan unittest.

  • Sebagai contoh, menulis tes berparameter menghindari kode tes rangkap yang membosankan dan rawan kesalahan.

Pytest memiliki sejumlah besar plugin yang menyederhanakan berbagai tugas, termasuk:

  • Tavern , yang berspesialisasi dalam pengujian API REST dan tampaknya sangat relevan di sini - semacam "tukang pos untuk pengujian unit Python".

  • pytest-curl-report - saat menguji dengan requestsperpustakaan, akan mencetak curlperintah yang dapat Anda gunakan untuk mereproduksi kesalahan dari shell.

  • Testinfra - berfokus pada pengujian server (misalnya keadaan paket OS, file, proses, dll, biasanya diuji pada server jarak jauh) - sangat disarankan jika Anda juga memerlukan jenis ini misalnya untuk menguji kode yang mungkin.

    • Bagi mereka yang menggunakan Wayang atau Koki, Testinfra mirip dengan Beaker (dengan RSpec), ServerSpec atau InSpec.

Jika Anda tidak suka Tavern, Anda tentu saja dapat digunakan pycurldengan pytest, yang membuatnya lebih mudah untuk mendiagnosa apa yang gagal. Contoh ini dari situs pytest-curl-report hanya menggunakan fitur pytest umum:

$ 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 memungkinkan Anda menulis semua tes dengan sederhana assert, dan secara opsional menyertakan pesan yang membantu sebagai bagian dari output. Misalnya, salah satu tes Anda dapat ditulis:

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