- Công cụ dòng lệnh mã nguồn mở cho phép thực thi các yêu cầu HTTP bằng định dạng tệp văn bản đơn giản, có thể xâu chuỗi nhiều yêu cầu, trích xuất giá trị, truy vấn/xác minh phần thân phản hồi và header
- Hỗ trợ nhiều loại API và yêu cầu dựa trên HTML/XML/JSON như REST, SOAP, GraphQL, phù hợp cho cả truy vấn dữ liệu và kiểm thử phiên HTTP
- Cho phép xâu chuỗi yêu cầu, bắt giá trị, xác minh đa dạng như mã trạng thái, header, body, đồng thời thuận tiện cho tích hợp CI/CD và tự động hóa với báo cáo Junit, TAP, HTML, JSON
- Được phân phối dưới dạng một tệp thực thi duy nhất viết bằng Rust, nên dễ cài đặt, và bên trong sử dụng engine libcurl để cung cấp tốc độ cao và khả năng tương thích giao thức mạnh mẽ
- Được đánh giá là công cụ tự động hóa kiểm thử HTTP hiện đại với cú pháp ngắn gọn, khả năng mở rộng và nhiều tính năng hơn so với các công cụ cạnh tranh
- Là mã nguồn mở do cộng đồng dẫn dắt, với định dạng dựa trên văn bản trực quan và có thể mở rộng, nên rất hữu ích cho cả lập trình viên lẫn DevOps
What's Hurl?
- Hurl là công cụ cho phép viết các yêu cầu HTTP bằng định dạng văn bản rõ ràng, trực quan và chạy chúng từ dòng lệnh
- Có thể liên kết nhiều yêu cầu theo chuỗi, trích xuất giá trị từ phản hồi hoặc dùng nhiều loại truy vấn khác nhau (header, body, mã trạng thái, v.v.) để kiểm thử các kịch bản HTTP phức tạp
- Dựa trên engine libcurl nên đáng tin cậy và hỗ trợ các giao thức hiện đại như IPv6, HTTP/3
- Hỗ trợ đầy đủ truy vấn dữ liệu, kiểm thử kịch bản và đo hiệu năng (như thời gian phản hồi)
- Tối ưu cho tạo báo cáo (Junit, TAP, HTML, v.v.) và tích hợp vào pipeline CI/CD
- Hỗ trợ nhiều loại API như REST, SOAP, GraphQL, HTML, XML, JSON, đồng thời hỗ trợ phân tích body (ví dụ: XPath, JSONPath)
- Sau đây là những điểm mạnh nổi bật riêng của Hurl so với các công cụ kiểm thử HTTP khác (ví dụ: Postman, curl):
- Có thể viết bằng plain text nên thuận tiện cho quản lý phiên bản và cộng tác
- Cung cấp một binary nhẹ duy nhất được viết bằng Rust, không cần runtime riêng
- Dựa trên cùng network engine (libcurl) như curl nên đáng tin cậy và hỗ trợ nhiều giao thức
- Hỗ trợ nhiều định dạng như REST, SOAP, GraphQL, HTML và có thể thiết lập các kịch bản phức tạp
- Dễ dàng tích hợp với CI/CD, tự động hóa kiểm thử và các báo cáo chi tiết (JUnit, HTML, TAP, v.v.)
Tóm tắt các tính năng chính
-
Hoạt động cơ bản
- Viết tuần tự nhiều yêu cầu HTTP trong tệp Hurl (.hurl) để thực thi
- Có thể trích xuất giá trị từ phản hồi của từng yêu cầu, xác minh điều kiện và truyền dữ liệu sang yêu cầu tiếp theo
- Hỗ trợ nhiều định dạng như REST/JSON, SOAP/XML, GraphQL, HTML
-
Xâu chuỗi và sử dụng biến
- Viết nhiều yêu cầu theo chuỗi trong cùng một tệp
- Dùng cú pháp Captures để trích xuất giá trị từ phản hồi rồi chèn vào các yêu cầu sau dưới dạng biến
- Trích xuất và sử dụng dữ liệu thông qua XPath, JSONPath, biểu thức chính quy, cấu trúc body, v.v.
-
Nhiều kiểu yêu cầu và xác minh
- Hỗ trợ thiết lập nhiều đặc tả yêu cầu như query parameter, header, xác thực, v.v.
- Có thể xác minh mã trạng thái, body, header, cookie, thời gian phản hồi, hash, v.v. bằng cú pháp [Asserts] hoặc cú pháp ngầm định
- Có thể dùng XPath, JSONPath, đồng thời kiểm thử nội dung REST/GraphQL/SOAP và HTML
- Hỗ trợ xác minh nhiều giá trị, thuộc tính body/hash/chứng chỉ, độ trễ request/response và xử lý dữ liệu nhị phân
-
Báo cáo kiểm thử và tích hợp tự động hóa
- Xuất kết quả chạy dưới nhiều định dạng báo cáo như văn bản, HTML, JUnit, TAP, JSON
- Dễ dàng tích hợp vào pipeline CI/CD
-
Điều khiển nâng cao và các tính năng hữu ích
- Truyền dữ liệu giữa các yêu cầu (capture/biến hóa)
- Hàm tạo dữ liệu động (
newUuid, newDate, v.v.)
- Tùy biến option theo từng yêu cầu
- Polling/retry, delay request, skip, che giá trị bí mật (redact)
- Hỗ trợ cùng các option như curl (có thể dùng nguyên các option của curl)
- Tích hợp sẵn các tính năng dành cho cloud như xác thực AWS Sigv4
Ví dụ sử dụng
Các trường hợp sử dụng tiêu biểu
- Kiểm thử nhiều loại API như REST/GraphQL/HTML/JSON/SOAP
- Trích xuất và tái sử dụng các giá trị như CSRF token, xác thực và phân quyền
- Xác minh chi tiết mã trạng thái, header, dữ liệu body, cookie, chứng chỉ SSL, v.v.
- Tự động hóa và giám sát các kịch bản dịch vụ thực tế (đăng nhập~thao tác nghiệp vụ, v.v.)
- Hỗ trợ đa nền tảng và nhiều cách cài đặt khác nhau (Linux, macOS, Windows, Docker, npm, Cargo, v.v.)
Các tùy chọn CLI chính
--test: chế độ kiểm thử (xuất tóm tắt và báo cáo)
--report-html, --report-json, --report-junit, --report-tap: hỗ trợ nhiều định dạng báo cáo
--parallel, --jobs N: chạy song song
--retry, --retry-interval: tự động thử lại/chờ
-u, --user: nhập thông tin xác thực
--variable, --variables-file: chỉ định biến
-o, --output: lưu tệp phản hồi
--json: xuất kết quả chạy ở định dạng JSON
Cách cài đặt
Ưu điểm so với công cụ cạnh tranh
- So với các công cụ GUI như Postman, Insomnia, cách tiếp cận dựa trên văn bản thuận lợi hơn cho quản lý phiên bản và tích hợp CI/CD
- So với curl, Hurl chuyên biệt hơn cho kiểm thử, chạy kịch bản, xác minh và tự động hóa báo cáo
- Thay vì dùng các DSL phức tạp như YAML hay JSON, Hurl dùng định dạng riêng trực quan nên đường cong học tập thấp hơn
3 bình luận
Bruno - ứng dụng khách API mã nguồn mở nhanh và thân thiện với Git (giải pháp thay thế Postman)
https://vi.news.hada.io/topic?id=13730
Bản phát hành Hurl 4.0.0
2 năm trước là 4.0, còn hiện tại đã ra đến 6.1.1.
Ý kiến trên Hacker News
Tôi mới bắt đầu dùng hurl trong vài tháng gần đây
Tôi rất hài lòng vì có thể dùng cả chế độ test suite lẫn chế độ gọi đơn lẻ
Tôi dùng nó để chạy test suite cho các HTTP request trong CI
Tôi cảm thấy ngôn ngữ cấu hình với các block không thật sự trực quan, và tài liệu về các assertion được hỗ trợ cũng hơi thiếu
Nhưng nhìn chung, bản thân công cụ này mang lại giá trị rất lớn
Tôi bắt đầu kiểm thử giao diện khi làm POC, và nhận ra cách này có thể hỗ trợ phát triển dựa trên LLM
Khi viết test trực tiếp theo HTTP method, test và phần triển khai được tách rời linh hoạt hơn trong quá trình dự án phát triển
Nhờ tách test ra, ranh giới giữa giao diện và triển khai cũng rõ ràng hơn
Trước khi dùng hurl, tôi viết mã test bằng framework test của ngôn ngữ dịch vụ, nhưng với test dựa trên hurl, tôi buộc phải giữ nghiêm ngặt 'góc nhìn của client'
Không có kiểu truy cập dữ liệu cửa sau, nên giao diện, test và triển khai được tách biệt triệt để, khiến tôi yên tâm hơn
Cảm ơn bạn vì phản hồi
Khi bắt đầu phát triển bản đầu tiên cách đây 6~7 năm, tôi từng thử JSON, rồi sau đó là định dạng YAML, nhưng dần dần đi đến kết luận là nên tự tạo một định dạng tệp mới
Tôi hoàn toàn hiểu điều này có thể khiến người dùng thấy lạ
Tôi đã cố áp dụng cú pháp đơn giản cho những trường hợp đơn giản hơn, nhưng có thể vẫn chưa hoàn hảo
Về tài liệu, nếu có chỗ nào còn thiếu hay có thể cải thiện, tôi rất mong được nhận góp ý và tiếp tục nâng cấp
Hurl là một công cụ thật sự rất tuyệt
Trước đây khi tôi port một dịch vụ web viết bằng Python sang Rust, việc có các bài test public API nghiêm ngặt đã giúp ích rất nhiều
Nhờ môi trường integration test độc lập với ngôn ngữ, tôi có thể giữ nguyên API và website, chỉ thay backend
Có thêm một lợi ích riêng khi dùng Hurl với Rust
Nó có thể tích hợp với cargo test để dùng trực tiếp thư viện hurl, và có thể tái sử dụng nguyên các tệp .hurl
Demo: https://github.com/perrygeo/axum-hurl-test
Tôi bắt đầu dùng Hurl từ tháng 9 năm 2023
Trước đây tôi chạy test suite qua Runscope, nhưng cực kỳ khó chịu vì các thay đổi không được quản lý phiên bản
Sau một chút chuẩn bị nền tảng, tôi chuyển sang Hurl và bỏ Runscope
Giờ tôi có thể nhìn ngay ai đã thay đổi gì, khi nào và vì sao, nên rất hài lòng
Đội của chúng tôi cũng từng cố giải quyết vấn đề đó và dự án đã chậm lại vì nó
Tôi thấy ý tưởng này khá hay, nhưng vẫn tự hỏi 'vì sao phải dùng nó'
Tôi phát triển với Django, và tính năng test tích hợp sẵn của framework đã rất đầy đủ
Việc đưa thêm một công cụ chỉ có thể truy cập từ bên ngoài mà không hiểu backend của tôi có vẻ chỉ làm tăng gánh nặng đồng bộ
Cũng không thể nhảy ngay vào debugger khi có gì đó lạ
Đúng là có lý lẽ rằng nên tách rõ mã test và mã backend, nhưng trên thực tế chi phí bảo trì lại tăng lên
Cuối cùng thì tôi vẫn sẽ phải chạy cả test suite native, nên việc dùng song song nhiều công cụ ngoài cảm thấy hơi gượng gạo
Tuy vậy, nếu mục đích là kiểm chứng API hoạt động tổng quát đến mức nào thì có lẽ cũng đáng dùng
Tôi cũng đã suy nghĩ nhiều về câu hỏi vì sao phải dùng một công cụ không biết gì về backend của mình chỉ để tăng thêm công đồng bộ
Tôi chưa dùng hurl, nhưng đã nhiều lần dùng các công cụ kiểm thử API độc lập với ngôn ngữ, và thậm chí cũng đang tự phát triển một công cụ như vậy
Những công cụ này có vẻ hấp dẫn vì
Vì cấu trúc chỉ kiểm chứng input-output, nó không phụ thuộc vào logic nội bộ
Ví dụ, khi chuyển public API từ Perl sang Go, có thể dùng API Perl cũ làm bài test không hồi quy, rồi chạy nguyên bộ test đó trên API Go để tăng độ tin cậy
Có thể xem nó như một lựa chọn thay thế cho các sản phẩm như Postman
Không cần mở một cửa sổ nặng nề chạy trên Electron chỉ để test vài HTTP request đơn giản
Nó nằm ở đâu đó giữa curl script và Postman, nên rất phù hợp với những ai cần cả sự gọn nhẹ lẫn tiện dụng
Chúng tôi đã dùng Hurl khi migration từ web server ktor sang mã dựa trên spring boot (stack Java/Kotlin)
Vì có thể vận hành test suite ở cấp độ đặc tả mà không phụ thuộc stack server, quá trình chuyển đổi đã rất suôn sẻ
Ngoài ra, vì chúng tôi dùng Docker image trong production, Hurl giúp thực hiện integration test rất nhẹ và độc lập, thay vì phải dùng công cụ quá phụ thuộc vào cách triển khai
Mục samples (https://github.com/Orange-OpenSource/hurl?tab=readme-ov-file#samples) khá thuyết phục với những người muốn nắm được điểm mạnh của công cụ chỉ trong 5 phút, tức kiểu người hay đưa ra đánh giá trước
Đôi khi tôi cũng thuộc kiểu đó, và phải nói là rất ấn tượng
Tôi là người duy trì Hurl
Luôn hoan nghênh mọi câu hỏi hoặc phản hồi
Đây là một mẫu mà tôi và các lập trình viên xung quanh dùng rất nhiều: viết test bằng tệp ".http" có thể chạy qua extension của IDE như VS Code hoặc IDEA
Định dạng ví dụ là
Sau đó so sánh output 1:1 với tệp "expected.json" để làm integration test
Chúng tôi chạy các tệp này bằng cURL và các bash script tự viết, rồi dùng jq để so sánh kết quả và ghi log thành công/thất bại ra console
Tôi muốn hỏi liệu với Hurl có thể định nghĩa kiểu HTTP request mẫu trong IDE và kết quả mong đợi dựa trên tệp JSON như vậy không
Và Hurl có thể tự động chạy nhiều tệp trong một thư mục không
Hurl đang bị đánh giá thấp ở điểm cho phép viết test suite ở tầng HTTP vừa đẹp mắt vừa dễ bảo trì
Cảm ơn vì đã phát triển một công cụ như vậy
Tôi rất thích cái tên Hurl
Cảm nhận được sự tinh tế của nhà phát triển
Tôi đã dùng Hurl một thời gian rồi còn trực tiếp đóng góp nữa
Tôi tò mò không biết khả năng hỗ trợ tính năng "include" thế nào
Xin cảm ơn vì đã liên tục duy trì dự án
Tôi muốn biết tầm nhìn và tương lai của Hurl trong 2 năm tới sẽ như thế nào
Tôi lấy rất nhiều cảm hứng từ dự án này để tự thiết kế một công cụ kiểm thử HTTP
Chúng tôi cần chạy song song hàng trăm bài test một cách nhanh chóng, nên nếu bạn thích Hurl thì có thể cũng sẽ thấy Nap thú vị
Nếu có trang nào tổng hợp và so sánh khác biệt thì mong bạn chia sẻ
Trông khá thú vị
Trước đây tôi dùng Vscode-restclient rất lâu, nhưng gần đây đang chuyển sang httpyac cho mục đích script và CLI
Tôi cũng định xem Hurl có đáp ứng những yêu cầu mình cần không
Một trong những điều bất tiện khi dùng các công cụ test là vẫn chưa có chuẩn chung để tham chiếu kết quả của một request làm đầu vào cho request tiếp theo trong tệp
.httpCả ba công cụ tôi từng dùng đến nay đều làm theo cách khác nhau
hurl dùng [Captures]
Vscode-restclient tham chiếu tên request trong phần khai báo biến
httpyac dùng cú pháp @ref
Vì cú pháp mỗi bên khác nhau, nên viết cho một công cụ thì sang công cụ khác sẽ bị hỏng
Các liên kết tham khảo liên quan
tài liệu capture của hurl
Vscode-restclient
tài liệu ref của httpyac
Xin lỗi vì lại tạo thêm một định dạng tệp nữa!
Một cách có thể giảm bớt vấn đề này là dùng
hurlfmthurlfmt cho phép xuất tệp Hurl sang JSON
Có thể dùng kết quả JSON đó để tạo bộ chuyển đổi qua lại với công cụ khác
Đây không phải giải pháp thần kỳ hoàn hảo, nhưng có thể giúp được phần nào khi chuyển từ Hurl sang định dạng khác
Cả Visual Studio Code lẫn Visual Studio đều hỗ trợ tệp .HTTP, nhưng lại không tương thích với nhau
Nhìn khá thú vị, như một ví dụ Conway's Law diễn ra ngoài đời thật
Trông hơi giống
https://marketplace.visualstudio.com/items?itemName=humao.rest-client
Extension này cho VS Code rất mạnh trong việc kiểm thử liên quan đến HTTP
Điểm khác biệt lớn là có thể dùng độc lập với editor
IntelliJ cũng có tính năng tương tự
https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html
Tôi cũng đã dùng Hurl và thấy khá ổn
Nhưng gần đây tôi thích cách làm bằng .http hơn
Nó được tích hợp sẵn trong IntelliJ, có plugin được liên kết ở trên, và trên CLI thì tôi cũng đã thử httpYac
Không bị vendor lock-in, và cũng rất dễ chia sẻ qua source control hoặc copy-paste
Trên JVM, tôi làm integration test bằng Karate
https://github.com/karatelabs/karate
Vì có thể nhúng JavaScript tùy ý, nên có thể viết request/kiểm chứng rất linh hoạt