blog.dopana

Back

Khi nhắc đến Rust trong phát triển web, những từ như blazing fast, memory safety, và zero-cost abstractions thường xuất hiện. Trình biên dịch khắt khe của Rust đảm bảo web service của bạn không bị data race hay null pointer exception. Nhưng làm thế nào để chắc chắn rằng ứng dụng web thực sự đáp ứng yêu cầu nghiệp vụ?

Câu trả lời là Behavior-Driven Development (BDD) và framework Cucumber cho Rust (crate cucumber).

Bằng cách kết hợp hiệu năng backend mạnh mẽ của Rust với spec dễ đọc của Cucumber, đội ngũ có thể xây dựng web app vừa vững chắc về cấu trúc vừa chính xác về chức năng.

Cucumber trong Rust là gì?#

Cucumber là framework BDD phổ biến cho phép bạn viết kịch bản test bằng ngôn ngữ tự nhiên, dễ hiểu với cú pháp Gherkin (Given-When-Then).

Trong hệ sinh thái Rust, crate cucumber hoạt động như một test harness runner. Nó phân tích file .feature và ánh xạ trực tiếp đến các hàm Rust bất đồng bộ (step definitions). Bạn có được cả hai:

  • Spec hướng business, có thể thực thi được.
  • Sự an toàn, tốc độ, và đồng thời của code Rust thuần.

Tại sao dùng Rust và Cucumber cho Web?#

  1. Living Documentation: File feature là tài liệu sống mà product owner, QA, và developer đều đọc và hiểu được.
  2. Tin cậy cả Compile lẫn Runtime: Rust bắt lỗi bộ nhớ và kiểu dữ liệu tại compile time, Cucumber đảm bảo logic ứng dụng khớp với luồng công việc thực tế.
  3. Async Native: Các web framework Rust hiện đại (Axum, Actix-web, Warp) đều bất đồng bộ. Cucumber cho Rust hỗ trợ async/await tự nhiên, giúp test HTTP endpoint và database gọi dễ dàng.

Hướng dẫn từng bước: Cài đặt Cucumber trong dự án Rust Web#

Hãy cùng thiết lập cơ bản để test một API route web với Rust và Cucumber.

1. Cấu hình Cargo.toml#

Đầu tiên, thêm dependencies. Bạn cần cucumber, async runtime như tokio, và một cách để gửi HTTP request đến web server (như reqwest).

2. Viết File Feature Gherkin#

Tạo thư mục tests/features/ và thêm file user_api.feature:

Feature: User Management API
  As a client of the web service
  I want to register a new user
  So that I can access protected resources

  Scenario: Successfully registering a new user
    Given the web server is running
    When I send a POST request to "/users" with username "alice"
    Then the response status should be 201
    And the response body should contain "User alice created successfully"
gherkin

3. Triển khai World và Step Definitions#

“World” trong Cucumber đại diện cho trạng thái chia sẻ giữa các scenario. Tạo tests/cucumber.rs:

4. Chạy BDD Tests#

Chạy test suite với Cargo:

cargo test --test cucumber
bash

Cucumber sẽ phân tích kịch bản Gherkin, giao tiếp với ứng dụng Rust và hiển thị kết quả xanh!

Best Practices cho Rust BDD#

  • Cô lập State: Đảm bảo World struct reset sạch giữa các scenario. Nếu dùng database, spin up container tạm (qua Testcontainers-rs) hoặc dùng transaction rollback cho mỗi scenario.
  • Step Tái sử dụng: Thiết kế Gherkin steps với tham số (dùng {string} hoặc {int}) để dùng chung cho nhiều endpoint thay vì viết step mới cho từng route.
  • Xử lý async gọn gàng: Tận dụng Tokio multi-threaded runtime bên trong step definitions để xử lý concurrent web request dễ dàng.

Kết luận#

Xây dựng web app với Rust cho bạn hiệu năng và độ tin cậy vượt trội. Tích hợp Cucumber framework giúp kết nối khoảng cách giữa thực thi kỹ thuật và yêu cầu nghiệp vụ, đảm bảo web service của bạn không chỉ nhanh và an toàn — mà còn làm đúng việc cần làm.

Tài liệu tham khảo#