一千萬個為什麽

搜索

用curl測試RESTful API的系統方法?



我註意到在集成測試期間,我實際上使用restful API(或通常的HTTP接口)重復使用用例,我用bash + cURL在這裏和那裏查看。

它開始看起來很亂,而且越來越難以維護。為什麽傳遞混亂?

典型的用例是:

  • 檢查URL是否會返回http響應代碼,例如200
  • 在這種情況下,檢查內容類型是否符合您需要的某些MIME
  • 檢查返回的內容是否符合某種模式,或者傳遞抽象驗證程序

到目前為止,我發現的並且考慮了一個可行的選擇而沒有重新發明輪子,是:

  • 使用PyCurl - 希望它完全實現所有cURL選項。代理,但也可能需要其他交換機
  • 使用Python內置的單元testng

然後,我可以舉個例子,我想檢查每個服務的單元測試:

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

這是否有意義或者是否有更高層次的(但不太復雜的挑選和整合)工具?

轉載註明原文: 用curl測試RESTful API的系統方法?

一共有 1 個回答:

您可以查看諸如郵差這樣的工具,該工具專註於使用JavaScript測試REST API - 它具有一些不錯的功能,但你失去了Python的使用。

相反,我會建議查看REST相關的插件,用於 pytest ,一個Python測試框架這樣可以簡化測試代碼,同時仍然運行使用 unittest 編寫的測試。

  • 例如,編寫參數化測試可避免無聊和容易出錯的重復測試代碼。

Pytest擁有大量簡化各種任務的插件,包括:

  • Tavern, which specialises in testing REST APIs and seems highly relevant here - sort of "Postman for Python unit tests".

  • pytest-curl-report - when testing with the requests library, will print a curl command you can use to reproduce the error from shell.

  • Testinfra - focuses on server testing (e.g. state of OS packages, files, processes, etc, usually tested on remote servers) - strongly recommended if you also need this type e.g. to test Ansible code.

    • For those who use Puppet or Chef, Testinfra is similar to Beaker+RSpec, ServerSpec or Inspec.

如果你不喜歡Tavern,你當然可以使用 pycurlpytest ,這樣可以更容易地診斷出失敗的原因。來自 pytest-curl-report網站的這個例子僅使用泛型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允許你用普通的 assert 編寫所有的測試,並且可以包含一個有用的消息作為輸出的一部分。例如,你的一個測試可以寫成:

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