You are on page 1of 8

3.

2 Kiểm thử hộp trắng (White-box testing)


3.2.1 Định nghĩa
Kiểm thử Hộp Trắng (hay còn gọi là Clear Box Testing, Open Box Testing, hoặc
Structural Testing,..) là một phương pháp kiểm thử phần mềm mà trong đó tester biết về
cấu trúc bên trong(mã nguồn, xử lý dữ liệu,…) của chương trình. Người kiểm tra sẽ chọn
đầu vào để thực hiện các đường dẫn thông qua mã và xác định đầu ra thích hợp. Kiểm thử
hộp trắng đòi hỏi người kiểm tra phải có kiến thức lập trình và kiến thức thực hiện.
Kiểm thử hộp trắng thực hiện việc kiểm tra mã phần mềm cho những điều sau:
 Các lỗ hổng bảo mật nội bộ
 Đường dẫn bị hỏng hoặc có cấu trúc kém trong quy trình mã hóa
 Luồng của các đầu vào cụ thể thông qua mã
 Sản lượng mong đợi
 Chức năng của vòng lặp có điều kiện
 Kiểm tra từng câu lệnh, đối tượng và chức năng trên cơ sở riêng lẻ

Đặc trưng:

 Kiểm thử hộp trắng dựa vào giải thuật cụ thể, cấu trúc dữ liệu bên trong của phần
mềm cần kiểm thử nhằm xác định đơn vị phần mềm đó có thực hiện đúng không.
 Người kiểm thử hộp trắng phải có kỹ năng, kiến thức nhất định để có thể hiểu chi
tiết về đoạn code cần kiểm thử.
 Nếu mức độ kiểm thử được nâng lên ở cấp kiểm thử tích hợp hay kiểm thử hệ
thống, thì sẽ cần nhiều thời gian và công sức để thực hiện.
 Do đó, kỹ thuật này chủ yếu được dùng để kiểm thử đơn vị. Kiểm thử đơn vị là
kiểm thử từng tác vụ của một class chức năng nào đó trong lập trình hướng đối
tượng.
 Có 2 hoạt động kiểm thử hộp trắng: Kiểm thử luồng điều khiển và kiểm thử dòng
dữ liệu.
3.2.2 Workflow

Kiểm thử hộp trắng được tiến hành trong hai bước cơ bản:

Bước 1: Nghiên cứu mã nguồn

Điều đầu tiên mà một tester cần làm là học và hiểu mã nguồn của ứng dụng. Vì
kiểm thử hộp trắng liên quan đến kiểm tra hoạt động bên trong của một ứng dụng nên
người kiểm tra phải rất hiểu biết về các ngôn ngữ lập trình được sử dụng trong các ứng
dụng mà họ đang kiểm tra.

Ngoài ra, người kiểm tra còn phải nhận thức cao về các thực hành mã hóa an toàn. Người
kiểm thử có thể tìm ra các vấn đề bảo mật và ngăn chặn các cuộc tấn công từ tin tặc, hoặc
người dùng nào đó, những người có thể cố ý hoặc vô tình nhúng mã độc vào ứng dụng.

Bước 2: Tạo các trường hợp kiểm tra và thực hiện

Bước này liên quan đến việc kiểm tra mã nguồn của ứng dụng để có luồng và cấu
trúc phù hợp.

Người kiểm thử sẽ phát triển các bài kiểm tra nhỏ cho từng quy trình hoặc một chuỗi quy
trình trong ứng dụng. Phương pháp này thường được thực hiện bởi các nhà phát triển,
người có kiến thức về mã.

Các phương pháp khác bao gồm Kiểm tra thủ công, thử nghiệm và kiểm tra lỗi, sử dụng
các công cụ kiểm tra.
3.2.3 Các kỹ thuật trong kiểm thử hộp trắng

3.2.3.1 Bao phủ câu lệnh (Statement coverage)

Trong kỹ thuật này, các câu lệnh được duyệt qua ít nhất một lần. Do đó mỗi dòng
mã đều được kiểm tra. Trong trường hợp một lưu đồ (flowchart), mọi nút cũng phải được
duyệt qua ít nhất một lần. Và vì tất cả các dòng mã đều được che phủ, giúp chỉ ra mã bị
lỗi dễ dàng hơn.

3.2.3.2 Bao phủ nhánh (Branch Coverage)

Trong kỹ thuật này, các trường hợp kiểm thử được thiết kế để mỗi nhánh từ tất cả
các điểm được duyệt qua ít nhất một lần. Và trong một sơ đồ, tất cả các cạnh phải được
duyệt qua ít nhất một lần.
Trong hình trên, có 4 test case được thử nghiệm sao cho tất cả các nhánh của điều kiện
đều được bao phủ. Có nghĩa là tất cả trường hợp đều được kiểm tra.

3.2.3.3 Bao phủ điều kiện (Condition Coverage)

Là phương pháp kiểm tra các biểu thức điều kiện trên hai giá trị True và False.

Đặc điểm: Cần xem xét kết hợp các điều kiện với nhau.

Ví dụ:
1. READ X, Y
2. IF(X == 0 || Y == 0)
3. PRINT ‘0’

Có 2 điều kiện: X==0 và Y==0. Để kiểm tra chúng là True hay False thì ta có:

