วิธีที่เป็นระบบในการทดสอบ RESTful API ด้วย curl หรือไม่


14

ฉันสังเกตเห็นในระหว่างการทดสอบการรวมระบบว่าฉันใช้งานกรณีการใช้ซ้ำ ๆ กับ API ที่พักผ่อนหย่อนใจ (หรืออินเทอร์เฟซ HTTP ทั่วไป) ฉันตรวจสอบที่นี่และมี bash + cURL

มันเริ่มมองค่อนข้างยุ่งและยากที่จะรักษา ทำไมต้องเป็นระเบียบ?

กรณีการใช้งานทั่วไปคือ:

  • ตรวจสอบว่า URL ส่งคืนรหัสตอบกลับ http เช่น 200
  • ตรวจสอบว่าประเภทเนื้อหาตรงกับ MIME บางอย่างที่คุณต้องการในกรณีนั้น
  • ตรวจสอบว่าเนื้อหาที่ส่งคืนตรงกับรูปแบบบางอย่างหรือผ่านขั้นตอนการตรวจสอบความถูกต้องแบบนามธรรม

สิ่งที่ฉันได้พบและพิจารณาตัวเลือกใช้การได้โดยไม่ต้อง reinventing ล้อคือ:

  • ไปกับ 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()

สิ่งนี้สมเหตุสมผลหรือมีเครื่องมือในการรับและรวมที่ซับซ้อนมากขึ้น (แต่ไม่ซับซ้อนเกินไปหรือไม่)


1
รหัส API คืออะไร มีระบบทดสอบการรวมกลุ่มและการเลือกหนึ่งมักจะทำในภาษาเดียวกันกับรหัสที่ถูกทดสอบเพื่อให้ dev เดียวกันสามารถอัปเดตทั้งสอง
Tensibai

นี่อาจเป็น heterogeneuos และฉันไม่สามารถควบคุมได้
Peter Muryshkin

1
ดังนั้นภาษาของทีมของคุณจะสะดวกสบายกว่าคืออะไร? เครื่องมือทุกตัวจะทำเพื่อทดสอบสิ่งต่าง ๆ เช่น bash + curl ไปจนถึง capistrano post deploy hooks ...
Tensibai

2
ในระบบนิเวศของพ่อครัวคุณจะพบกับผู้ตรวจสอบซึ่งสามารถตอบคำถามของคุณได้ด้วยทรัพยากร httpแต่ขึ้นอยู่กับ serverspec / rspec ดังนั้นมันจึงเป็นโลกทับทิมมากกว่าโลกหลาม แต่อาจคุ้มค่ากับการลอง
Tensibai

2
ฉันใช้รหัสหลามเพื่อทำการเรียกใช้RESTโดยใช้ไลบรารี่ของ Python มันจะช่วยให้คุณเพิ่มส่วนหัวใด ๆ ที่คุณต้องการและรองรับการสนับสนุนพร็อกซี HTTP (s) ดังนั้นจึงควรมีความสามารถในการสนับสนุนคุณสมบัติทั้งหมดของ curl คุณสามารถยืมรหัสของฉันสำหรับความต้องการของคุณหรือใช้เป็นตัวอย่างถ้ามันเป็นประโยชน์
James Shewey

คำตอบ:


7

คุณสามารถดูเครื่องมือเช่นบุรุษไปรษณีย์ที่มุ่งเน้นการทดสอบ REST APIs ด้วย JavaScript - มันมีคุณสมบัติที่ดีบางอย่าง แต่คุณสูญเสียการใช้ Python

แต่ฉันขอแนะนำให้มองหาที่ปลั๊กอิน REST ที่เกี่ยวข้องกับpytestunittestกรอบการทดสอบหลามที่ช่วยลดรหัสการทดสอบของคุณในขณะที่การทดสอบยังคงทำงานเขียนโดยใช้

Pytest มีชุดปลั๊กอินขนาดใหญ่ที่ทำให้การทำงานต่างๆง่ายขึ้นรวมถึง:

  • Tavernซึ่งเชี่ยวชาญในการทดสอบ REST API และดูเหมือนว่ามีความเกี่ยวข้องสูงที่นี่ - การเรียงลำดับของ "บุรุษไปรษณีย์สำหรับการทดสอบหน่วยหลาม"

  • pytest-curl-report - เมื่อทำการทดสอบกับไลบรารี่requestsจะพิมพ์curlคำสั่งที่คุณสามารถใช้เพื่อสร้างข้อผิดพลาดจากเชลล์

  • Testinfra - มุ่งเน้นไปที่การทดสอบเซิร์ฟเวอร์ (เช่นสถานะของแพคเกจระบบปฏิบัติการ, ไฟล์, กระบวนการ, ฯลฯ โดยปกติแล้วจะทดสอบบนเซิร์ฟเวอร์ระยะไกล) - แนะนำอย่างยิ่งหากคุณต้องการประเภทนี้เช่นเพื่อทดสอบรหัส Ansible

    • สำหรับผู้ที่ใช้ Puppet หรือ Chef Testinfra นั้นคล้ายกับ Beaker (ที่มี RSpec), ServerSpec หรือ InSpec

หากคุณไม่ชอบโรงเตี๊ยมคุณสามารถใช้pycurlกับแน่นอนpytestซึ่งทำให้ง่ายต่อการวินิจฉัยสิ่งที่ล้มเหลว ตัวอย่างจากไซต์ 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.