- เครื่องมือคอมมานด์ไลน์โอเพนซอร์ส ที่สามารถ ส่งคำขอ HTTP ด้วยรูปแบบไฟล์ข้อความที่เรียบง่าย พร้อมทั้งเชื่อมหลายคำขอเข้าด้วยกัน ดึงค่าจากผลลัพธ์ และทำคิวรี/ตรวจสอบเนื้อหาและเฮดเดอร์ของการตอบกลับได้
- รองรับ API หลากหลายประเภท เช่น REST, SOAP, GraphQL รวมถึงคำขอที่อิงกับ HTML/XML/JSON และเหมาะทั้งสำหรับ การดึงข้อมูลและการทดสอบ HTTP session
- รองรับ การเชื่อมคำขอ การจับค่า และการตรวจสอบหลากหลายรูปแบบ เช่น สถานะโค้ด เฮดเดอร์ และบอดี อีกทั้งยังเหมาะกับ การเชื่อมต่อ CI/CD และงานอัตโนมัติ ผ่านรายงานแบบ Junit, TAP, HTML, JSON เป็นต้น
- แจกจ่ายในรูปแบบ ไฟล์รันได้เดี่ยวที่พัฒนาด้วย Rust จึง ติดตั้งได้ง่าย และภายในใช้ เอนจิน libcurl เพื่อมอบ ความเร็วสูงและความเข้ากันได้ของโปรโตคอลที่แข็งแกร่ง
- ได้รับการประเมินว่าเป็น เครื่องมืออัตโนมัติสำหรับการทดสอบ HTTP ยุคใหม่ ที่มีทั้งไวยากรณ์กระชับ ความสามารถในการขยาย และฟีเจอร์ที่หลากหลาย เมื่อเทียบกับเครื่องมือคู่แข่ง
- ในฐานะ โอเพนซอร์สที่ขับเคลื่อนโดยชุมชน รูปแบบ ข้อความที่เข้าใจง่ายและขยายได้ ทำให้ทั้งนักพัฒนาและ DevOps ใช้งานได้อย่างมีประสิทธิภาพสูง
Hurl คืออะไร?
- Hurl เป็นเครื่องมือที่ให้เขียนคำขอ HTTP ในรูปแบบข้อความที่ชัดเจนและเข้าใจง่าย แล้วรันผ่านคอมมานด์ไลน์ได้
- สามารถ เชื่อมหลายคำขอเข้าด้วยกันเหมือนเป็นสายงาน, ดึงค่าจากผลลัพธ์ หรือใช้คิวรีหลากหลายแบบ (เช่น เฮดเดอร์ บอดี สถานะโค้ด) เพื่อ ทดสอบสถานการณ์ HTTP ที่ซับซ้อน ได้
- สร้างบนพื้นฐาน เอนจิน libcurl จึงมีความน่าเชื่อถือสูง และ รองรับโปรโตคอลสมัยใหม่อย่าง IPv6, HTTP/3
- รองรับทั้ง การดึงข้อมูล การทดสอบสถานการณ์ และการวัดประสิทธิภาพ (เช่น เวลาตอบสนอง)
- เหมาะอย่างยิ่งสำหรับ การสร้างรายงาน (Junit, TAP, HTML ฯลฯ) และการเชื่อมเข้ากับ CI/CD pipeline
- รองรับ API หลายประเภท เช่น REST, SOAP, GraphQL, HTML, XML, JSON และยังรองรับ การพาร์สบอดี (เช่น XPath, JSONPath)
- ต่อไปนี้คือ จุดแข็งสำคัญของ Hurl เมื่อเทียบกับเครื่องมือทดสอบ HTTP อื่น ๆ (เช่น Postman, curl):
- เขียนเป็น plain text ได้ จึงเหมาะกับการจัดการเวอร์ชันและการทำงานร่วมกัน
- มีไบนารีเดี่ยวขนาดเล็กที่เขียนด้วย Rust โดยไม่ต้องใช้รันไทม์เพิ่มเติม
- ใช้เอนจินเครือข่ายเดียวกับ curl (libcurl) จึงเชื่อถือได้และรองรับโปรโตคอลหลากหลาย
- รองรับรูปแบบหลากหลาย เช่น REST, SOAP, GraphQL, HTML และตั้งค่าสถานการณ์ที่ซับซ้อนได้
- ผสานเข้ากับ CI/CD, ระบบทดสอบอัตโนมัติ และรายงานแบบละเอียด (JUnit, HTML, TAP ฯลฯ) ได้ง่าย
สรุปฟีเจอร์หลัก
-
การทำงานพื้นฐาน
- เขียนคำขอ HTTP หลายรายการต่อเนื่องกันในไฟล์ Hurl (.hurl) แล้วรันตามลำดับ
- ดึงค่าจากการตอบกลับของแต่ละคำขอ ตรวจสอบเงื่อนไข และส่งต่อข้อมูลไปยังคำขอถัดไปได้
- รองรับรูปแบบหลากหลาย เช่น REST/JSON, SOAP/XML, GraphQL, HTML
-
การเชื่อมคำขอและการใช้ตัวแปร
- เขียนหลายคำขอแบบ chain ภายในไฟล์เดียว
- ใช้ไวยากรณ์ Captures เพื่อดึงค่าจากการตอบกลับ แล้วนำไปใส่เป็นตัวแปรในคำขอถัดไป
- ดึงและใช้งานข้อมูลผ่าน XPath, JSONPath, regular expression, โครงสร้างของบอดี เป็นต้น
-
รูปแบบคำขอและการตรวจสอบที่หลากหลาย
- รองรับการตั้งค่ารายละเอียดคำขอหลากหลาย เช่น query parameter, header, การยืนยันตัวตน
- ใช้ไวยากรณ์ [Asserts] หรือไวยากรณ์แบบ implicit เพื่อตรวจสอบสถานะโค้ด บอดี เฮดเดอร์ คุกกี้ เวลาตอบสนอง แฮช ฯลฯ
- ใช้ XPath, JSONPath ได้ และสามารถทดสอบทั้ง REST/GraphQL/SOAP รวมถึงเนื้อหา HTML
- รองรับการตรวจสอบหลายค่า บอดี/แฮชของการตอบกลับ คุณสมบัติของใบรับรอง การหน่วงของคำขอ/การตอบกลับ และการจัดการข้อมูลไบนารี
-
รายงานการทดสอบและการเชื่อมต่อระบบอัตโนมัติ
- แสดงผลลัพธ์การรันเป็นรายงานได้หลายรูปแบบ เช่น text, HTML, JUnit, TAP, JSON
- ผสานเข้ากับ CI/CD pipeline ได้อย่างง่ายดาย
-
การควบคุมขั้นสูงและฟังก์ชันที่มีประโยชน์
- ส่งต่อข้อมูลระหว่างคำขอ (capture และการทำเป็นตัวแปร)
- ฟังก์ชันสร้างข้อมูลแบบไดนามิก (newUuid, newDate เป็นต้น)
- ปรับแต่งตัวเลือกแยกตามคำขอ
- รองรับ polling/retry, delay ของคำขอ, skip, การปกปิดค่าลับ (redact)
- รองรับตัวเลือกแบบเดียวกับ curl (ใช้ curl option เดิมได้เลย)
- มีฟีเจอร์เฉพาะคลาวด์ในตัว เช่น การยืนยันตัวตนแบบ AWS Sigv4
ตัวอย่างการใช้งาน
ตัวอย่างการใช้งานที่พบได้บ่อย
- ทดสอบ API หลายประเภท เช่น REST/GraphQL/HTML/JSON/SOAP
- ดึงและนำค่ากลับมาใช้ซ้ำ เช่น CSRF token, ข้อมูลยืนยันตัวตนและสิทธิ์การเข้าถึง
- ตรวจสอบอย่างละเอียด เช่น สถานะโค้ด เฮดเดอร์ ข้อมูลในบอดี คุกกี้ ใบรับรอง SSL
- ทำงานอัตโนมัติและมอนิเตอร์สถานการณ์ของบริการจริง (เช่น ตั้งแต่ล็อกอินไปจนถึงการทำงานทางธุรกิจ)
- รองรับหลายแพลตฟอร์มและหลายวิธีติดตั้ง (Linux, macOS, Windows, Docker, npm, Cargo เป็นต้น)
ตัวเลือก CLI ที่สำคัญ
--test: โหมดทดสอบ (แสดงสรุปและรายงาน)
--report-html, --report-json, --report-junit, --report-tap: รองรับรูปแบบรายงานหลากหลาย
--parallel, --jobs N: รันแบบขนาน
--retry, --retry-interval: retry/รออัตโนมัติ
-u, --user: ป้อนข้อมูลการยืนยันตัวตน
--variable, --variables-file: กำหนดตัวแปร
-o, --output: บันทึกการตอบกลับเป็นไฟล์
--json: แสดงผลลัพธ์การรันในรูปแบบ JSON
วิธีติดตั้ง
ข้อได้เปรียบเมื่อเทียบกับเครื่องมือคู่แข่ง
- ได้เปรียบกว่าเครื่องมือ GUI อย่าง Postman, Insomnia ในด้านการทำงานแบบข้อความ การจัดการเวอร์ชัน และการเชื่อมกับ CI/CD
- เฉพาะทางมากกว่า curl สำหรับการทดสอบ การรันสถานการณ์ การตรวจสอบ และการทำรายงานอัตโนมัติ
- มีเส้นโค้งการเรียนรู้ต่ำกว่า เมื่อเทียบกับ DSL ที่ซับซ้อนอย่าง YAML หรือ JSON เพราะใช้ฟอร์แมตเฉพาะที่เข้าใจง่าย
3 ความคิดเห็น
Bruno - ไคลเอนต์ API โอเพนซอร์สที่รวดเร็วและเป็นมิตรกับ Git (ทางเลือกแทน Postman)
https://th.news.hada.io/topic?id=13730
Hurl 4.0.0 เปิดตัว
เมื่อ 2 ปีก่อนเป็นเวอร์ชัน 4.0 แต่ตอนนี้ออกมาถึง 6.1.1 แล้วครับ
ความคิดเห็นจาก Hacker News
ผมเพิ่งเริ่มใช้ hurl ในช่วงไม่กี่เดือนที่ผ่านมา
ชอบมากที่มันใช้ได้ทั้งโหมด test suite และโหมดเรียกใช้งานทีละคำขอ
ผมใช้มันรันชุดทดสอบ HTTP requests ใน CI
รู้สึกว่าภาษาคอนฟิกแบบบล็อกยังไม่ค่อย intuitive และเอกสารเกี่ยวกับ assertion ที่รองรับก็ยังขาดไปนิดหน่อย
โดยรวมแล้วตัวเครื่องมือมีคุณค่ามาก
ตอนทำ POC ผมเริ่มทดสอบ interface ด้วยวิธีนี้ และพบว่ามันช่วยงานพัฒนาแบบอิง LLM ได้ด้วย
พอเขียนเทสต์ไว้ตรงกับ HTTP method โดยตรง เทสต์กับ implementation ก็แยกจากกันได้ยืดหยุ่นขึ้นระหว่างที่โปรเจ็กต์ค่อย ๆ เปลี่ยนแปลง
การแยกเทสต์ออกมาทำให้เส้นแบ่งระหว่าง interface กับ implementation ชัดขึ้น
ก่อนใช้ hurl ผมเขียนเทสต์ด้วย testing framework ของภาษาที่ใช้ทำ service แต่พอเปลี่ยนมาใช้เทสต์แบบ hurl ก็ทำให้ยึดมุมมองแบบ 'ฝั่ง client' ได้อย่างเคร่งครัด
ไม่มีการเข้าถึงข้อมูลแบบ backdoor อะไรทำนองนั้น ทำให้ interface, test และ implementation ถูกแยกจากกันชัดเจนและวางใจได้
ขอบคุณสำหรับฟีดแบ็ก
ตอนเริ่มพัฒนาครั้งแรกเมื่อ 6~7 ปีก่อน ผมลองทั้ง JSON แล้วก็ตามด้วย YAML แต่สุดท้ายก็ค่อย ๆ มั่นใจว่าควรทำ file format ใหม่ขึ้นมาเอง
ผมเข้าใจดีว่าจากมุมผู้ใช้มันอาจดูแปลก ๆ
ผมพยายามใช้ไวยากรณ์ที่เรียบง่ายกับเคสที่ง่ายกว่า แต่ก็อาจยังไม่สมบูรณ์
เรื่องเอกสาร ถ้ามีจุดที่ยังขาดหรือควรปรับปรุง ก็หวังว่าจะได้รับความคิดเห็นอย่างเต็มที่และนำไปพัฒนาต่อ
Hurl เป็นเครื่องมือที่ยอดเยี่ยมมาก
ตอนก่อนหน้านี้ผมพอร์ตเว็บเซอร์วิสที่เขียนด้วย Python ไปเป็น Rust แล้วการมี public API tests ที่เข้มงวดช่วยได้มาก
เพราะสภาพแวดล้อม integration test ไม่ผูกกับภาษา เราเลยคง API หรือเว็บไซต์เดิมไว้ได้ แล้วเปลี่ยนแค่ backend
มีข้อดีพิเศษอีกอย่างเวลาใช้ Hurl กับ Rust
คือมันผสานกับ cargo test ได้ และใช้ hurl library ได้ตรง ๆ พร้อม reuse ไฟล์ .hurl เดิมได้เลย
เดโม: https://github.com/perrygeo/axum-hurl-test
ผมเริ่มใช้ Hurl ตั้งแต่เดือนกันยายน 2023
ก่อนหน้านี้รัน test suite ผ่าน Runscope แต่รำคาญมากที่การเปลี่ยนแปลงไม่ถูกจัดการด้วย version control
หลังจากเตรียมพื้นฐานแล้วก็ย้ายมาใช้ Hurl และเลิกใช้ Runscope ไปเลย
ตอนนี้ผมพอใจมาก เพราะดูออกได้ทันทีว่าใครเปลี่ยนอะไร เมื่อไร และทำไม
ทีมเราก็เคยพยายามแก้ปัญหานั้น แล้วโปรเจ็กต์ก็เสีย momentum ไปเลย
ผมคิดว่าแนวคิดนี้ดี แต่ก็ยังอดคิดไม่ได้ว่า ‘ทำไมต้องใช้มัน’
ผมพัฒนาใน Django ซึ่งความสามารถทดสอบที่มากับ framework ก็ครบมากอยู่แล้ว
การเพิ่มเครื่องมือจากภายนอกที่ไม่รู้จัก backend ของผมเลย ดูเหมือนจะเพิ่มภาระเรื่อง sync มากกว่า
และถ้ามีอะไรแปลก ๆ ก็จะกระโดดเข้า debugger ทันทีไม่ได้
แน่นอนว่ามีเหตุผลเรื่องการแยก test code กับ backend code ให้ชัดเจน แต่ในทางปฏิบัติค่าใช้จ่ายในการดูแลก็มากขึ้น
สุดท้ายก็คงต้องรัน native test suite อยู่ดี เลยรู้สึกแปลก ๆ ถ้าต้องใช้หลายเครื่องมือภายนอกควบคู่กัน
แต่ถ้าใช้เพื่อตรวจสอบว่า API ทำงานได้ทั่วไปแค่ไหน มันก็น่าจะมีประโยชน์
ผมก็คิดหนักเหมือนกันกับคำถามที่ว่า ทำไมต้องใช้เครื่องมือที่ไม่รู้จัก backend ของตัวเองแล้วเพิ่มภาระการ sync
ผมไม่เคยใช้ hurl แต่เคยใช้เครื่องมือทดสอบ API แบบไม่ผูกกับภาษามาหลายครั้ง และตอนนี้ก็กำลังพัฒนาอยู่เองด้วย
เหตุผลที่เครื่องมือแบบนี้ดูน่าสนใจก็คือ
เพราะโครงสร้างที่ตรวจแค่ input-output ทำให้ไม่ต้องพึ่งพา logic ภายใน
เช่น เวลาย้าย public API จาก Perl ไป Go ก็ใช้ Perl API เดิมเป็น non-regression tests แล้วเอาเทสต์ชุดเดิมไปรันกับ Go API ได้ตรง ๆ ทำให้มั่นใจขึ้นมาก
มองมันเป็นตัวแทนของผลิตภัณฑ์อย่าง Postman ก็ได้
ถ้าต้องการแค่ทดสอบ http requests ง่าย ๆ ไม่กี่รายการ ก็ไม่จำเป็นต้องเปิดหน้าต่างหนัก ๆ ที่สร้างบน Electron
มันอยู่กึ่งกลางระหว่าง curl script กับ Postman และเหมาะมากสำหรับคนที่ต้องการทั้งความเบาและความสะดวก
ตอนที่เราย้ายจาก ktor web server ไปเป็นโค้ดที่อิง spring boot (สแตก Java/Kotlin) เราใช้ Hurl
เพราะเราสามารถดูแล test suite ระดับสเปกได้โดยไม่ขึ้นกับ server stack การย้ายจึงราบรื่นมาก
อีกอย่าง เราใช้ Docker image ใน production ด้วย เลยใช้ Hurl ทำ integration tests ให้เบาและเป็นอิสระได้มาก แทนที่จะใช้เครื่องมือที่ผูกกับ implementation มากเกินไป
ส่วน samples (https://github.com/Orange-OpenSource/hurl?tab=readme-ov-file#samples) ให้ความรู้สึกโน้มน้าวมากสำหรับคนที่อยากเข้าใจจุดเด่นของเครื่องมือใน 5 นาที หรือคนที่ชอบตัดสินล่วงหน้า
บางครั้งผมก็เป็นแบบนั้นเหมือนกัน และมันน่าประทับใจจริง ๆ
ผมเป็น maintainer ของ Hurl
ยินดีรับคำถามหรือฟีดแบ็กเสมอ
เป็นแพตเทิร์นที่ทั้งผมและนักพัฒนารอบตัวใช้กันบ่อย คือเขียนเทสต์เป็นไฟล์ ".http" ที่รันได้ผ่าน IDE extension ของ VS Code หรือ IDEA
รูปแบบตัวอย่างคือ
จากนั้นก็เทียบ output แบบ 1:1 กับไฟล์ "expected.json" เพื่อทำ integration test
เรารันไฟล์เหล่านี้ด้วย cURL และ bespoke bash scripts แล้วใช้ jq เทียบผล พร้อม log success/failure ลง console
อยากรู้ว่าใน Hurl สามารถกำหนดตัวอย่าง HTTP requests และ expected results แบบอิงไฟล์ JSON ใน IDE ได้ประมาณนี้ไหม
แล้ว Hurl สามารถรันหลายไฟล์ในโฟลเดอร์แบบอัตโนมัติได้หรือเปล่า
Hurl ถูกประเมินค่าต่ำเกินไปในแง่ที่ทำให้เขียน HTTP-level test suite ได้อย่างสวยงามและดูแลง่าย
ขอบคุณที่พัฒนาเครื่องมือแบบนี้ขึ้นมา
ผมชอบชื่อ Hurl มาก
รู้สึกได้เลยว่าคนตั้งชื่อมีเซนส์สุด ๆ
ผมใช้ Hurl อยู่พักหนึ่งแล้วก็เคยมีส่วนร่วมพัฒนาโดยตรงด้วย
อยากรู้ว่ามีโอกาสจะมีฟีเจอร์ "include" ไหม
ขอบคุณที่ดูแลโครงการนี้อย่างต่อเนื่อง
อยากรู้ว่าวิสัยทัศน์และอนาคตของ Hurl ในอีก 2 ปีข้างหน้ามองไว้แบบไหน
ผมได้รับแรงบันดาลใจจากโปรเจ็กต์นี้มากจนออกแบบเครื่องมือทดสอบ HTTP ของตัวเอง
เราจำเป็นต้องรันเทสต์หลายร้อยรายการแบบขนานอย่างรวดเร็ว และถ้าคุณชอบ Hurl เครื่องมือชื่อ Nap ก็น่าจะน่าสนใจเหมือนกัน
ถ้ามีหน้าที่สรุปความแตกต่างไว้ก็ช่วยบอกที
ดูน่าสนใจดี
เดิมทีผมใช้ Vscode-restclient มานาน แต่ช่วงหลังเริ่มย้ายไปใช้ httpyac สำหรับงาน script และ CLI
ผมตั้งใจจะดูว่า Hurl ตรงกับสิ่งที่ผมต้องการไหม
เรื่องหนึ่งที่ทำให้ใช้เครื่องมือเทสต์แล้วติดขัดคือ ในไฟล์
.httpยังไม่มีมาตรฐานสำหรับอ้างอิงผลลัพธ์จากคำขอหนึ่งไปเป็นอินพุตของคำขอถัดไปเครื่องมือทั้งสามที่ผมเคยใช้มาทำเรื่องนี้คนละแบบหมด
hurl ใช้ [Captures]
Vscode-restclient อ้างชื่อคำขอจากการประกาศตัวแปร
httpyac ใช้ไวยากรณ์ @ref
syntax ของแต่ละตัวต่างกันหมด พอเขียนให้เครื่องมือหนึ่ง อีกที่ก็มักใช้ไม่ได้
ลิงก์อ้างอิงที่เกี่ยวข้อง
เอกสาร capture ของ hurl
Vscode-restclient
เอกสาร ref ของ httpyac
ขอโทษที่ต้องสร้าง file format ขึ้นมาอีกแบบ!
วิธีหนึ่งที่อาจช่วยลดปัญหานี้ได้บ้างคือใช้
hurlfmthurlfmt สามารถ export ไฟล์ Hurl ออกมาเป็น JSON ได้
คุณอาจใช้ผลลัพธ์ JSON นี้ไปทำตัวแปลงไปมาระหว่างเครื่องมืออื่น ๆ ได้
มันไม่ใช่คำตอบวิเศษที่แก้ได้ทุกอย่าง แต่ก็น่าจะช่วยได้บ้างเวลาอยากย้ายจาก Hurl ไปยังฟอร์แมตอื่น
ทั้ง Visual Studio Code และ Visual Studio ต่างก็รองรับไฟล์ .HTTP แต่กลับเข้ากันไม่ได้
น่าสนใจดีในฐานะตัวอย่างของ Conway's Law ที่เกิดขึ้นจริง
ดูคล้ายกันอยู่บ้าง
https://marketplace.visualstudio.com/items?itemName=humao.rest-client
VS Code extension ตัวนี้ทรงพลังมากสำหรับการทดสอบเกี่ยวกับ HTTP
ความแตกต่างสำคัญมากคือมันใช้งานได้แบบไม่ผูกกับ editor
IntelliJ ก็มีความสามารถคล้ายกัน
https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html
ผมก็เคยใช้ Hurl และรู้สึกว่ามันค่อนข้างดี
แต่ช่วงหลังผมกลับชอบแนวทาง .http มากกว่า
ใน IntelliJ ก็มีมาให้ในตัว มีปลั๊กอินที่ลิงก์ไว้ด้านบน และบน CLI ผมก็เคยใช้ httpYac
ไม่มี vendor lock-in และแชร์ผ่าน source control หรือ copy-paste ได้ง่ายมาก
บน JVM ผมทำ integration tests ด้วย Karate
https://github.com/karatelabs/karate
เพราะมันสามารถฝัง JavaScript ตามต้องการได้ เลยเขียน request/validation ได้ยืดหยุ่นมาก