RESTful API'leri curl ile test etmenin sistematik bir yolu var mı?


14

Entegrasyon testi sırasında aslında dinlendirici API'lerle (veya genel HTTP arayüzlerinde) tekrarlayan kullanım vakaları üzerinde çalıştığımı fark ettim. Burada ve orada bash + cURL ile kontrol ediyorum.

Oldukça dağınık görünmeye başlar ve bakımı zorlaşır. Neden dağınıklık?

Tipik kullanım durumları:

  • Bir URL'nin http yanıt kodu döndürdüğünü kontrol edin, örn. 200
  • İçerik türünün bu durumda ihtiyacınız olan MIME ile eşleştiğini kontrol edin
  • Döndürülen içeriğin bir kalıpla eşleştiğini veya soyut bir doğrulama prosedürü geçip geçmediğini kontrol edin

Şimdiye kadar buldum ve tekerleği yeniden icat etmeden uygulanabilir bir seçenek düşünün:

  • PyCurl ile bir gitmek var - bir umut olarak tüm cURL seçenekleri esp tamamen uygular. vekaleten değil, ihtiyacım olan diğer anahtarlar
  • Python'un yerleşik birim testini kullan

Sonra, örneğin, kontrol etmek istediğim hizmet başına bir birim testi yapabilirdim:

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

Bu anlamlı mı yoksa daha yüksek seviyeli (ancak almak ve entegre etmek için çok karmaşık değil) bir takım var mı?


1
API kodu nedir? bir grup entegrasyon test sistemi vardır ve bunlardan birini seçmek genellikle test edilen kodla aynı dilde yapılır, böylece aynı geliştirici her ikisini de güncelleyebilir.
Tensibai

bu heterojen olabilir ve hiçbir kontrolüm yok
Peter Muryshkin

1
Peki takımınızın daha rahat olduğu dil nedir? Her araç, bash +
curl'dan

2
Şef ekosisteminde , sorunuzu http kaynağı ile cevaplayabilecek inspec bulacaksınız , ancak bu plshon dünyasından daha yakut bir dünyadır, ancak denemeye değer olabilir.
Tensibai

2
Ben oldum DİNLENME aramaları yapmak için bazı piton kod üzerinde çalışan kullanarak Python'un istekleri kütüphanesi . İstediğiniz üstbilgileri eklemenize izin verir ve HTTP (ler) proxy desteğini destekler, bu nedenle tüm curl özelliklerini destekleyebilmelidir. Kodumu ihtiyaçlarınız için ödünç alabilir veya yardımcı olması durumunda örnek olarak kullanabilirsiniz.
James Shewey

Yanıtlar:


7

REST API'lerini JavaScript ile test etmeye odaklanan Postman gibi araçlara bakabilirsiniz - bazı güzel özelliklere sahiptir, ancak Python kullanımını kaybedersiniz.

Bunun yerine, test kodunuzu basitleştiren bir Python test çerçevesi olan REST ile ilgili eklentilere bakarken , yine de yazılı testleri çalıştırmanızı öneririm unittest.

  • Örneğin, parametreli testler yazmak sıkıcı ve hataya açık yinelenen test kodunu önler.

Pytest'in çeşitli görevleri basitleştiren çok sayıda eklentisi vardır:

  • REST API'lerini test etme konusunda uzmanlaşmış ve burada oldukça alakalı görünen Tavern - bir çeşit "Python birim testleri için postacı".

  • pytest-curl-report - requestskitaplıkla test ederken curl, hatayı kabuktan yeniden oluşturmak için kullanabileceğiniz bir komut yazdırır .

  • Testinfra - sunucu testine odaklanır (örn. Genellikle uzak sunucularda test edilen işletim sistemi paketlerinin, dosyaların, işlemlerin vb. Durumu ) - örneğin Ansible kodunu test etmek için bu türe ihtiyacınız varsa şiddetle önerilir.

    • Kukla veya Şef kullananlar için Testinfra, Beaker (RSpec ile), ServerSpec veya InSpec'e benzer.

Eğer Tavern gibi yapmazsanız yapabilirsiniz kurs kullanım pycurlile pytestdaha kolay başarısız tam olarak ne teşhis etmek yapar. Pytest-curl-report sitesinden alınan bu örnekte yalnızca genel pytest özellikleri kullanılmaktadır:

$ 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, tüm testleri düz bir şekilde yazmanıza assertve isteğe bağlı olarak çıktının bir parçası olarak yararlı bir mesaj eklemenize izin verir . Örneğin, testlerinizden biri yazılabilir:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.