Tham gia trong lĩnh vực phát triển phầm mềm mà riêng tôi đề cập ở đây là phát triển web, dù bạn ở khâu nào, developer hay tester bạn đều thấy rằng khi một fix một bug này lại nảy sinh một bug khác, thêm feature này lại ảnh hưởng hoặc gây bug cho feature khác, ngay cả khi muốn optimize và refactor code cũng làm bạn ngại vì sợ sẽ gây ra bug đến với những function trước đó.
Làm thế nào để khi source code thay đổi chúng ta đảm bảo rằng nó sẽ không ảnh hưởng đến những chức năng khác (của mình hay của người khác) hay đến những bug đã được fix trước đó. Hoặc có phải là bạn phải dành thời gian để test lại từ đầu.
Trong một chương trình, ngoài những lỗi cú pháp và logic ra thì có những lỗi chỉ xuất hiện lúc chương trình được thực thi (runtime error), cho nên chúng ta khó có thể thể kiểm tra tất cả các trường hợp xảy ra lỗi của các function/action được.
Ví dụ có rất nhiều cách để tấn công SQL Injection, bạn có đảm bảo rằng mỗi lần bạn test là bạn sẽ có đủ thời gian, đủ kiên nhẫn để kiểm tra hết hay các trường hợp từ lần này qua lần khác hay không?
Bạn có từng nghĩ chúng ta có một server test, tự động checkout source code mỗi khi có sự thay đổi, thì nó sẽ tự động update và kiểm tra các trường hợp, các feature, và nếu có lỗi nó sẽ tự động gởi email về cho chúng ta biết chính xác chỗ nào gây ra lỗi.
Và với những đặc điểm tốt này, tôi tin chắc rằng chất lượng code của bạn sẽ được cải thiện đáng kể xét về khía cạnh kiến trúc và tổ chức source code.
Tóm lại có nhiều lý do để bạn phải cân nhắc về việc viết Unit Test cho ứng dụng của bạn, theo tôi những lý do mà bạn có thể dễ dàng bị thuyết phục nhất là:
-
Giảm số lượng lỗi khi phát triển những tính năng mới
-
Giảm số lượng lỗi với những tính năng cũ
-
Cải thiện code của bạn về cách lập trình và cả kiến trúc của chương trình.
-
Cho phép chúng ta dễ dàng refactor code.
-
Giúp chúng ta có thể thực hiện các thao tác test tự động.
(Nói chung là tiết kiệm thời gian phát triển và bảo trì code đó ^^)
Và nếu một doanh nghiệp phát triển theo điều này, rõ ràng là chúng ta đã giảm chi phí cho sản phẩm rất nhiều trong khi chất lượng sản phẩm vẫn được đảm bảo.
Ví dụ bạn test phần import/export database của 1 class nào đó, các buớc bạn phải làm là:
Step1: tạo dữ liệu giả mong muốn cỡ >= 10 records: (nếu test phân trang thì cần cao hơn nữa)
Step2: nếu có mối liên hệ đến các table khác thì bạn phải tạo liên tiếp các table liên quan (mình đã từng test các fuction query lên tới 10 table hoặc hơn nữa nhất là trên các câu truy vấn kho dữ liệu)
Step3: thực hiện function (có thể phải chạy nhiều hàm tiền xử lý truớc khi chạy hàm chính)
Step4: compare nhiều records kết quả này với 1 dữ liệu có sẵn. (được lưu trên các file excel tại từng cell một)
Mà mỗi function bạn sẽ phải test với lượng khỏang 30 test case trở lên thì bạn phải làm các stept từ 1 tới 4 lặp đi lặp lại 30 lần.
Vì vậy nếu ko có sự trợ giúp của Unit test nói riêng và PHPUnit, JUnit.... thì nó sẽ giúp cho bạn rất nhiều thời gian để run testcase.
Nguyễn Quang Hưng - Trần Phong Phú.