.5 Một ví dụ cho các con đường kiểm thử dựa vào CC

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu về phân tích chương trình và ứng dụng trong giảng dạy (Trang 39)

Trong ví dụ hình 3.5, CC là 4. Do đó mô-đun này có 4 con đường tuyến tính độc lập và đây là số lượng tối thiểu của con đường kiểm thửđểđạt được sự an toàn tối đa.

TC0: 0->1->2->3->11

TC1: 0->1->2->4->5->6->11

TC2: 0->1->2->4->5->7->8->10->2->3->11

TC3: 0->1->2->4->5->7->9->10->2->4->5->6->11

Những con đường kiểm thử này đạt được độ an toàn tối đa. Và bất kỳ con đường nào khác cũng sẽ phụ thuộc vào những con đường này.

3.2.4. Hạn chế của Cyclomatic Complexity

Các nghiên cứu khác nhau cho thấy, mô-đun chương trình có CC (Cyclomatic complexiy) lớn hơn 10 được xem là phức tạp. Mô-đun quá phức tạp làm giảm khả năng bảo trì và khả năng kiểm thử. Bảng 3.2 dưới đây là một số phạm vi tiêu chuẩn của các số liệu này.

Bảng 3.2 Một số phạm vi tiêu chuẩn của Cyclomatic complexity Cyclomatic Complexity Mức độ phức tạp và rủi ro Cyclomatic Complexity Mức độ phức tạp và rủi ro

1-10 Một chương trình đơn giản, không có nhiều rủi ro. 11-20 Phức tạp hơn, nguy cơở mức trung bình

21-50 Phức tạp hơn, rủi ro cao

CHƯƠNG 4: BÀI TOÁN NG DNG TRONG GING DY

Trong chương này tôi sẽ tập chung mô tả bài toán ứng dụng trong giảng dạy. Đồng thời tôi trình bày cách thức mà tôi sẽ giải quyết bài toán này. Bài toán này được tôi tham khảo trong tài liệu số [4].

4.1. Mô t bài toán

Bài toán mà tôi ứng dụng là xây dựng một hệ thống (ởđây tôi gọi tắt là hệ thống phân tích) hỗ trợ sinh viên học lập trình, nó giúp các sinh viên viết thành công các chương trình java trong giai đoạn học tập đầu tiên của mình. Trong hình 4.1 thể hiện cách vận hành của hệ thống này.

Hình 4.1 Cách vận hành của hệ thống phân tích chương trình java của sinh viên

Sinh viên thực hiện các bài tập lấy từ Cơ sở dữ liệu. Họ hoàn thành các bài tập và biên dịch bằng trình biên dịch java. Nếu có lỗi cú pháp thì trình biên dịch sẽ trả về thông báo lỗi cho sinh viên. Ngược lại nếu không có lỗi thì bài làm của sinh viên (tệp tin *.java) sẽ được đưa qua hệ thống phân tích, hệ thống sẽ đưa ra phản hồi cho sinh viên về giải pháp của sinh viên.

Theo [4], các phân tích đểđưa ra phản hồi cho sinh viên có hai mức độđược thể hiện như hình 4.2:

Phân tích dựa trên các đơn vị đo phần mềm: phân tích này đo sự phức tạp của chương trình. Dựa vào các số liệu tính toán được hệ thống sẽ trả về phản hồi cho sinh viên về chất lượng chương trình của mình.

Hình 4.2 Kiến trúc tổng thể của hệ thống phân tích

Phân tích sự tương tự về cấu trúc: mục đích của phân tích này là để tinh chỉnh kết quả của quá trình phân tích dựa trên các đơn vịđo phần mềm và kiểm tra cấu trúc của giải pháp sinh viên so sánh với các giải pháp mẫu. Trong việc phân tích, giải pháp sinh viên và giải pháp mô hình đều được chuyển sang một hình thức giả mã trừu tượng đại diện cho cấu trúc thuật toán trừu tượng của các chương trình (cây cú pháp trừu tượng). Thể hiện trừu tượng của giải pháp sinh viên và giải pháp mô hình được so sánh để xác định sự khác biệt. Phản hồi cho cả sinh viên chỉ ra sự giống nhau của các giải pháp sinh viên và giải pháp mẫu.

Bằng cách so sánh các giải pháp sinh viên với các giải pháp mẫu, hệ thống này có thể xác định khu vực có độ phức tạp cao trong mã lệnh của sinh viên, chẳng hạn như các phương thức dài. Khu vực chưa từng có giữa các giải pháp sinh viên và các giải pháp mẫu có thể được sử dụng để dự báo và cung cấp thông tin phản hồi tốt hơn cho sinh viên nếu giải pháp của họ cho kết quảđầu ra không chính xác trong phân tích động. Chương trình của SV Chương trình mẫu Hệ thống phân tích Phân tích dựa trên các đơn vịđo phần mềm Phân tích cấu trúc chương trình của sinh viên So sánh Hệ thống phân tích Phân tích cấu trúc chương trình mẫu Phản hồi cho sinh viên AST lưu dưới dạng XML AST lưu dưới dạng XML Phản hồi cho sinh viên

