วิธีจำลอง REST API ได้อย่างไร


13

ฉันกำลังทำงานในโครงการใหม่ซึ่งจะสืบค้นข้อมูลจาก API REST ของบุคคลที่สาม นี่เป็นฟีดข้อมูลกีฬาแบบเรียลไทม์ดังนั้นฟีดจะใช้งานได้เฉพาะเมื่อมีเกมเกิดขึ้นจริง

แม้ว่าบุคคลที่สามจะให้เอกสารที่ดี (XSD ฯลฯ ) พวกเขาไม่มีวิธีจำลองเกมที่เกิดขึ้นและเพื่อทดสอบรหัสที่ฉันเขียนกับ API นี้ฉันจะต้องรอให้เกมเกิดขึ้นจริง

การขอความช่วยเหลือเพียงอย่างเดียวของฉันคือการเขียนรหัสเพื่อจำลองเกมด้วยตัวเอง แต่ดูเหมือนว่าจะทำงานได้มากมาย คุณจะเข้าใกล้สิ่งนี้อย่างไร


5
ข้อมูลนี้ซับซ้อนแค่ไหน? ในกรณีส่วนใหญ่ฉันจะทำให้วัตถุที่จัดการกับข้อมูลไม่สมบูรณ์ ใช้ข้อมูลจากเซสชันเกมก่อนหน้า (อาจซับซ้อนเกินไปสำหรับการทดสอบ) หรือวิเคราะห์ข้อมูลและแยกประเภทข้อมูลที่เกี่ยวข้อง เก็บไว้ในไฟล์และฟีดไปยังโปรแกรมหลักของคุณราวกับว่ามันมาจากแหล่งที่มาจริง
thorsten müller

2
กรณีการใช้งานที่สมบูรณ์แบบสำหรับการจำลองวัตถุ: //en.wikipedia.org/wiki/Mock_object
kevin cline

คำตอบ:


15

นี่คือกรณีการใช้งานที่สมบูรณ์แบบสำหรับวัตถุจำลอง มีห้องสมุดที่ล้อเลียนสำหรับทุกภาษายอดนิยม คุณต้องการจำลองวัตถุที่ให้บริการตอบกลับ REST เพื่อส่งคืนข้อมูลทดสอบ คุณสามารถสร้างข้อมูลทดสอบด้วยตนเองหรือรวบรวมจากการโทรก่อนหน้านี้ไปยังระบบจริง


1
ปัญหาที่นี่ไม่ได้เป็นหนึ่งในรหัส มันเป็นหนึ่งในข้อมูล ฉันจะเยาะเย้ยออก mocks API หรือไม่สมบูรณ์ แต่ปัญหาคือการสร้างข้อมูลปลอมว่ามันจะให้ฉัน
dferraro

@dferraro: สิ่งที่หยุดคุณจากการสำรวจบริการในครั้งต่อไปที่มีเกมและทิ้งข้อมูลนั้นไปยังไฟล์ เมื่อคุณสามารถทำเช่นนั้นและคุ้นเคยกับรูปแบบแล้วคุณสามารถสร้างไฟล์ใหม่ (หรือไฟล์) ด้วยกรณีทดสอบเฉพาะ
Steven Evers

4

รอจนกว่าเกมจะเกิดขึ้น บันทึกทุกเหตุการณ์จากฟีด เขียนโปรแกรมจำลองที่ไกลเหตุการณ์ในเวลาที่เหมาะสม Voila คุณมีโปรแกรมจำลองฟีดพร้อมข้อมูลจริง


หากคุณเป็นผู้ใช้ Ruby คุณสามารถใช้VCRสำหรับการดักจับและเล่นการตอบกลับ HTTP อีกครั้ง
dusan

2

ฉันขอแนะนำให้เขียนโปรแกรมจำลองของคุณเอง คุณสามารถใช้มันเพื่อทดสอบสถานการณ์ทุกประเภท

  • เซิร์ฟเวอร์ยอมรับการเชื่อมต่อ แต่ไม่ตอบสนอง
  • เซิร์ฟเวอร์หมดเวลา
  • เซิร์ฟเวอร์ส่งการตอบกลับขยะ ฯลฯ ...

เมื่อก่อนหน้านี้ฉันเคยใช้ค่า "พิเศษ" ในข้อความคำขอเพื่อขอให้เครื่องจำลองทำสิ่งที่ฉันต้องการ สิ่งนี้ยังทำให้สามารถทำการทดสอบแบบครบวงจรโดยไม่ต้องออกไปนอกสภาพแวดล้อมการพัฒนาของคุณ

แก้ไข:ตัวอย่างเช่นถ้าโครงการของคุณส่ง XML เพื่อบริการของบุคคลที่ 3 <value>50.00</value>คำขออาจรวมถึงเช่น ตัวจำลองสามารถเขียนโค้ดได้ (หรือดีกว่ากำหนดค่า) เพื่อให้ 50.00 => ระเบิด 60.00 => ขยะ 70.00 => ปิดการเชื่อมต่อและอื่น ๆ แนวคิดคือพฤติกรรมของตัวจำลองขึ้นอยู่กับอินพุตซึ่งคุณควบคุมในแต่ละกรณีทดสอบ


