curl로 RESTful API를 테스트하는 체계적인 방법?


14

통합 테스트 중에 실제로 편안한 API (또는 일반적인 HTTP 인터페이스)를 사용하여 반복 사용 사례에서 작업하고 있음을 알았습니다 .bash + cURL로 여기 저기 확인하십시오.

꽤 지저분 해 보이며 유지하기가 더 어려워집니다. 왜 엉망이 되나요?

일반적인 사용 사례는 다음과 같습니다.

  • URL이 http 응답 코드 (예 : 200)를 반환하는지 확인
  • 이 경우 콘텐츠 유형이 필요한 일부 MIME과 일치하는지 확인하십시오.
  • 리턴 된 컨텐츠가 일부 패턴과 일치하는지 또는 추상 유효성 검증 절차를 통과하는지 확인하십시오.

내가 지금까지 발견하고 바퀴를 재발 명하지 않고 실행 가능한 옵션을 고려하는 것은 다음과 같습니다.

  • PyCurl을 사용하십시오-모든 cURL 옵션 esp를 완전히 구현하기를 바랍니다. 프록 싱뿐만 아니라 필요한 다른 스위치
  • 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()

이것이 의미가 있거나 더 높은 수준의 툴을 가져 오거나 통합하기에는 너무 복잡한가?


1
API 코드는 무엇입니까? 통합 테스트 시스템이 많이 있으며, 하나의 선택은 일반적으로 테스트중인 코드와 동일한 언어로 수행되므로 동일한 개발자가 두 가지를 모두 업데이트 할 수 있습니다.
Tensibai

이것은
이종일

1
팀이 더 편한 언어는 무엇입니까? 모든 도구는 bash + curl에서 capistrano post deploy hooks에 이르기까지 이런 종류의 것들을 테스트 할 것입니다.
Tensibai

2
Chef 에코 시스템에서는 http 리소스로 질문에 답변 할 수 있는 inspec 을 찾을 수 있지만 serverspec / rspec을 기반으로하므로 파이썬 세계보다 루비 세계이지만 시도할만한 가치가 있습니다.
Tensibai

2
내가 봤는데 REST 호출 할 몇 가지 파이썬 코드 작업을 사용하여 파이썬의 요청 라이브러리를 . 원하는 헤더를 추가하고 HTTP 프록시 지원을 지원하므로 curl의 모든 기능을 지원할 수 있어야합니다. 귀하의 필요에 따라 내 코드를 빌리거나 도움이 될 경우 예제로 사용할 수 있습니다.
James Shewey

답변:


7

JavaScript로 REST API 테스트에 중점을 둔 Postman 과 같은 도구를 볼 수 있습니다. 멋진 기능이 있지만 Python을 사용하지 못하게됩니다.

대신 테스트 코드를 단순화 하면서을 사용하여 작성된 테스트를 실행하는 Python 테스트 프레임 워크 인 pytest 용 REST 관련 플러그인을 살펴 보는 것이 좋습니다 unittest.

Pytest에는 다음을 포함하여 다양한 작업을 단순화하는 거대한 플러그인 세트가 있습니다.

  • REST API 테스트에 특화된 Tavern 은 "Python Postman for Python 단위 테스트"와 관련이 있습니다.

  • pytest-curl-report-requests 라이브러리로 테스트 할 때 curl쉘에서 오류를 재현하는 데 사용할 수 있는 명령을 인쇄합니다 .

  • Testinfra- 서버 테스트 (예 : OS 패키지, 파일, 프로세스 등, 일반적으로 원격 서버에서 테스트)에 중점을 둡니다. 예를 들어 Ansible 코드를 테스트하는 데이 유형이 필요한 경우 강력히 권장됩니다.

    • Puppet 또는 Chef를 사용하는 사용자의 경우 Testinfra는 Beaker (RSpec 포함), ServerSpec 또는 InSpec과 유사합니다.

당신이 선술집 마음에 들지 않으면, 당신이 할 수있는 코스 사용 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.