27 điểm bởi GN⁺ 2025-06-21 | 3 bình luận | Chia sẻ qua WhatsApp
  • 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
  • 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ó thể định nghĩa các yêu cầu GET/POST đơn giảnxâu chuỗi nhiều bước bằng một tệp văn bản đơn giản
    • Tạo tệp sample.hurl, rồi chạy lệnh $ hurl sample.hurl để thực thi hàng loạt các yêu cầu đó
  • Ví dụ:
      GET https://example.org  
      HTTP 200  
      [Captures]  
      csrf_token: xpath "string(//meta[@name='_csrf_token']/@content)"  
    
      POST https://example.org/login?user=toto&password=1234  
      X-CSRF-TOKEN: {{csrf_token}}  
      HTTP 302  
    
  • Có thể kiểm thử nhiều API endpoint và so sánh giá trị phản hồi, sử dụng các giá trị đã xâu chuỗi (như token), đồng thời xác minh mã trạng thái, header, dữ liệu body, v.v.

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

  • Có thể cài đặt bằng Homebrew, apt, yum, pacman, cargo, choco, scoop, Docker, npm, v.v.
  • Là binary đơn nên không cần runtime riêng
  • Ví dụ:
    brew install hurl  
    
    hoặc
    cargo install --locked hurl  
    

Ư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

 
seunggi 2025-07-04

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

 
xguru 2025-06-21

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.

 
GN⁺ 2025-06-21
Ý 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

    • Tôi là nhà phát triển của hurl
      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

    • Tôi cũng thật sự ghét chuyện Runscope không quản lý phiên bản thay đổi
      Độ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ì

      • Việc không cần biết triển khai bên trong lại chính là một ưu điểm
        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ì độc lập với ngôn ngữ, có thể chia sẻ với đội khác hoặc dùng như tài liệu thay cho đặc tả OpenAPI
      • Vì nó kiểm thử chính hợp đồng API, nên vẫn tái sử dụng được trong các đợt migration lớn
        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
      • Khi lập trình viên viết những bài test kiểu này, họ có thể tạm thời chuyển sang góc nhìn của người tiêu thụ API, nên thường viết được test chất lượng cao hơn
    • 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à

      POST http://localhost:8080/api/foo
      Content-Type: application/json
      { "some": "body" }
      

      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ị

    • Tôi muốn biết cú pháp hay nội dung cấu hình có giống Hurl không, và khác nhau ở điểm nào
      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 .http
    Cả 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 hurlfmt
      hurlfmt 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