ขอบคุณ คุณสามารถยกตัวอย่างสิ่งที่คุณหมายถึงเกี่ยวกับค่า 'พิเศษ' ได้หรือไม่?
dferraro

1
อธิบายเพิ่มเติมคำตอบของฉัน
Rory Hunter

2

พิจารณาแล้วว่าเจ้ามือรับแทงให้ข้อมูลตัวอย่างบางส่วน (และสามารถบันทึกได้ในระหว่างขั้นตอนการรวมระบบ) คำแนะนำของฉันคือจัดระเบียบฟีดเหล่านั้นด้วยวิธีนี้:

  • รายการของเหตุการณ์
  • อัปเดตสำหรับกิจกรรมที่กำหนด
  • อัพเดทราคา
  • ผล

ผู้ให้บริการอาจเสนอการอัปเดต 2 ประเภท: Push (POST) และ Pull (GET)

ณ จุดนี้คุณควร

  1. สร้างเซิร์ฟเวอร์อย่างง่ายที่เพิ่งจัดการการร้องขอ GET เพื่อให้โปรแกรมเมอร์ของคุณสามารถอธิบายอัลกอริทึม
  2. สร้างระบบอัตโนมัติเพื่อจัดการการส่งข้อมูลเดียวกันและอาจทำให้ระบบของคุณเครียด

จัดการการพัฒนาและการทดสอบ

โดยไม่ต้องไปในรายละเอียดของเทคโนโลยีที่จะนำมาใช้คุณจะได้รับมินิเซิร์ฟเวอร์ซึ่งตอบสนองเพียง 4 URL ที่ (หรือผู้ที่จำเป็นขึ้นอยู่กับสิ่งที่มีผู้ให้บริการ) และบริการมินิผลักดัน

สิ่งที่ดีมากที่ควรคำนึงถึงเมื่อทำงานกับ "mini-server" คือตัวจัดการของโปรโตคอล HTTP สร้างเซิร์ฟเวอร์บนพอร์ต 80 นั้นง่ายมากและแก้ปัญหาได้ คุณต้องแน่ใจว่าได้ฉีดข้อมูลทั้งหมดในการตอบกลับ GET ตามที่ผู้ให้บริการทำ (สิ่งนี้จะหลีกเลี่ยงปัญหาเมื่อนำไปผลิต)

ส่วนตัวฉันจะทำเซิร์ฟเวอร์ Perl ง่าย ๆหรือแบบเดียวกันแต่ใช้ Nodejs เกี่ยวกับการฉีดข้อมูลจะเพียงพอตัวจับเวลาซึ่งเรียกใช้เบราว์เซอร์ออฟไลน์ ( CURL , WGET )


2

ฉันจำลอง REST API โดยใช้การรวมกันของ cucumberjs, phantomjs กับการตั้งค่าพร็อกซีเซิร์ฟเวอร์เป็น 127.0.0.1 และเชื่อมโยงกระบวนการ node.js กับhttp-proxyและที่nockนั่น CucumberJS ไม่ได้เป็นส่วนสำคัญคุณสามารถเขียนสถานการณ์ทดสอบได้ทุกวิธีส่วนที่เหลือเป็นกุญแจสำคัญในการจำลอง สามารถเยาะเย้ยได้ง่ายๆโดยจับคู่ request-return-data แต่คุณสามารถกรองตามรูปแบบและฟังก์ชั่น hook callback เพื่อสร้างการตอบกลับดังนั้นคุณสามารถจำลองระดับความละเอียดที่คุณต้องการได้ เซิร์ฟเวอร์ตัวอย่างเต็มรูปแบบ แต่คุณสามารถทำได้แบบเพิ่มหน่วย)

มันใช้งานได้ดี:

  1. แฟนทอมขอ URI
  2. คำขอไปที่พร็อกซีเซิร์ฟเวอร์ที่ 127.0.0.1:port
  3. Node.js http-proxyของคุณดำเนินการมอบฉันทะมันโปร่งใสไปข้างหน้าโดยใช้ ดังนั้นการโหลด "ปกติ" ใด ๆ (หน้าภาพ) จะทำงาน
  4. หากคุณเลือกที่จะดักจับการร้องขอบางอย่าง (API ส่วนใหญ่) คุณจะใช้nockมัน

ในสถานการณ์ของฉันฉันรวมเข้ากับการทดสอบแตงกวา js ในกระบวนการเดียวกันดังนั้นมันจึงเป็น:

  1. ทดสอบการทำงาน
  2. มันตั้งค่าการnockเยาะเย้ย HTTP สำหรับสถานการณ์ที่ทดสอบ
  3. มันโหลดหน้าเว็บใน phantomjs ผ่านโปรโตคอลซีลีเนียม

ส่วนที่เหลือแสดงดังที่กล่าวไว้ก่อนหน้าในย่อหน้านี้ (กล่าวคือเป็นบิตของวงจรฉันในฐานะนักวิ่งทดสอบสั่งให้ phantomjs โหลดหน้าเว็บซึ่งส่งต่อคำขอทั้งหมดกลับมาให้ฉันและฉันส่งต่อไปยังเน็ตหรือสกัดกั้น ถ้าเป็น API ที่ทดสอบแล้ว)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.