Trường hợp 1: X = 0, Y = 10

Trường hợp 2: X = 10, Y = 0

3.2.3.4 Bao phủ nhiều điều kiện (Multiple Condition Coverage)

Tất cả các trường hợp có thể có của các kết quả, sẽ được kiểm tra ít nhất một lần.

Ví dụ:
1. READ X, Y
2. IF(X == 0 || Y == 0)
3. PRINT ‘0’

Ta sẽ có:

Trường hợp 1: X = 0, Y = 0

Trường hợp 2: X = 0, Y = 5

Trường hợp 3: X = 5, Y = 0

Trường hợp 4: X = 5, Y = 10

Sẽ cần 4 trường hợp thử nghiệm cho hai điều kiện riêng lẻ.

Vì vậy, nếu có n điều kiện thì ta sẽ có 2n trường hợp kiểm tra.

3.2.3.5 Bao phủ đường dẫn (Basic Path Testing)

Trong kỹ thuật này, đồ thị luồng điều khiển được tạo ra từ code hoặc lưu đồ và độ
phức tạp Cyclomatic được tính toán để xác định số lượng đường dẫn độc lập nhằm có thể
thiết kế số lượng trường hợp thử nghiệm tối thiểu cho mỗi đường độc lập.

Các bước được thực hiện như sau:

1. Lập biểu đồ đường điều khiển


2. Tính độ phức tạp chu kỳ
3. Tìm các đường độc lập
4. Thiết kế các trường hợp kiểm thử tương ứng với mỗi đường dẫn độc lập.

Ký hiệu biểu đồ luồng: nó là một đồ thị có hướng bao gồm các nút và các cạnh. Mỗi
nút đại diện cho một chuỗi các câu lệnh hoặc một điểm quyết định. Nút vị (predicate
node) đại diện cho điểm quyết định có chứa điều kiện mà biểu đồ phân tách. Các vùng
được giới hạn bởi các nút và các cạnh.

Độ phức tạp của đồ thị dòng: là thước đo độ phức tạp logic của phần mềm và được sử
dụng để xác định số lượng đường dẫn độc lập. Cho đồ thị G, V(G) là độ phức tạp chu kỳ
của nó. Tính V(G):

V(G) = Số miền phẳng;

V(G) = E - N + 2;

V(G) = P + 1.

Trong đó: E là số cạnh; N là số nút của đồ thị dòng; P là số nút vị từ.


V(G) cung cấp số các đường đi độc lập trong một chương trình và nó được coi là cận trên
của số lượng kiểm thử phải tiến hành để đảm bảo mỗi lệnh đều được thực hiện ít nhất
một lần.

Ví dụ:

Kết quả: V(G) = 4.

Không có đường độc lập = 4

 Đường 1: 1 – 2 – 4 – 7 – 8
 Đường 2: 1 – 2 – 3 – 5 – 7 – 8
 Đường 3: 1 – 2 – 3 – 6 – 7 – 8
 Đường 4: 1 – 2 – 4 – 7 - . . . – 7 – 8

3.2.3.5 Kiểm tra vòng lặp (Loop Testing)

Các vòng lặp được sử dụng nhiều và là nền tảng của nhiều thuật toán. Do đó việc
kiểm tra vòng lặp là rất quan trọng. Các lỗi thường xảy ra ở phần đầu và phần cuối của
vòng lặp.
Vòng lặp đơn giản (Simple loops): Với vòng lặp đơn giản kích thước n, các test case
được thiết kế như sau:

 Bỏ qua hoàn toàn vòng lặp


 Chỉ đi qua vòng lặp một lần
 Đi qua 2 lần
 m vòng lặp với m < n
 n-1 và n+1 vòng lặp

Vòng lặp lồng nhau (Nested loops): tất cả các vòng được đặt thành tối thiểu và bắt đầu
từ vòng lặp trong cùng. Thực hiện kiểm tra vòng lặp đơn giản cho vòng lặp trong cùng và
từ từ ra bên ngoài cho đến khi tất cả vòng lặp được kiểm tra.

Vòng lặp nối tiếp nhau (Concatenated loops): Kiểm tra vòng lặp đơn giản cho từng
vòng lặp độc lập. Nếu các vòng lặp không độc lập thì thực hiện kiểm tra vòng lặp lồng
nhau.

3.2.4 Ưu và nhược điểm

Ưu điểm

 Test có thể bắt đầu ở giai đoạn sớm, không cần phải đợi giao diện để có thể test.
 Test kỹ càng hơn, có thể bao phủ hầu hết các đường dẫn.
 Thích hợp trong việc tìm kiếm lỗi và các vấn đề trong mã lệnh. Cho phép tìm kiếm
các lỗi ẩn bên trong.
 Các lập trình viên có thể tự kiểm tra.
 Tối ưu việc mã hóa
 Việc kiểm soát lỗi tối đa nhất, do yêu cầu kiến thức cấu trúc bên trong phần mềm.

Nhược điểm

 Tốn kém về chi phí.


 Đòi hỏi phải có nguồn lực có tay nghề cao và kiến thức rộng về lập trình và thực
hiện.
 Các chức năng bị thiếu không thể được phát hiện khi các mã đang được kiểm tra.
 Rất phức tạp và đôi khi không thực tế.

You might also like