Trang chủ > V-BLOG > V-JOURNAL

Viết mã kiểm thử sau, viết mã chương trình trước bạn có thể đang ném tiền qua cửa sổ

22/06/2020

Yêu cầu nghiệp vụ

Tính tỷ lệ chiết khấu dựa trên phân loại khách hàng thân thiết:

  1. Bạch kim: tỷ lệ chiết khấu = 0,15
  2. Vàng: tỷ lệ chiết khấu = 0,1
  3. Bạc: tỷ lệ chiết khấu = 0,05
  4. Yêu cầu nghiệp vụ phát sinh trong tương lai: chỉ áp dụng luật chiết khấu nên trên vào ngày Black Friday

Sẽ thế nào nếu viết mã chương trình trước, mã kiểm thử sau?

Cách tiếp cận như vậy hẳn là mã chương trình của bạn có thể chạy được, đáp ứng được yêu cầu nghiệp vụ hiện tại, nhưng rất có thể mã chương trình bạn viết ra rất khó kiểm thử, thậm chí trong một số tình huống thì gần như không thể kiểm thử (ví dụ bạn sẽ cần đợi đến Black Friday để có thể xác nhận mã chương trình có chạy đúng logic nghiệp vụ hay không)

Không tiếp cận theo hướng kiểm thử dẫn lối phát triển (TDD) mã chương trình đôi khi gần như không thể kiểm thử

 

  1. Bạn không thể viết kiểm thử đơn vị cho luồng nghiệp vụ chính nêu trên (Bạn buộc phải viết mã kiểm thử tích hợp giữa logic nghiệp vụ với logic lấy dữ liệu từ database hoặc api ) 
  2. Ta cần đọc mã discountRateByMembershipType() từng dòng một để viết mã kiểm thử cho tất cả các trường hợp có thể xảy ra t (...)
  3. Đôi khi ta không thể viết được bất kỳ mã kiểm thử đơn vị (kiểm thử logic nghiệp vụ) nào cho discountRateByMembershipType() nếu logic bên có liên quan nhiều đến thời gian. Ví dụ trong tương lai hàm trên có thêm logic discount chỉ áp dụng tính vào ngày black friday. Lúc ấy sẽ phải chờ đến ngày black friday mới test được. Dĩ nhiên bạn có thể thay đổi thời gian trên máy bạn để test, nhưng trên server production thì sao, đôi khi bạn không thể làm chủ được thời gian trên server

Chuyện gì xảy ra nếu áp dụng viết test trước, mã production sau (TDD)?

Cách tiếp cận này không đảm bảo bạn sẽ tạo ra một thiết kiến ​​trúc chương trình tổng thể tốt, nhưng nó đảm bảo bạn tạo ra một chương trình, một thư viện có thể kiểm thử được.

Các bước áp dụng TDD:

  1. Viết mã kiểm thử cho một logic, 1 khía cạnh nghiệp vụ nhỏ nhất. Đậy chính là kịch bản sử dụng chương trình (thư viện) bạn đang muốn xây dựng, nó có thể hiểu là quá trình tạo khuôn đúc
  2. Sau đó, viết tối thiểu  mã chương trình đáp ứng được kịch bản kiểm thử bên trên, hay còn hiểu là quá trình tạo tác sản phẩm đổ vừa khuôn đúc ở bước bên trên
  3. Lặp lại hai bước nếu trên cho đến khi bạn không có thêm bất kỳ logic hay yêu cầu nghiệp vụ nào khác.

Đặc tả nghiệp vụ đầu tiên, mã kiểm tra đơn vị đầu tiên

Lần đầu khi chạy test_with_platinum_member_will_discount_fundred_percent () sẽ báo lỗi vì phương thức discountByMembershipType chưa được xây dựng.

Vì vậy, chúng ta cần viết mã chương trình tối thiểu phù hợp với logic trên

Mã chương trình tối thiểu đáp ứng được đặc tả nghiệp vụ đầu tiên (yêu cầu yêu vụ đầu tiên)

Đặc tả nghiệp vụ thứ hai:  logic được áp dụng cho khách hàng 'Vàng'

Đặc tả nghiệp vụ đầu tiên, mã kiểm tra đơn vị đầu tiên

Một lần nữa, chạy test_with_gold_member_will_discount_ten_percent () sẽ hiển thị 'Test Fail' vì mã chương trình chưa có logic thứ hai

Vì vậy, chúng ta cần viết mã chương trình tối thiểu dành cho khách hàng Vàng

Mã chương trình đã vượt qua các logic cho khách hàng 'Bạch kim', 'Vàng'

Giờ chạy test_with_gold_member_will_discount_ten_percent () sẽ hiển thị 'Test Done'

Lặp lại cho đến khi không còn logic hay đặc tả nào, sau đó kết quả cuối cùng ở đây

Đặc tả logic đầy đủ ( đầy đủ các trường hợp, đầy đủ mã test) cho ứng dụng tính tỷ lệ chiết khấu dựa trên loại khách hàng

Mã chương trình cuối cùng (Có thể kiểm tra được)

Bài chưa viết hết, xem mã minh hoạ tại đây:

https://github.com/hungtrinh/discount_rate#install-phpunit

Tác giả: HưngTĐ - Division 1

Tải tài liệu

Xem những tài liệu về dịch vụ mới nhất tại đây

Liên hệ

Mọi thắc mắc về dịch vụ phát triển phần mềm

liên hệ tại đây