Khi hệ thống không thể tìm thấy một sự phù hợp giữa các giải pháp sinh viên và tất cả các giải pháp mẫu, các giải pháp sinh viên được gửi đến giáo viên để xem xét. Nếu giáo viên nhận ra rằng nó là một giải pháp đúng với bài tập, nó có thểđược thêm vào danh sách giải pháp mẫu.

4.2. Cách gii quyết bài toán

Để giải quyết bài toán này, tôi tiếp cận theo hai cách là: các đơn vịđo phần mềm (software metrics), phân tích sự tương tự về cấu trúc giữa chương trình sinh viên và chương trình mẫu.

4.2.1. Phân tích các đơn vị đo phần mềm

Các đơn vịđo phần mềm là một cách tiếp cận định lượng nổi tiếng được sử dụng đểđo chất lượng phần mềm. Trong phần này tôi sẽ trình bày giải pháp để tích hợp một đơn vị đo phần mềm là Cyclomatic complexity. Sau này tôi có thể thêm các đơn vịđo phần mềm khác nếu muốn.

Cyclomatic complexity có thể đo số lượng đường tuyến tính độc lập thông qua một mô-đun chương trình, nó cung cấp thông tin hữu ích về cấu trúc của một chương trình.

Ở đây tôi cài đặt thuật toán tính Cyclomatic complexity (CC) dựa vào công thức đơn giản hóa như sau:

CC = sốđiểm quyết định + 1 Thuật toán tính CC được mô tả như sau:

Input: Tệp tin chương trình của sinh viên Output: CC

Bước 1: Xác định tệp tin chương trình của sinh viên Bước 2: Gán CC=1

Bước 3: Lần lượt duyệt từng dòng lệnh trong tệp tin chương trình của sinh viên, nếu gặp lệnh (toán tử) quyết định nào thì tăng CC lên 1: CC=CC+1.

Chú ý: Các lệnh (toán tử) quyết định gồm có: if, else, while, case, for, switch, do, continue, break, &&, ||, ?, : , catch, finally, throw, throws, default, return, foreach, elseif, or, and, xor.

Bước 4: Trả về Cyclomatic complexity (CC)

Sau khi tính được số Cyclomatic complexity (CC) thì ta sẽ phản hồi lại cho sinh viên xem với sự phức tạp Cyclomatic complexity (CC) ấy thì nó ảnh hưởng như thế nào đến khả năng bảo trì và kiểm thử với các tiêu chí được đưa ra trong bảng 3.2.

4.2.2. Phân tích sự tương tự về cấu trúc

Đầu tiên chương trình của sinh viên sẽ được chạy bằng trình biên dịch java với tập đầu vào xác định. Đầu ra của chương trình sẽ được so sánh với tập đầu ra mong đợi. Nếu đúng ta chuyển sang phân tích cấu trúc để đưa ra phản hồi về chương trình của sinh viên. Nếu đầu ra sai sẽ thông báo cho sinh viên là giải pháp của họ cho kết quả sai cần kiểm tra lại sau đó sẽ đưa ra một vài cấu trúc chương trình gợi ý cho sinh viên.

Việc phân tích cấu trúc được thực hiện như sau:

Trước tiên, chương trình của sinh viên và các chương trình mẫu được chuyển sang một dạng đơn giản mô tả cấu trúc của chương trình (Dạng cây cú pháp trừu tượng được lưu dưới dạng tệp tin XML).

Ví dụ đoạn mã lệnh đầu vào như sau:

public class bai01 { int s,i;

s=0;

for(i=1;i<=10;i++) S=S+i;

}

Cây AST sinh ra từđoạn mã lệnh trên có dạng

n0 -> n1 // "PROGRAM" -> "CLASS" n1 -> n2 // "CLASS" -> "public" n1 -> n3 // "CLASS" -> "class" n1 -> n4 // "CLASS" -> "bai01" n1 -> n5 // "CLASS" -> "{" n1 -> n6 // "CLASS" -> "VARDECLARATION" n6 -> n7 // "VARDECLARATION" -> "int" n6 -> n8 // "VARDECLARATION" -> "s" n6 -> n9 // "VARDECLARATION" -> "," n6 -> n10 // "VARDECLARATION" -> "i" n6 -> n11 // "VARDECLARATION" -> ";" n1 -> n12 // "CLASS" -> "ASIGMENT" n12 -> n13 // "ASIGMENT" -> "s" n12 -> n14 // "ASIGMENT" -> "=" n12 -> n15 // "ASIGMENT" -> "0" n12 -> n16 // "ASIGMENT" -> ";" n1 -> n17 // "CLASS" -> "LOOP" n17 -> n18 // "LOOP" -> "for" n17 -> n19 // "LOOP" -> "(" n17 -> n20 // "LOOP" -> "i" n17 -> n21 // "LOOP" -> "=" n17 -> n22 // "LOOP" -> "1" n17 -> n23 // "LOOP" -> ";" n17 -> n24 // "LOOP" -> "i"

