Quick start: Chạy kịch bản BDD đầu tiên trong 5 phút
Thay vì mổ xẻ lý thuyết suông, chúng ta sẽ bắt tay vào làm luôn cho nóng. BDD (Behavior-Driven Development) thực chất là cách bạn kể lại câu chuyện người dùng thao tác trên phần mềm. Trong hệ sinh thái Python, Behave chính là trợ thủ đắc lực nhất để hiện thực hóa điều đó.
Bước 1: Cài đặt thư viện
pip install behave
Bước 2: Dựng khung thư mục chuẩn
Behave rất khó tính về cấu trúc file. Bạn cần sắp xếp đúng như sau để bộ máy có thể tự động nhận diện kịch bản:
my_project/
├── features/
│ ├── steps/
│ │ └── calculator_steps.py
│ └── calculator.feature
Bước 3: Soạn kịch bản (File .feature)
Mở file calculator.feature. Đây là nơi chúng ta dùng ngôn ngữ Gherkin – thứ tiếng Anh (hoặc tiếng Việt) mà cả sếp lẫn khách hàng đều đọc hiểu:
Feature: Máy tính cơ bản
Scenario: Cộng hai số nguyên
Given mình có số 5
And mình có số 10
When mình thực hiện phép cộng
Then kết quả phải là 15
Bước 4: Hiện thực hóa logic (File .py)
Tại file steps/calculator_steps.py, chúng ta sẽ định nghĩa code Python tương ứng cho từng dòng chữ phía trên:
from behave import given, when, then
@given('mình có số {num:d}')
def step_given_number(context, num):
if not hasattr(context, 'numbers'):
context.numbers = []
context.numbers.append(num)
@when('mình thực hiện phép cộng')
def step_when_add(context):
context.result = sum(context.numbers)
@then('kết quả phải là {expected:d}')
def step_then_check(context, expected):
assert context.result == expected, f"Sai số rồi! Máy tính ra {context.result}"
Bước 5: Chạy và tận hưởng
Gõ lệnh behave trong terminal. Nếu màn hình hiện dòng chữ xanh kèm thông báo “1 scenario passed”, bạn đã chính thức bước chân vào thế giới Automation Test chuyên nghiệp.
Tại sao các team Agile lại “phát cuồng” vì BDD?
Bạn đã bao giờ rơi vào cảnh viết xong bộ Unit Test cực xịn nhưng khách hàng nhìn vào chỉ biết lắc đầu? Đó là vì code test truyền thống quá khô khan. BDD ra đời để xóa nhòa khoảng cách này bằng cách dùng Gherkin làm cầu nối thông tin.
- Given (Bối cảnh): Thiết lập hiện trường ban đầu như dữ liệu mẫu hay khởi tạo trình duyệt.
- When (Hành động): Mô tả thao tác người dùng như click chuột hoặc gọi API.
- Then (Kết quả): Kiểm chứng đầu ra xem có đúng kỳ vọng hay không.
Behave đóng vai trò như một bộ ánh xạ thông minh. Nó quét từng dòng Gherkin và tìm các hàm @given, @when, @then tương ứng. Đặc biệt, đối tượng context hoạt động như một chiếc túi thần kỳ. Nó giúp bạn truyền dữ liệu mượt mà giữa các bước trong cùng một Scenario mà không sợ bị thất lạc.
Kỹ thuật nâng cao: Đừng để Test Case phình to lãng phí
Nếu cần test 100 bộ dữ liệu, bạn sẽ copy-paste kịch bản 100 lần? Đừng làm thế. Scenario Outline sẽ giúp bạn tiết kiệm 80% công sức viết code nhờ cơ chế vòng lặp.
Scenario Outline: Kiểm tra nhiều phép tính
Given mình có số <so_1>
And mình có số <so_2>
When mình thực hiện phép cộng
Then kết quả phải là <ket_qua>
Examples: Dữ liệu test
| so_1 | so_2 | ket_qua |
| 1 | 2 | 3 |
| 10 | 20 | 30 |
| 99 | 1 | 100 |
Behave sẽ tự động chạy lại kịch bản dựa trên bảng Examples. Cách này cực kỳ hiệu quả khi bạn cần xử lý các trường hợp biên (edge cases) mà không làm loãng file feature.
Quản lý vòng đời với Hooks
Khi làm Automation cho Web, việc mở/đóng trình duyệt liên tục là cực hình cho tài nguyên máy tính. Hãy tận dụng file environment.py để kiểm soát cuộc chơi:
before_all: Thiết lập cấu hình chung một lần duy nhất.before_scenario: Chuẩn bị môi trường sạch cho từng kịch bản.after_scenario: Dọn dẹp rác, đóng trình duyệt hoặc chụp ảnh màn hình nếu test fail.
Kinh nghiệm “xương máu” khi triển khai thực tế
Viết kịch bản BDD thì dễ, nhưng để duy trì nó qua nhiều năm tháng dự án lại là câu chuyện khác. Dưới đây là vài mẹo mình đúc kết được.
1. Sức mạnh của Regex và công cụ hỗ trợ
Behave cho phép dùng Regular Expression (Regex) để bắt tham số linh hoạt. Khi gặp các pattern phức tạp, bạn nên check kỹ để tránh bắt nhầm dữ liệu. Mình thường dùng regex tester của Toolcraft để kiểm tra nhanh các pattern ngay trên trình duyệt. Nó giúp tiết kiệm đáng kể thời gian debug kịch bản Gherkin.
2. Quy tắc “Less is More”
Đừng lạm dụng từ And quá đà. Nếu một Scenario dài tới 20 dòng, đó là dấu hiệu kịch bản đang bị sa đà vào chi tiết kỹ thuật. Hãy gom nhóm chúng lại. Thay vì mô tả từng cú click, hãy viết: “Người dùng hoàn tất thanh toán bằng thẻ Visa”. Điều này giúp kịch bản gọn gàng và có giá trị về mặt nghiệp vụ hơn.
3. Chia để trị (Module hóa)
Khi dự án lớn dần, file steps.py sẽ trở thành một mớ hỗn độn. Hãy chủ động chia nhỏ chúng theo module như auth_steps.py, payment_steps.py. Behave đủ thông minh để quét sạch folder steps/ nên bạn cứ thoải mái tổ chức sao cho dễ quản lý nhất.
4. Đừng tiết kiệm lời thoại khi Assert
Trên các hệ thống CI/CD như Jenkins hay GitHub Actions, một dòng log lỗi rõ ràng giá trị hơn vạn lời giải thích. Thay vì để lỗi chung chung, hãy viết: “Lỗi: Hệ thống trả về 404 thay vì 200 tại bước đăng nhập”. Bạn sẽ cảm ơn chính mình khi phải debug giữa đêm khuya đấy.
Sử dụng BDD không chỉ là để tìm lỗi. Nó là cách để chúng ta xây dựng niềm tin với khách hàng rằng: “Tôi đang làm đúng thứ bạn cần”. Chúc các bạn áp dụng Behave thành công vào dự án!

