Một cách có hệ thống để kiểm tra API RESTful với curl?


14

Tôi đã nhận thấy trong quá trình kiểm tra tích hợp rằng tôi thực sự làm việc với các trường hợp sử dụng định kỳ với các API yên tĩnh (hoặc trong các giao diện HTTP chung) Tôi kiểm tra ở đây và ở đó với bash + cURL.

Nó bắt đầu trông khá lộn xộn và khó bảo trì hơn. Tại sao giao hàng lộn xộn?

Các trường hợp sử dụng điển hình là:

  • Kiểm tra xem một URL trả về mã phản hồi http, ví dụ 200
  • Kiểm tra loại nội dung phù hợp với một số MIME bạn cần trong trường hợp đó
  • Kiểm tra xem nội dung được trả về khớp với một số mẫu hoặc vượt qua quy trình xác thực trừu tượng

Những gì tôi đã tìm thấy cho đến nay và xem xét một lựa chọn khả thi mà không cần phát minh lại bánh xe, là:

  • hãy đồng hành cùng PyCurl - với hy vọng nó sẽ thực hiện đầy đủ tất cả các tùy chọn cURL đặc biệt. ủy quyền nhưng cũng có các công tắc khác tôi có thể cần
  • sử dụng Pythonng tích hợp sẵn

Sau đó, tôi có thể có một thử nghiệm đơn vị cho mỗi dịch vụ tôi muốn kiểm tra:

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

Điều này có ý nghĩa hay có một công cụ cấp cao hơn (nhưng không quá phức tạp để chọn và tích hợp) không?


1
Mã API là gì? có một loạt các hệ thống kiểm thử tích hợp và việc chọn một hệ thống thường được thực hiện trên cùng một ngôn ngữ như mã đang được kiểm tra để cùng một nhà phát triển có thể cập nhật cả hai.
Tensibai

đây có thể là dị thể và tôi không kiểm soát được
Peter

1
Vì vậy, ngôn ngữ mà nhóm của bạn là thoải mái hơn là gì? Mọi công cụ sẽ làm để kiểm tra loại điều này, từ bash + curl đến móc triển khai bài capistrano ...
Tensibai

2
Trong hệ sinh thái đầu bếp, bạn sẽ tìm thấy Inspec có thể trả lời câu hỏi của bạn bằng tài nguyên http , nhưng nó dựa trên máy chủ / rspec, vì vậy đó là một thế giới ruby ​​hơn thế giới python nhưng có thể đáng để thử.
Tensibai

2
Tôi đã làm việc với một số mã python để thực hiện các cuộc gọi REST bằng thư viện yêu cầu của Python . Nó sẽ cho phép bạn thêm bất kỳ tiêu đề nào bạn muốn và hỗ trợ hỗ trợ proxy HTTP (s), do đó, nó sẽ có khả năng hỗ trợ tất cả các tính năng của curl. Bạn có thể mượn mã của tôi cho nhu cầu của bạn hoặc sử dụng nó làm ví dụ nếu nó hữu ích.
James Shewey

Câu trả lời:


7

Bạn có thể xem các công cụ như Postman tập trung vào kiểm tra API REST bằng JavaScript - nó có một số tính năng hay nhưng bạn mất việc sử dụng Python.

Thay vào đó, tôi khuyên bạn nên xem xét các plugin liên quan đến REST để tìm pytest , khung kiểm tra Python giúp đơn giản hóa mã kiểm tra của bạn, trong khi vẫn chạy các kiểm tra được viết bằng cách sử dụng unittest.

Pytest có một bộ plugin khổng lồ giúp đơn giản hóa các tác vụ khác nhau, bao gồm:

  • Tavern , chuyên kiểm tra API REST và có vẻ rất phù hợp ở đây - loại "Người đưa thư cho bài kiểm tra đơn vị Python".

  • pytest-curl-report - khi kiểm tra với requeststhư viện, sẽ in một curllệnh bạn có thể sử dụng để tái tạo lỗi từ shell.

  • Testinfra - tập trung vào kiểm tra máy chủ (ví dụ: trạng thái của các gói, tệp, quy trình, v.v., thường được thử nghiệm trên các máy chủ từ xa) - rất khuyến khích nếu bạn cũng cần loại này, ví dụ như để kiểm tra mã Ansible.

    • Đối với những người sử dụng Puppet hoặc Chef, Testinfra tương tự như Beaker (với RSpec), ServerSpec hoặc InSpec.

Nếu bạn không thích Tavern, tất nhiên bạn có thể sử dụng pycurlvới pytest, điều này giúp chẩn đoán chính xác những gì thất bại. Ví dụ này từ trang báo cáo pytest-curl chỉ sử dụng các tính năng pytest chung:

$ 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 cho phép bạn viết tất cả các bài kiểm tra một cách đơn giản assertvà tùy ý bao gồm một thông điệp hữu ích như một phần của đầu ra. Ví dụ: một trong những bài kiểm tra của bạn có thể được viết:

def test_2():
    assert pycurl.response("some_url").matches ("xxx"), "xxx not found in response"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.