Trong phần 1, bạn đã được tìm hiểu những khái niệm cơ bản về kiểm thử phần mềm và quy trình phát triển phần mềm. Những thông tin đã biểu diễn trong các bài này chỉ là ở mức tổng quan, và cho bạn cái nhìn về cách mà các dự án phần mềm có thể hoạt động. Nhưng thật không may, trong thế giới thật, bạn sẽ không bao giờ thấy một phần mềm hoàn hảo theo một bất kỳ một mô hình phát triển phần mềm nào. Bạn sẽ không thể đưa ra được một bản đặc tả chi tiết hoàn toàn đầy đủ mà khách hàng cần và bạn cũng sẽ không đủ thời gian để làm tất cả những bài kiểm tra mà bạn cần phải làm. Không có vấn đề gì cả. Nhưng để trở thành một tester làm việc có hiệu quả, bạn cần phải biết tưởng tượng ra quy trình phần mềm làm việc như thế nào để đạt được mục đích.
Mục đích của bài này là làm dịu đi tác động của chủ nghĩa lý tưởng lên quá trình kiểm tra thực tế trên phần mềm. Nó sẽ giúp bạn thấy rằng, trong thực tế, sự thỏa hiệp và nhượng bộ phải xuyên suốt vòng đời phát triển phần mềm. Nhiều điều trong những sự thỏa hiệp này là liên quan quan trực tiếp đến nỗ lực kiểm thử phần mềm. Những lỗi mà bạn tìm thấy và những vấn đề mà bạn ngăn chặn, tất cả đều có ảnh hưởng đặc biệt tới dự án của bạn. Sau khi đọc bài này, bạn sẽ thu nhận được rất nhiều quy tắc, sự tiếp xúc, và những khả năng hồi đáp mà tester cần và hi vọng rằng bạn sẽ đưa ra những quyết định giúp kiến tạo ra một sản phẩm phần mềm.
Trọng tâm của bài này bao gồm:
- Tại sao phần mềm không bao giờ là hoàn hảo
- Tại sao kiểm thử phần mềm không phải là một vấn đề mang tích chất khuôn mẫu
- Những thuật ngữ phổ biến được sử dụng trong kiểm thử phần mềm
Đoạn đầu của bài này là một danh sách các phương châm hoặc các chân lý. Hãy coi chúng giống như “quy tắc đi đường” ("rules of the road") hoặc “chân lý của cuộc sống” ("facts of life") dành cho quá trình kiểm thử hoặc phát triển phần mềm. Mỗi một phương châm này là một sự hiểu biết nho nhỏ giúp họ đặt một số khía cạnh của toàn bộ quá trình xử lý vào viễn cảnh tương lai.
a) Tầm quan trọng của việc kiểm thử đầy đủ một chương trình:
Là một tester, bạn có thể tin rằng bạn có khả năng tiếp cận với một khía cạnh của phần mềm, kiểm tra nó, tìm ra tất cả các lỗi, và đảm bảo rằng phần mềm là hoàn hảo. Nhưng thật không may, điều này là không thể được, thậm chí là với một chương trình rất đơn giản, vì 4 lý do sau:
Tất cả các trường hợp trên nếu kết hợp cùng nhau, bạn sẽ thu được một tập các điều kiện vô cùng lớn đến mức không thể thử hết được. Nếu bạn không tin điều này thì có thể xem xét trong hình 3.1, phần mềm Microsoft Windows Calculator.
Thậm chí một chương trình đơn giản như Windows Calculator cũng quá phức tạp để kiểm thử đầy đủ
1+99999999999999999999999999999999=
Sau lần đầu tiên, bạn hoàn thành chuỗi số trên, bạn cũng có thể thử trên các phép toán 2+0=?, 2+1=?, 2+2=?... Và cứ tiếp tục như vậy. Cuối cùng, bạn sẽ phải thử nghiệm trên phép tính:
99999999999999999999999999999999+99999999999999999999999999999999=
Có rất nhiều lối (entry) vào có thể khiến bạn không bao giờ hoàn thành được chúng, thậm chí, nếu bạn sử dụng một siêu máy tính để chuyển dữ liệu vào Calculator. Nếu bạn quyết định loại bỏ một vài điều kiện kiểm tra bởi vì bạn thấy chúng dư thừa hoặc không cần thiết, hoặc chỉ để tiết kiệm thời gian (or just to save time), thì có nghĩa là bạn đã không kiểm tra chương trình một cách đầy đủ.
b) Kiểm thử phần mềm là một bài kiểm tra phụ thuộc vào sự rủi ro
Nếu bạn quyết định không kiểm tra mọi trường hợp kiểm thử, bạn sẽ phải chịu trách nhiệm về những rủi ro. Trong ví dụ về Calculator, trường hợp mà bạn lựa chọn để kiểm thử có lẽ là những trường hợp thông thường: 1024+1024=2048? Và có thể, lập trình viên đã tình cờ loại bỏ lỗi trong hoàn cảnh này. Nhưng trong những trường hợp không được kiểm tra, bạn cũng không thể đảm bảo rằng nó không có lỗi, và sẽ đến lúc khách hàng khám phá ra nó. Và khi 73;ó, chi phí cho việc sửa lỗi sẽ là lớn hơn rất nhiều so với việc sửa lỗi ngay từ đầu.
Điều này thật đáng sợ (This may all sound pretty scary). Bạn không thể kiểm tra mọi thứ, và nếu không kiểm tra mọi trường hợp thì bạn sẽ bỏ sót lỗi. Sản phẩm phải được tung ra thị trường, vì vậy, bạn cần dừng việc kiểm tra, nhưng nếu dừng quá sớm thì một số vùng sẽ không được kiểm thử. Bạn phải làm như thế nào?
Một nội dung quan trọng mà tester cần phải tìm hiểu là làm thế nào để giảm số lượng các trường hợp kiểm thử rất lớn thành một tập các test case có thể thực thi được, và làm thế nào để sáng suốt lựa chọn những quyết định ít rủi ro nhất. Điều này buộc tester phải xác định được đâu là vấn đề quan trọng và đâu là vấn đề không quan trọng.
Hình 3.2 mô tả mối quan hệ giữa số lượng các trường hợp test với số lượng các lỗi được tìm thấy. Nếu bạn cố thử kiểm tra mọi thứ, chi phí có thể tăng lên đột ngột và những lỗi bị bỏ quên sẽ giảm xuống thấp nhất, nhưng cũng sẽ không còn chi phí để tiếp tục dự án. Nếu bạn cắt giảm công việc kiểm thử thì chi phí cho nó sẽ ít, nhưng bạn sẽ bỏ quên rất nhiều lỗi. Mục đích là bạn phải lọc ra số các trường hợp kiểm thử tối ưu, để đảm bảo bạn không phải kiểm thử quá nhiều hay quá ít các trường hợp.
Mọi dự án phần mềm đều có một điểm nỗ lực kiểm thử tối ưu
Bạn sẽ được tìm hiểu làm thế nào để thiết kế và lựa chọn các kịch bản kiểm thử (test scenarios) sao cho ít rủi ro nhất và quá trình kiểm tra là tối ưu nhất.
c) Quá trình kiểm thử không thể biểu diễn những lỗi không tồn tại
Hãy nghĩ về điều này trong chốc nát. Bạn là một “kẻ hủy diệt” (exterminator) với bài kiểm tra các lỗi. Bạn xem xét hàng giờ và tìm ra dấu vết của các lỗi, lỗi này có thể vẫn đang tồn tại (live bug), đã được sửa (dead bug), hoặc còn đang tiềm ẩn (nest). Bạn có thể nói một cách an toàn rằng “the house has bugs”
Bạn đến thăm một “house” khác. Lần này, bạn không tìm thấy dấu vết của lỗi. Bạn hãy nhìn vào tất cả những địa điểm rõ ràng (obvious place) và tìm xem không có dấu hiệu nào của sự tàn phá. Có lẽ bạn nên tìm một vài lỗi đã từng được xử lý hoặc tiềm ẩn từ lâu, nhưng bạn hãy coi như không thấy gì cả. Có thể bạn tuyên bố một cách chắc chắn rằng “the house is bug free”? Không. Kết luận cuối cùng, có thể bạn không tìm thấy một live bug nào cả. Ngược lại, bạn tháo gỡ hoàn toàn the house thành foundation, bạn không thể chắc chắn rằng: bạn không bỏ quên một số lỗi đơn giản.
Tester làm việc chính xác như một “kẻ hủy diệt”. Nếu có thể biểu diễn những lỗi đang tồn tại, nhưng không thể biểu diễn những lỗi không tồn tại. Bạn có thể thực hiện bài kiểm tra của bạn, tìm và báo cáo các lỗi, nhưng bạn có thể kết luận rằng: lỗi không được tìm thấy nữa. Bạn có thể tiếp tục kiểm tra và khả năng tìm thấy lỗi là lớn hơn.
Quy tắc này sẽ giúp chúng ra lọc ra những tình huống khó xử để đưa ra quyết định. Có một cách khác để suy xét nó. Không phải là hiếm những trường hợp mà 2 người sử dụng có những nhận xét hoàn toàn trái ngược nhau về vấn đề chất lượng phần mềm. Một người thì nói rằng chương trình như vậy là không thể chấp nhận và người còn lại thì quả quyết rằng chương trình này là hoàn hảo. Có thể cả hai đều đúng? Câu trả lời là một người sử dụng sản phẩm theo cách mà rất nhiều lỗi bị bộc lộ. Còn người kia thì không.
Chú ý: Lỗi không được khám phá hoặc chưa từng được chú ý thì thường được gọi là lỗi ngầm (latent bug)
Nếu điều này quá khó hiểu thì cũng đừng lo lắng. Hãy đem nó ra thảo luận với đồng nghiệp trong đội kiểm thử của bạn và cố gắng hiểu điều mà họ nghĩ. Hãy lắng nghe những ý kiến khác, kiểm tra ý tưởng của họ và định hình lại suy nghĩ của chính mình. Hãy nhớ lại một câu hỏi quen thuộc: “ nếu một cái cây đổ trong rừng và không ai nghe thấy gì cả, vậy nó có tạo ra âm thanh không?” ("If a tree falls in the forest and there's no one there to hear it, does it make a sound?").
Kiểm thử phần mềm là công việc được thực hiện sau khi có sản phẩm. Các sản phẩm phần mềm và không phức tạp. Số lượng người với máy tính sử dụng phần mềm là bị giới hạn. Và, một số ít lập trình viên trong đội dự án của bạn có khả năng gỡ lỗi cho mỗi đoạn mã của người khác. Các lỗi là một vấn đề không tốt. Chúng xuất hiện và sớm được sửa chữa thì chi phí cho chúng sẽ không nhiều. Thường thì các tester không được huấn luyện và họ vẫn phát huy khả năng của họ trong các dự án sau để làm thay đổi nhiều thứ.
Hãy nhìn xem sản phẩm phần mềm cần được giúp đỡ và bạn sẽ nhìn thấy một danh sách các tester. Ngành công nghiệp phần mềm đang phát triển vượt bậc với mũi nhọn là đội ngũ tester chuyên nghiệp. Bởi vì hiện tại, người ta đã mất quá nhiều chi phí để xây dựng lên những phần mềm kém chất lượng.
Thật là tội tệ, không phải mọi công ty đều thống nhất quan điểm đó. Nhiều computer game và những công ty phần mềm nhỏ vẫn thường xuyên sử dụng những mô hình phát triển lỏng lẻo như big-bang hoặc code-and-fix. Nhưng bây giờ, nhiều phần mềm được phát triển và luôn tuân thủ kỷ luật. Các tester trở thành lực lượng lòng cốt, những thành viên sống còn trong nhiệm vụ của họ.
Đây sẽ là một vấn đề lớn, nếu bạn là thấy hứng thú với kiểm thử phần mềm. Nó đã trở thành một nghề nghiệp được nhiều người lựa chọn và cần phải được đào tạo, làm việc có kỷ luật và thúc đẩy sự tiến bộ.