n17 -> n25 // "LOOP" -> "<=" n17 -> n26 // "LOOP" -> "10" n17 -> n27 // "LOOP" -> ";" n17 -> n28 // "LOOP" -> "i" n17 -> n29 // "LOOP" -> "++" n17 -> n30 // "LOOP" -> ")" n17 -> n31 // "LOOP" -> "ASIGMENT" n31 -> n32 // "ASIGMENT" -> "S" n31 -> n33 // "ASIGMENT" -> "=" n31 -> n34 // "ASIGMENT" -> "S" n31 -> n35 // "ASIGMENT" -> "+" n31 -> n36 // "ASIGMENT" -> "i" n31 -> n37 // "ASIGMENT" -> ";" n1 -> n38 // "CLASS" -> "}"

Cây cú pháp trừu tượng này có thểđược trực quan hóa như sau:

Hình 4.3 Ví dụ một cây AST được sinh ra

Để thuận tiện ta sẽ lưu lại cấu trúc của cây AST này vào một tệp tin XML. Tệp tin XML của ví dụ trên có dạng:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <program> <CLASS> <ASIGMENT>1</ASIGMENT> <LOOP> 1 <ASIGMENT>1</ASIGMENT> </LOOP> </CLASS> </program>

Khi lưu vào tệp tin XML, đểđơn giản tôi giản lược bớt các loại lệnh không quan trọng (không ảnh hưởng đến cấu trúc của chương trình) và chỉđể lại các loại lệnh sau: Khai báo hàm (METHOD), lệnh gán (ASIGMENT), lệnh lặp (LOOP), lệnh điều kiện

if (CONDITION), lời gọi hàm (METHODCALL), nhánh đúng, sai của điều kiện (TRUEBANK), FALSEBANK).

Sau đó, tệp tin XML lưu cấu trúc chương trình của sinh viên sẽ được đọc để so sánh với từng tệp tin XML lưu cấu trúc chương trình mẫu. Chương trình sẽ so sánh từng nút nếu kết thúc sự so sánh mà không tìm thấy sự khác nhau thì kết luận là chương trình sinh viên giống với giải pháp mẫu nào và đánh giá mức độ giải pháp đó. Nếu không tìm thấy giải pháp mẫu nào giống với giải pháp sinh viên thì giáo viên sẽ xem xét giải pháp của sinh viên. Nếu giải pháp này hợp lý có thể bổ sung vào làm một giải pháp mẫu cho bài tập đó.

Để có thể đưa ra được đánh giá cho từng giải pháp của sinh viên thì ta cần thiết kế một cơ sở dữ liệu để lưu lại các bài tập và các giải pháp cho bài tập ấy. Đồng thời ở mỗi giải pháp cũng phải lưu lại mức độđánh giá cho từng bài tập.

Cơ sở dữ liệu lưu các giải pháp mẫu có thểđược thiết kế như sau:

Hình 4.4 Cấu trúc cơ sở dữ liệu của hệ thống 1. Bảng BaiTap 1. Bảng BaiTap

Đây là bảng lưu lại các bài tập của hệ thống đưa ra cho sinh viên làm. Bảng gồm các cột được nêu trong bảng 4.1:

Bảng 4.1 Các cột trong bảng dữ liệu BaiTap

STT Tên cột Mô tả

1 MaBai Mã (định danh) của bài tập 2 TenBai Tên gọi của bài tập (nếu có) 3 YeuCau Yêu cầu của bài tập

2. Bảng GiaiPhap

Đây là bảng lưu lại các chương trình mẫu (giải pháp mẫu) ứng với các bài tập. Bảng gồm các cột được nêu trong bảng 4.2:

Bảng 4.2 Các cột trong bảng dữ liệu GiaiPhap

STT Tên cột Mô tả

1 MaGP Mã (định danh) của giải pháp 2 TenGP Tên của giải pháp (nếu có)

3 MaBai Mã bài tập tương ứng của giải pháp

4 GiaiPhap Đường dẫn đến tệp tin mã nguồn của giải pháp 5 DanhGia Lưu lại lời đánh giá cho giải pháp

3. bảng tblKT_Dong

Bảng này đưa ra tập các đầu vào, đầu ra mong đợi cho bài tập tương ứng. Bảng này phục vụ cho phân tích động. Bảng gồm các cột được mô tả trong bảng 4.3

