1 điểm bởi GN⁺ 2024-07-06 | 1 bình luận | Chia sẻ qua WhatsApp
  • Kiểm thử dựa trên thuộc tính là một ví dụ hiếm hoi về nghiên cứu học thuật đã trở thành dòng chính trong vòng chưa đầy 30 năm.
  • Dưới khẩu hiệu "đừng viết test, hãy sinh ra test", nó đã nhận được sự ủng hộ từ cộng đồng của nhiều ngôn ngữ lập trình khác nhau.
  • Trang Wikipedia của QuickCheck, vốn ban đầu là một thư viện Haskell, liệt kê 57 bản tái triển khai bằng các ngôn ngữ khác.

Khảo sát các thư viện kiểm thử dựa trên thuộc tính

  • Bài viết khảo sát những thư viện kiểm thử dựa trên thuộc tính được dùng nhiều nhất hiện nay và so sánh với trình độ tiên tiến nhất của 15 năm trước (2009).
  • Phần lớn các thư viện không cung cấp những tính năng kiểm thử dựa trên thuộc tính tiên tiến nhất.

Vì sao các thư viện kiểm thử dựa trên thuộc tính lại ở trong tình trạng đáng buồn như vậy?

Kiểm thử dựa trên trạng thái và kiểm thử song song không hữu ích bằng kiểm thử thuần

  • Mô hình hóa dựa trên trạng thái cần được đào tạo.
  • Có ý kiến cho rằng mã nguồn đóng giúp việc áp dụng trong công nghiệp tốt hơn.

Mô hình hóa dựa trên trạng thái cần được đào tạo

  • Kiểm thử dựa trên trạng thái và kiểm thử song song đòi hỏi cách tư duy khác với kiểm thử thông thường.
  • Khi cung cấp các công cụ này cho người dùng mới, cần có đào tạo phù hợp.

Có ý kiến cho rằng mã nguồn đóng giúp việc áp dụng trong công nghiệp

  • Có ý kiến cho rằng mã nguồn mở đã không hiệu quả, và các sản phẩm mã nguồn đóng cùng dịch vụ liên quan sẽ giúp việc áp dụng tốt hơn.

Những gì chúng ta có thể làm

  • Cung cấp các bản triển khai mã nguồn mở ngắn gọn cho kiểm thử dựa trên thuộc tính theo trạng thái và song song.
  • Làm cho phần đặc tả hình thức trở nên dễ hơn để giảm nhu cầu đào tạo nhà phát triển.

Tóm tắt về kiểm thử dựa trên thuộc tính thuần

  • Việc kiểm thử các hàm hoặc tính năng mới được xem là thực hành tốt.
  • Ví dụ, nếu bạn viết hàm đảo ngược danh sách liên kết reverse, thì việc kiểm thử với một vài danh sách như danh sách rỗng là hợp lý.
  • Sinh đầu vào ngẫu nhiên là chức năng cốt lõi của kiểm thử dựa trên thuộc tính.
  • Ý tưởng là đầu vào ngẫu nhiên cuối cùng sẽ tìm ra các trường hợp biên.

Kiểm thử thuộc tính dựa trên trạng thái

  • Khi kiểm thử các thành phần có trạng thái, cùng một đầu vào không cho ra cùng một đầu ra.
  • Trong kiểm thử dựa trên trạng thái, người ta sinh ra các chuỗi đầu vào để kiểm tra hệ thống thay đổi như thế nào theo thời gian.
  • Trạng thái được mô tả tường minh bằng một bản triển khai tham chiếu trong bộ nhớ (mô hình).

Ví dụ: bộ đếm

  • Cài đặt bộ đếm bằng biến toàn cục có thể thay đổi.
  • Mô hình được biểu diễn bằng số nguyên.
  • Bài kiểm thử sinh và thực thi chuỗi lệnh, rồi so sánh đầu ra thực tế với đầu ra của mô hình.

Kiểm thử thuộc tính song song

  • Kiểm thử song song tái sử dụng mô hình kiểm thử dựa trên trạng thái để phát hiện điều kiện tranh chấp.
  • Kiểm thử song song dùng mô hình máy trạng thái tuần tự để thực hiện kiểm thử song song thông qua tính tuyến tính hóa.

Kết luận và công việc sắp tới

  • Để cải thiện tình trạng của kiểm thử dựa trên thuộc tính, cần cung cấp các bản triển khai mã nguồn mở và làm cho đặc tả hình thức trở nên dễ hơn.

Ý kiến của GN⁺

  • Bài viết này giải thích rõ lịch sử và tình trạng hiện tại của kiểm thử dựa trên thuộc tính.
  • Nó nhấn mạnh tầm quan trọng của kiểm thử dựa trên trạng thái và kiểm thử song song, đồng thời nêu ra nhu cầu về các bản triển khai mã nguồn mở.
  • Bài viết cũng đề xuất các cách để giúp kiểm thử dựa trên thuộc tính dễ tiếp cận hơn.
  • Những dự án khác có tính năng tương tự gồm có Hypothesis(Python) và PropEr(Erlang).
  • Bài viết nhấn mạnh rằng khi áp dụng công nghệ mới hoặc mã nguồn mở, cần có đào tạo và hỗ trợ.

1 bình luận

 
GN⁺ 2024-07-06
Ý kiến trên Hacker News
  • Đã có trải nghiệm tốt khi dùng clojure.spec.alphatest.check
    • Đã ngừng dùng hypothesis của Python vì không xử lý được các tập dữ liệu lớn
  • Go hỗ trợ tốt fuzzing dựa trên độ bao phủ
    • Có thể đạt kết quả tương tự kiểm thử thuộc tính thông qua fuzzing test và kiểm tra bất biến
  • Yêu cầu các bài báo nghiên cứu phải có thể tái hiện bằng công cụ mã nguồn mở có thể làm mất đi những thông tin hữu ích
  • Thường xuyên viết kiểm thử thuộc tính dựa trên trạng thái bằng proptest của Rust
    • Kiểm thử song song đôi khi hữu ích, nhưng chạy nhiều bài kiểm thử song song có thể dễ hơn
  • Đã đọc bài báo về Quviq QuickCheck, nhưng tự viết kiểm thử dựa trên trạng thái có thể tốt hơn
    • StateModel cần thêm mã framework nên không hiệu quả
  • Ngoài khía cạnh máy trạng thái và song song, kiểm thử thuộc tính dựa trên độ bao phủ có thể tạo ra tác động lớn hơn
    • Điều quan trọng là phải giữ được tính năng tự động thu gọn trong khi vẫn duy trì mọi bất biến khi sinh giá trị
    • Cách tiếp cận "thu gọn nội bộ" của Hypothesis là hiệu quả nhất
  • Clojure cũng có thư viện QuickCheck dựa trên trạng thái
    • Kiểm thử song song vẫn chưa phải là vấn đề lớn
  • Nếu có thể viết các bài kiểm thử nghiêm ngặt, kiểm thử thuộc tính nên được tích hợp vào hệ thống kiểu sẽ tốt hơn
    • Các "smoke test" đơn giản thì dùng đầu vào ngẫu nhiên sẽ dễ hơn
  • Cũng có QuickCheck Mini, phiên bản miễn phí của QuviQ Erlang QuickCheck
  • Tò mò liệu trong JavaScript có thư viện kiểm thử thuộc tính nào có thể sinh ra các giá trị ngẫu nhiên không thỏa mãn những điều kiện nhất định hay không