Kiểm Thử Hộp Trắng (White-Box Testing): Kỹ Thuật, Ưu Nhược Điểm và Ứng Dụng Chi Tiết

Kiểm thử phần mềm là một phần không thể thiếu trong quy trình phát triển phần mềm, nhằm đảm bảo chất lượng và độ tin cậy của sản phẩm. Do phần mềm được tạo ra bởi con người, sai sót là điều khó tránh khỏi. Vì vậy, cần có các chuyên gia kiểm thử độc lập để đánh giá và phát hiện lỗi. Kiểm thử hộp trắng (White-box testing) là một trong những kỹ thuật kiểm thử quan trọng, đòi hỏi người kiểm thử phải hiểu rõ cấu trúc bên trong của phần mềm.

Bài viết này sẽ đi sâu vào kiểm thử hộp trắng, bao gồm định nghĩa, đối tượng áp dụng, ưu nhược điểm và các kỹ thuật phổ biến.

1. Kiểm Thử Hộp Trắng Là Gì?

Kiểm thử hộp trắng (White-box testing), còn được gọi là kiểm thử hộp trong, kiểm thử hộp kính, kiểm thử hộp mở, kiểm thử dựa trên mã nguồn (Code-Based Testing) hoặc kiểm thử cấu trúc (Structural Testing), là một phương pháp kiểm thử phần mềm mà người kiểm thử có kiến thức về cấu trúc bên trong và thiết kế của phần mềm. Điều này cho phép họ chọn các đầu vào cụ thể để thực thi các đường dẫn khác nhau trong mã và xác định xem đầu ra có phù hợp hay không.

Kỹ thuật kiểm thử hộp trắng - White-box testingKỹ thuật kiểm thử hộp trắng – White-box testing

Kiểm thử hộp trắng bao gồm phân tích dòng dữ liệu, dòng điều khiển, dòng thông tin, mã thực thi, ngoại lệ và các lỗi trình bày trong hệ thống. Mục tiêu là kiểm tra các hành động của phần mềm mà có thể không được phát hiện bởi các phương pháp kiểm thử khác.

2. Đối Tượng Áp Dụng

Đối tượng được kiểm thử trong kiểm thử hộp trắng thường là một thành phần phần mềm (TPPM). TPPM có thể là một hàm chức năng, một module chức năng, hoặc một phân hệ chức năng. Nói cách khác, nó tập trung vào các đơn vị nhỏ của phần mềm.

3. Mức Độ Áp Dụng

Kiểm thử hộp trắng có thể được áp dụng ở nhiều mức độ kiểm thử phần mềm khác nhau:

  • Kiểm thử đơn vị (Unit Testing): Để kiểm tra các đường dẫn trong một đơn vị mã (ví dụ: một hàm).
  • Kiểm thử tích hợp (Integration Testing): Để kiểm tra các đường dẫn giữa các đơn vị mã khác nhau.
  • Kiểm thử hệ thống (System Testing): Để kiểm tra các đường dẫn giữa các hệ thống con.

Mặc dù có thể áp dụng ở nhiều mức độ, kiểm thử hộp trắng thường được sử dụng chủ yếu trong kiểm thử đơn vị, nơi người kiểm thử có thể dễ dàng tiếp cận và hiểu mã nguồn.

4. Ưu Điểm và Nhược Điểm Của Kiểm Thử Hộp Trắng

Ưu điểm:

  • Kiểm thử sớm: Kiểm thử có thể bắt đầu sớm trong chu trình phát triển phần mềm, không cần đợi giao diện người dùng (GUI) hoàn thiện.
  • Kiểm thử kỹ lưỡng: Có thể bao phủ hầu hết các đường dẫn thực thi trong mã, đảm bảo kiểm tra kỹ lưỡng.
  • Tìm lỗi hiệu quả: Rất thích hợp để tìm kiếm lỗi và các vấn đề tiềm ẩn trong mã lệnh.
  • Phát hiện lỗi ẩn: Cho phép tìm kiếm các lỗi ẩn sâu bên trong hệ thống.
  • Tự kiểm tra: Lập trình viên có thể tự kiểm tra mã của mình, giúp cải thiện chất lượng mã.
  • Tối ưu mã hóa: Giúp tối ưu việc mã hóa bằng cách xác định các phần mã không hiệu quả hoặc dư thừa.
  • Kiểm soát lỗi tối đa: Do yêu cầu kiến thức cấu trúc bên trong của phần mềm, kiểm thử hộp trắng giúp kiểm soát lỗi một cách tối đa.

Nhược điểm:

  • Đòi hỏi kỹ năng cao: Các bài kiểm tra thường phức tạp, đòi hỏi người kiểm thử có kỹ năng cao, kiến thức sâu rộng về lập trình và kiến trúc phần mềm.
  • Bảo trì phức tạp: Việc bảo trì các kịch bản kiểm thử có thể trở thành gánh nặng nếu mã nguồn thay đổi thường xuyên.
  • Công cụ hạn chế: Vì phương pháp này liên quan chặt chẽ với ứng dụng đang được kiểm thử, các công cụ hỗ trợ có thể không sẵn có cho mọi loại triển khai hoặc nền tảng.