Bảng 4.3 Các cột trong bảng dữ liệu tblKT_Dong

STT Tên cột Mô tả

1 id Mã (định danh) của ca kiểm thử 2 MaBai Mã bài tập tương ứng

3 DauVao Một đầu vào nào đó của bài tập

4 DauRa Đầu ra mong đợi tương ứng với đầu vào

4.3. Ví d

Câu hỏi: In ra màn hình tất cả các số nguyên tố từ 1000 đến 2000 Giả sử một sinh viên đưa ra cách làm như sau:

package javaapplication4;

public class JavaApplication4 {

public static void main(String[] args) { int k,n,dem; for (k=1000;k<=2000;k++) { dem=0; for (n=2;n<=k;n++) { if(k%n==0) dem++; } if(dem==1) System.out.println(k); } } }

Trong giải pháp mẫu có hai giải pháp cho bài tập trên. Một giải pháp giống với giải pháp sinh viên với lời đánh giá là: “Giải pháp này nên được cải thiện là tổ chức chức năng kiểm tra số nguyên tố thành hàm”.

Giải pháp thứ hai trong mẫu như sau: package javaapplication4;

import java.io.InputStreamReader; import java.util.Scanner;

public class JavaApplication4 { static boolean SoNT(int n) { boolean snt; int dem,i; snt=false; dem=0; for (i=2;i<=n;i++) if(n%i==0) dem++; if(dem==1) snt=true; return snt; }

public static void main(String[] args) { int k,n,dem; for (k=1000;k<=2000;k++) { if(SoNT(k)) System.out.println("\n"+k); } } }

Giải pháp này có lời đánh giá là: “Giải pháp này chưa được tối ưu trong việc kiểm tra số nguyên tố”

Khi đưa giải pháp của sinh viên qua hệ thống phân tích, hệ thống sẽ phân tích theo hai chức năng sau:

1. Phân tích đơn vị đo Cyclomatic Complexity

Với đoạn mã lệnh trong giải pháp của sinh viên ta thấy có 4 điểm quyết định nên khi tính Cyclomatic complexity ta sẽ thu được kết quả là 5. Và với giá trị này thì độ phức tạp của chương trình là thấp, có thể kiểm thửđược, rủi ro ít.

2. Phân tích cấu trúc

Khi đưa chương trình của sinh viên qua hệ thống phân tích, hệ thống sẽ đưa ra kết quả là: “Chúc mừng bạn chương trình của bạn đúng. Giải pháp này nên được cải thiện là tổ chức chức năng kiểm tra số nguyên tố thành hàm”.

Đồng thời hệ thống sẽđưa ra cấu trúc của chương trình sinh viên là: program CLASS METHOD LOOP ASIGMENT LOOP CONDITION TRUEBANK CONDITION TRUEBANK

Đồng thời hệ thống đưa ra cấu trúc các chương trình mẫu khác làm gợi ý cho sinh viên.

Cấu trúc chương trình mẫu khác ở ví dụ này có dạng như sau: program CLASS METHOD ASIGMENT ASIGMENT LOOP CONDITION TRUEBANK CONDITION TRUEBANK METHOD LOOP CONDITION TRUEBANK

Nếu trong trường hợp chương trình của sinh viên có thuật toán sai dẫn đến việc cho kết quảđầu ra khác với kết quả mong đợi thì chương trình cũng đưa ra hướng dẫn là hai cấu trúc ứng với hai cách giải trên đồng thời đưa ra lời đánh giá cho từng cách.

Hoặc nếu chương trình của sinh viên cho kết quả đúng nhưng cấu trúc không đúng như hai cách trên thì giáo viên sẽ xem xét lại cách giải của sinh viên có phù hợp không để cho nó trở thành một dạng mẫu khác cho bài tập này.

CHƯƠNG 5: THC NGHIM

5.1. Các chc năng đã cài đặt được

Tôi đã thực hiện cài đặt chương trình theo bài toán mà chương bốn tôi đã trình bày. Do thời gian có hạn nên hệ thống tôi xây dựng mới có các chức năng như sau:

Sinh viên lấy bài tập từ hệ thống và làm bài tập lập trình của mình bằng ngôn ngữ java, sau đó lưu tệp tin với đuôi mở rộng là .java. Tệp tin chương trình java của sinh viên được đưa qua hệ thống phân tích cú pháp, hệ thống phân tích chương trình của sinh viên theo hai khía cạnh là phân tích software metrics (cụ thể là Cyclomatic complexiy) và phân tích sự tương tự về cấu trúc.

+ Sau khi hệ thống tính được Cyclomatic complexiy chương trình của sinh viên, hệ thống sẽ phản hồi lại về sự phức tạp của chương trình.

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu về phân tích chương trình và ứng dụng trong giảng dạy (Trang 39)

Tải bản đầy đủ (PDF)

(61 trang)