KTPM hàm 2

By Vy Tien
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:

  1. Vẽ đồ thị luồng điều khiển.
  2. Tính độ phức tạp Cyclomatic của đồ thị.
  3. Xác định tập các đường cơ sở.
  4. 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.
  5. 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.
  6. 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
  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.

Written with StackEdit.

Tags: ktpm
Share: Twitter Facebook LinkedIn