- 1. Đồ thị luồng điều khiển:
- 2. Độ phức tạp:
- 3. Danh sách đường cơ sở:
- 4. Cần 2 test case để 100% bao phủ câu lệnh:
- 5. Cần 3 test case để 100% bao phủ nhánh:
- 6. Cần 3 test case để 100% bao phủ quyết định:
- 7. Áp dụng luồng dữ liệu trạng thái để xác định các bất thường của các biến.
- 8. Xác định def,c-use, p-use của các biến trong chương trình
- 9. Kiểm thử luồng dữ liệu bằng phủ All defs-coverage, All-uses coverage, All-Du-Paths Coverage
- KTPM requirements:
namespace App\Http\Services\GateService;
// chỉ lấy những quyền của admin
1. static function getAdminAbility($gateAbility): array
{
// quy ước tên quyền
// <role>.<tên quyền>.<hành động>
// admin.category.index
// user.category.index
2. if(is_array($gateAbility))
{
3. for($i = 0;
4. $i < count($gateAbility);
5. $i++) {
//xoá những quyền không chứa "admin"
6. if (!str_contains(array_keys($gateAbility)[$i], "admin"))
7. unset($gateAbility[$i]);
}
8. return $gateAbility;
}
9. return [];
}
1. Đồ thị luồng điều khiển:
flowchart TD
p0(("Start"))
p1(("1"))
p2(("2"))
p3(("3"))
p4(("4"))
p5(("5"))
p6(("6"))
p7(("7"))
p8(("8"))
p9(("9"))
pe(("End"))
p0-->p1-->p2--False-->p9-->pe
p2--True-->p3-->p4
p4--False-->p8-->pe
p4--True-->p6
p6--True-->p7
p7-->p5
p6--False-->p5
p5-->p4
e = 10
n = 9
p = 2
2. Độ phức tạp:
V(G) = e - n + 2P = 10 - 9 + 2 * 2 = 4
3. Danh sách đường cơ sở:
- 1->2->9
- 1->2->3->4->8
- 1->2->3->4->6->7->5->4->8
- 1->2->3->4->6->5->4->8
4. Cần 2 test case để 100% bao phủ câu lệnh:
Test case 1:
public function testTestCaseOne(): void
{
$gateAbility = "admin.category.index";
$result = GateService::getAdminAbility($gateAbility);
$this->assertTrue($result == array());
}
Path
- 1->2->9
Test case 2:
public function testTestCaseTwo(): void
{
$gateAbility = array("admin" => function () {},
"user" => function () {});
$result = GateService::getAdminAbility($gateAbility);
$this->assertTrue($result === array("admin" => function () {}));
}
- 1->2->3->4->6->7->5->4->8
5. Cần 3 test case để 100% bao phủ nhánh:
- 1->2->9
- 1->2->3->4->6->7->5->4->8
- 1->2->3->4->6->5->4->8
6. Cần 3 test case để 100% bao phủ quyết định:
- 1->2->9
- 1->2->3->4->6->7->5->4->8
- 1->2->3->4->6->5->4->8
7. Áp dụng luồng dữ liệu trạng thái để xác định các bất thường của các biến.
Xét biến $gateAbility
flowchart TD
p0(("Start"))
p1(("1. d($gateAbility)"))
p2(("2. u($gateAbility)"))
p3(("3"))
p4(("4. u($gateAbility)"))
p5(("5"))
p6(("6. u($gateAbility)"))
p7(("7. u($gateAbility)"))
p8(("8. u($gateAbility)"))
p9(("9"))
pe(("End. k(all)"))
p0-->p1-->p2--False-->p9-->pe
p2--True-->p3-->p4
p4--False-->p8-->pe
p4--True-->p6
p6--True-->p7
p7-->p5
p6--False-->p5
p5-->p4
P1: ~duk P2: ~duuuk P3: ~duuuuuk
Cả 3 đường trên đều không chứa cặp đôi nào bất thường. ⇒ Không có bất thường
Xét biến $i
flowchart TD
p0(("Start"))
p1(("1"))
p2(("2"))
p3(("3. d($i)"))
p4(("4. u($i)"))
p5(("5. d($i)"))
p6(("6. u($i)"))
p7(("7. u($i)"))
p8(("8"))
p9(("9"))
pe(("End. k(all)"))
p0-->p1-->p2--False-->p9-->pe
p2--True-->p3-->p4
p4--False-->p8-->pe
p4--True-->p6
p6--True-->p7
p7-->p5
p6--False-->p5
p5-->p4
P1: ~duuuuk P2: ~duuuuuk
Cả 2 đường trên đều không chứa cặp đôi nào bất thường. ⇒ Không có bất thường
8. Xác định def,c-use, p-use của các biến trong chương trình
Dòng 1:
- def của $gateAbility
Dòng 2:
- p-use của $gateAbility
Dòng 3:
- def của $i
Dòng 4:
- p-use của $i
- p-use của $gateAbility
Dòng 5:
- def của $i
Dòng 6:
- c-use của $i
- c-use của $gateAbility
Dòng 7:
- c-use của $i
- c-use của $gateAbility
Dòng 8:
- c-use của $gateAbility
9. Kiểm thử luồng dữ liệu bằng phủ All defs-coverage, All-uses coverage, All-Du-Paths Coverage
All defs-coverage
Xác định các biến: $gateAbility, $i
Xét biến $gateAbility:
- Tập def của $gateAbility: {1}
- Tập use của $gateAbility: {2,4,6,7,8}
- Từ đỉnh 1 đến đỉnh 2 tồn tại cặp def-use (1,2)
- Path: [1,2,6,7]
Xét biến $i:
- Tập def của $i: {3,5}
- Tập use của $i: {4, 6, 7}
- Từ đỉnh 3 đến đỉnh 4 tồn tại cặp def-use (3,4)
- Path: [1,2,3,4,8]
⇒ Thoả điều kiện của all defs-coverage
All-uses coverage
Xét biến $gateAbility
- Từ d1($ gateAbility) đến u2($ gateAbility)
- Từ d1($ gateAbility) đến u4($ gateAbility)
- Từ d1($ gateAbility) đến u6($ gateAbility)
- Từ d1($ gateAbility) đến u7($ gateAbility)
- Từ d1($ gateAbility) đến u8($ gateAbility)
Cặp def use và def clear path của biến này:
- (1,2): [1,2]
- (1,4): [1,2,3.4]
- (1,6): [1,2,3,4,6]
- (1,7): [1,2,3,4,6,7]
- (1,8): [1,2,3,4,8]
Xét biến $i
- Từ d3($ i) đến u4($ i)
- Từ d3($ i) đến u6($ i)
- Từ d3($ i) đến u7($ i)
Cặp def use và def clear path của biến này:
- (3,4): [3,4]
- (3,5): [3,4,6,5]
- (3,6): [3,4,6]
- (3,7): [3,4,6,7]
⇒ Thoả điều kiện All-uses coverage
All-Du-Paths Coverage
Xét biến $gateAbility
- Tất cả d1($ gateAbility) đến u2($ gateAbility): [1,2]
- Tất cả d1($ gateAbility) đến u4($ gateAbility): [1,2,3,4]
- Tất cả d1($ gateAbility) đến u6($ gateAbility): [1,2,3,4,6]
- Tất cả d1($ gateAbility) đến u7($ gateAbility): [1,2,3,4,6,7]
- Tất cả d1($ gateAbility) đến u8($ gateAbility): [1,2,3,4,8], [1,2,3,4,6,7,5,4,8], [1,2,3,4,6,5,4,8]
Các đường dẫn thoả yêu cầu:
- [1,2,9]
- [1,2,3,4,8]
- [1,2,3,4,6,7,5,4,8]
- [1,2,3,4,6,5,4,8]
Xét biến $i
- Tất cả d3($ i) đến u4($ i): [3,4]
- Tất cả d3($ i) đến u5($ i): [3,4,6,5], [3,4,6,7,5]
- Tất cả d3($ i) đến u6($ i): [3,4,6]
- Tất cả d3($ i) đến u7($ i): [3,4,6,7]
Các đường dẫn thoả yêu cầu:
- [1,2,3,4,8]
- [1,2,3,4,6,7,5,4,8]
- [1,2,3,4,6,5,4,8]
⇒ Thoả điều kiện All-Du-Paths Coverage
KTPM requirements:
- Vẽ đồ thị luồng điều khiển.
- Tính độ phức tạp Cyclomatic của đồ thị.
- Xác định tập các đường cơ sở.
- Cần bao nhiêu test để 100% bao phủ câu lệnh
(Statement coverage - SC). Xác định các đường dẫn tương ứng. - Cần bao nhiêu test đối với 100% bao phủ bao phủ nhánh (Branch coverage - BC). Xác định các đường dẫn tương ứng.
- Cần bao nhiêu test đối với 100% bao phủ bao phủ quyết định (Decision coverage - DC). Xác định các đường dẫn tương ứng
- Áp dụng luồng dữ liệu trạng thái để xác định các bất thường của các biến.
- Xác định def,c-use, p-use của các biến trong chương trình
- Kiểm thử luồng dữ liệu bằng phủ All defs-coverage, All-uses coverage, All- Du- Paths Coverage.
Written with StackEdit.