5. Các Kỹ Thuật Kiểm Thử Hộp Trắng Phổ Biến

5.1. Kiểm Thử Đường Cơ Bản (Đồ Thị Dòng)

Kiểm thử đường cơ bản, dựa trên đồ thị dòng, là một kỹ thuật kiểm thử hộp trắng được đề xuất bởi Tom McCabe. Đồ thị dòng tương tự như đồ thị luồng điều khiển của chương trình, là một phương pháp trực quan để thể hiện các thành phần của thuật toán và mối quan hệ giữa chúng.

  • Đồ thị dòng điều khiển: Gồm các nút (biểu thị các lệnh hoặc khối lệnh) và các cung (biểu thị luồng điều khiển giữa các nút).

Các loại nút trong đồ thị dòng điều khiểnCác loại nút trong đồ thị dòng điều khiển

Các kiểu cấu trúc thành phần đồ thị dòng

Ví dụ:

Ví dụ về đồ thị dòngVí dụ về đồ thị dòng

Nếu đồ thị dòng điều khiển chỉ chứa các nút quyết định nhị phân (ví dụ: các câu lệnh if-else), nó được gọi là đồ thị dòng điều khiển nhị phân.

Ví dụ về đồ thị dòng điều khiển nhị phânVí dụ về đồ thị dòng điều khiển nhị phân

  • Độ phức tạp Cyclomatic: Độ phức tạp Cyclomatic (C) của đồ thị dòng điều khiển được tính bằng một trong các công thức sau:
    • V(G) = E – N + 2, trong đó E là số cung và N là số nút của đồ thị.
    • V(G) = P + 1, nếu là đồ thị dòng điều khiển nhị phân (chỉ chứa các nút quyết định luận lý) và P là số nút quyết định.

Độ phức tạp Cyclomatic cho biết số đường thực thi tuyến tính độc lập của TPPM cần kiểm thử.

5.2. Kiểm Thử Dựa Trên Luồng Điều Khiển

  • Đường thi hành (Execution path): Là một kịch bản thi hành đơn vị phần mềm tương ứng, cụ thể là danh sách có thứ tự các lệnh được thi hành ứng với một lần chạy cụ thể của đơn vị phần mềm, bắt đầu từ điểm nhập đến điểm kết thúc.
  • Mỗi TPPM có thể có nhiều đường thi hành khác nhau.
  • Mục tiêu của phương pháp kiểm thử luồng điều khiển là đảm bảo mọi đường thi hành của đơn vị phần mềm đều chạy đúng. Tuy nhiên, trong thực tế, việc đạt được mục tiêu này tốn rất nhiều công sức và thời gian, ngay cả trên những đơn vị phần mềm nhỏ.

Ví dụ: Đoạn code sau:

for (i=1; i<=1000; i++)
  for (j=1; j<=1000; j++)
    for (k=1; k<=1000; k++)
      doSomethingWith(i,j,k);

Chỉ có một đường thi hành, nhưng rất dài: dài 1000 1000 1000 = 1 tỉ lệnh gọi hàm doSomething(i,j,k).

Ví dụ khác: Đoạn code gồm 32 lệnh if-else độc lập sau:

if (c1) s11 else s12;
if (c2) s21 else s22;
if (c3) s31 else s32;
...
if (c32) s321 else s322;

Có 2^32 = 4 tỉ đường thi hành khác nhau.

Ngay cả khi đã kiểm thử hết tất cả các đường thi hành, vẫn có thể không phát hiện được những đường thi hành cần có nhưng chưa được hiện thực:

if (a>0) doIsGreater();
if (a==0) dolsEqual();
// Thiếu việc xử lý trường hợp a < 0 - if (a<0) dolsLess();

Một đường thi hành đã được kiểm tra là đúng nhưng vẫn có thể bị lỗi khi sử dụng thực tế trong một vài trường hợp đặc biệt:

int phanso (int a, int b) {
  return a/b;
}

Khi kiểm tra, nếu chọn b != 0 thì chạy đúng, nhưng khi sử dụng thực tế trong trường hợp b = 0 thì hàm phân số bị lỗi.

Ngoài ra, còn có các kỹ thuật kiểm thử hộp trắng khác như:

  • Kiểm thử dựa trên luồng dữ liệu (Data – flow Testing): Tập trung vào việc theo dõi luồng dữ liệu thông qua mã nguồn.
  • Kiểm thử đột biến (Mutation Testing): Tạo ra các phiên bản “đột biến” của mã nguồn và kiểm tra xem các bài kiểm tra có thể phát hiện ra các thay đổi này hay không.

Kết Luận

Kiểm thử hộp trắng là một kỹ thuật kiểm thử phần mềm mạnh mẽ, cho phép người kiểm thử kiểm tra cấu trúc bên trong và logic của mã nguồn. Mặc dù đòi hỏi kiến thức chuyên môn cao, nó mang lại nhiều lợi ích trong việc phát hiện lỗi và cải thiện chất lượng phần mềm. Việc lựa chọn kỹ thuật kiểm thử hộp trắng phù hợp phụ thuộc vào đặc điểm của dự án, kỹ năng của người kiểm thử và mức độ kiểm tra cần thiết.

Tài liệu tham khảo: