JavaScript is required

Trong kiểm thử hộp trắng, nội dung nào sau đây là không đúng?

A. Đường thi hành là một kịch bản thi hành của một đơn vị chương trình.
B. Mỗi đơn vị chương trình chỉ có duy nhất một đường thi hành.
C. Mục tiêu của kiểm thử dòng điều khiển là để đảm bảo mọi đường thi hành của đơn vị chương trình đều chạy đúng.
D. Tất cả các nội dung trên đều đúng.
Trả lời:

Đáp án đúng: B


Câu hỏi này kiểm tra kiến thức về kiểm thử hộp trắng, đặc biệt là các khái niệm liên quan đến đường thi hành và kiểm thử dòng điều khiển. Phương án A đúng vì đường thi hành (execution path) đúng là một kịch bản thi hành của một đơn vị chương trình. Nó mô tả trình tự các lệnh được thực hiện khi chương trình chạy với một tập hợp đầu vào cụ thể. Phương án B sai vì một đơn vị chương trình có thể có nhiều đường thi hành khác nhau, tùy thuộc vào các điều kiện và nhánh rẽ trong mã nguồn. Mỗi tập hợp đầu vào có thể dẫn đến một đường thi hành khác nhau. Phương án C đúng vì mục tiêu của kiểm thử dòng điều khiển (control flow testing) là để đảm bảo mọi đường thi hành của đơn vị chương trình đều được kiểm tra và chạy đúng. Điều này bao gồm việc kiểm tra tất cả các nhánh, vòng lặp, và điều kiện trong mã. Do đó, đáp án không đúng là B.

Câu hỏi liên quan

Lời giải:
Đáp án đúng: B
Để đạt được độ phủ cấp 1 (statement coverage), chúng ta cần thực hiện các test case sao cho mỗi dòng code được thực thi ít nhất một lần. Xét đoạn code đã cho:

1. `if (a==0) return 0;`: Cần một test case để `a == 0` (ví dụ: `a = 0`, `b = 1`, `c = 2`, `d = 3`). Test case này sẽ khiến hàm trả về 0.
2. `int x = 0;`: Dòng này luôn được thực thi nếu `a != 0`.
3. `if ((a==b) || ((c==d))) x = 1;`: Cần một test case để điều kiện `(a==b) || ((c==d))` là đúng (ví dụ: `a = 1`, `b = 1`, `c = 2`, `d = 3`). Điều này làm cho `x = 1`.
4. `if ((a==b) || ((c==d))) x = 1;`: Cần một test case để điều kiện `(a==b) || ((c==d))` là sai (ví dụ: `a = 1`, `b = 2`, `c = 3`, `d = 4`). Điều này làm cho `x = 0`.
5. `e = 1/x;`: Để dòng này được thực thi mà không gây ra lỗi chia cho 0, ta cần đảm bảo `x != 0`. Trường hợp `x=1` đã được đề cập ở trên. Tuy nhiên, trường hợp `x=0` cũng cần được xét, dù sẽ gây ra lỗi runtime.
6. `return e;`: Dòng này luôn được thực thi nếu không có `return` sớm.

Vậy tổng cộng, chúng ta cần ít nhất 3 test case để đảm bảo phủ hết các nhánh rẽ và các dòng lệnh (trừ trường hợp gây lỗi chia cho 0, nhưng vẫn cần test).

- Test case 1: a = 0, b = 1, c = 2, d = 3 (để phủ `a == 0`)
- Test case 2: a = 1, b = 1, c = 2, d = 3 (để phủ `(a==b) || (c==d)` là đúng, x = 1)
- Test case 3: a = 1, b = 2, c = 3, d = 4 (để phủ `(a==b) || (c==d)` là sai, x = 0)

Như vậy, đáp án đúng là C. 3
Câu 14:

Cho đoạn code sau đây, hãy chọn đáp án đúng nhất:float foo(int a, int b, int c, int d){float e;if (a==0) return 0;int x = 0;if ((a==b) || (c==d)) x = 1;e = 1/x;return e;}Chúng ta cần bao nhiêu testcase để đảm bảo phủ cấp 2.

Lời giải:
Đáp án đúng: C
Đoạn code có các điều kiện sau:
1. `a == 0`: ảnh hưởng đến việc trả về giá trị 0 ngay lập tức.
2. `(a == b) || (c == d)`: ảnh hưởng đến giá trị của `x`. Nếu điều kiện này đúng, `x` sẽ bằng 1, ngược lại `x` sẽ bằng 0.
3. `e = 1/x`: có thể gây ra lỗi chia cho 0 nếu `x` bằng 0.

Để phủ cấp 2 (branch coverage), chúng ta cần đảm bảo mỗi nhánh của mỗi điều kiện được thực thi ít nhất một lần. Do đó cần xét các trường hợp sau:

* Testcase 1: `a = 0`. Nhánh `if (a == 0)` được thực thi và trả về 0.
* Testcase 2: `a != 0`, `a == b`, và `c != d`. Nhánh `if (a == 0)` không được thực thi, và `x` bằng 1.
* Testcase 3: `a != 0`, `a != b`, và `c == d`. Nhánh `if (a == 0)` không được thực thi, và `x` bằng 1.
* Testcase 4: `a != 0`, `a != b`, và `c != d`. Nhánh `if (a == 0)` không được thực thi, và `x` bằng 0.

Như vậy, cần tối thiểu 4 testcase để đảm bảo phủ cấp 2.
Câu 15:

Cho đoạn code sau đây, hãy chọn đáp án đúng nhất:float foo(int a, int b, int c, int d){float e;if (a==0) return 0;int x = 0;if ((a==b) || (c==d)) x = 1;e = 1/x;return e;}Chúng ta cần bao nhiêu testcase để đảm bảo phủ cấp 3.

Lời giải:
Đáp án đúng: C
Đề bài yêu cầu số lượng test case để đảm bảo phủ cấp 3 (còn gọi là branch coverage). Đoạn code có các nhánh sau:
1. `if (a == 0)`: Cần 2 test case (true/false)
2. `if ((a == b) || (c == d))`: Cần các test case để phủ các trường hợp sau:
- a == b là true
- a == b là false và c == d là true
- a == b là false và c == d là false
Tuy nhiên, nếu x = 0, chương trình sẽ bị lỗi chia cho 0 (`e = 1/x`). Vì vậy, chúng ta cần thêm một test case để đảm bảo x != 0.
Vậy ta cần các test case sau:
1. a = 0 (để phủ nhánh `if (a==0)` là true)
2. a != 0, a = b (để phủ nhánh `(a==b) || (c==d)` là true và `a==b` là true)
3. a != 0, a != b, c = d (để phủ nhánh `(a==b) || (c==d)` là true và `a==b` là false, `c==d` là true)
4. a != 0, a != b, c != d (để phủ nhánh `(a==b) || (c==d)` là false)
Như vậy cần tối thiểu 4 test case để phủ hết các nhánh.
Câu 16:

Độ phức tạp Cyclomatic của đồ thị cho bên dưới là:

 Độ phức tạp Cyclomatic của đồ thị cho bên dưới là:A. 1B. 2C. 3D. 4 (ảnh 1)

Lời giải:
Đáp án đúng: C
Độ phức tạp Cyclomatic (Cyclomatic Complexity) có thể được tính bằng công thức V(G) = E - N + 2, trong đó E là số cạnh của đồ thị và N là số nút của đồ thị.

Trong đồ thị đã cho:
- Số cạnh (E) = 9
- Số nút (N) = 8

Áp dụng công thức: V(G) = 9 - 8 + 2 = 3

Vậy độ phức tạp Cyclomatic của đồ thị là 3.
Câu 17:

Công thức tính độ phức tạp cyclomatic M của một đoạn mã lệnh:

Lời giải:
Đáp án đúng: A
Độ phức tạp Cyclomatic (Cyclomatic Complexity) là một thước đo độ phức tạp của một chương trình. Nó được tính bằng công thức M = E - N + 2P, trong đó:

* M là độ phức tạp Cyclomatic
* E là số cạnh (edges) trong đồ thị luồng điều khiển.
* N là số nút (nodes) trong đồ thị luồng điều khiển.
* P là số thành phần liên thông (connected components). Trong hầu hết các trường hợp, P = 1 (một chương trình/hàm). Nếu đoạn code có nhiều điểm bắt đầu/kết thúc riêng biệt, thì P > 1.

Do đó, đáp án A là đáp án đúng.
Câu 18:

Cho sơ đồ sau. Xác định chuỗi trạng thái đúng cho biến e

 Cho sơ đồ sau. Xác định chuỗi trạng thái đúng cho biến eA. ~ddukB. ~dukC. ddukD. Tất cả đều sai (ảnh 1)

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Câu 19:

Trong kiểm thử dòng dữ liệu tĩnh, người kiểm thử phải chạy mã nguồn để xác định các sai sót có thể xảy ra.

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Câu 20:

Trong kiểm thử dòng dữ liệu tĩnh, người kiểm thử không cần chạy mã nguồn để xác định các sai sót có thể xảy ra.

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Câu 21:

Kiểm thử hộp đen là chiến lược kiểm thử yêu cầu người kiểm thử phải hiểu rõ mã nguồn của phần mềm.

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP
Câu 22:

Một textbox chỉ nhận giá trị ký tự từ [A-Z], [0-9]. Chỉ ra một giá trị thuộc lớp tương đương không hợp lệ:

Lời giải:
Bạn cần đăng ký gói VIP để làm bài, xem đáp án và lời giải chi tiết không giới hạn. Nâng cấp VIP