Bài giảng Kỹ thuật lập trình - Chương 6: Testing - Vũ Đức Vượng

Testing  
1
Mục đích  
• Giúp hiểu về:  
• Internal testing  
• External testing  
• General testing strategies  
• Vì sao?  
• Khó có thể khẳng định 1 CT lớn có làm việc chuẩn hay  
không  
• Khi XD 1 CT lớn, 1 LTV chuyên nghiệp sẽ dành thời  
gian cho việc viết test code không ít hơn tg dành cho  
viết bản thân CT  
• LTV chuyên nghiệp là người có khả năng, kiến thức rộng  
về các kỹ thuật và chiến lược testing  
2
Testing and debugging  
• Testing & debugging đi cùng với nhau như 1 cặp:  
• Testing tìm errors; debugging định vị và sửa chúng.  
• Ta có mô hình “testing/debugging cycle”: Ta test, rồi  
debug, rồi lặp lại.  
• Bất kỳ 1 debugging nào nên được tiếp theo là 1 sự áp  
dụng lại của hàng loạt các tests liên quan, đặc biệt là  
các bài tests hồi quy. Điều này giúp tránh nảy sinh các  
lỗi mới khi debugging.  
• Testing & debugging không nên được thực hiện bởi  
cùng 1 người (thường là không nên).  
3
Khái niệm Testing  
• Beizer: Việc thực hiện test là để chứng minh tính đúng đắn  
giữa 1 phần tử và các đặc tả của nó.  
• Myers: Là quá trình thực hiện 1 CT với mục đích tìm ra  
những lỗi.  
• IEEE: Là quá trình kiểm tra hay đánh giá 1 hệ thống hay 1  
thành phần hệ thống một cách thủ công hay tự động để  
kiểm chứng rằng nó thỏa mãn những yêu cầu đặc thù hoặc  
để xác định sự khác biệt giữa kết quả mong đợi và kết quả  
thực tế  
4
Program Verification  
• Lý tưởng: Chứng minh được rằng CT của ta là  
chính xác, đúng đắn  
• Có thể chứng minh các thuộc tính của CT?  
• Có thể CM điều đó kể cả khi CT kết thúc?!!!  
Specification  
Program  
Right/Wrong  
Checker  
program.c  
?
5
Program Testing  
• Thực dụng: Thuyết phục bản thân rằng CT có thể  
làm việc  
Specification  
Probably  
Right/Wrong  
Testing  
Strategy  
program.c  
6
External vs. Internal Testing  
• Các loại testing  
• External testing  
• Thiết kế dữ liệu để test program  
• Internal testing  
• Thiết kế program để CT tự test itself  
7
External Testing  
• External testing: TK dữ liệu để test CT  
• External testing taxonomy  
(1) Kiểm chứng giá trị biên : Boundary testing  
(2) Kiểm chứng lệnh : Statement testing  
(3) Kiểm chứng có hệ thống : Path testing  
(4) Stress testing  
8
Boundary Testing  
(1) Boundary testing  
• “Là kỹ thuật kiểm chứng sử dụng các giá trị nhập vào ở trên hoặc  
dưới một miền giới hạn của 1 đầu vào và với các giá trị đầu vào tạo  
ra các đầu ra ở biên của 1 đầu ra.”  
‒ Glossary of Computerized System and Software Development Terminology  
• Còn gọi là kiểm tra điều kiện biên-corner case testing  
• Hầu hết các lỗi đều xảy ra ở các điều kiện biên - boundary  
conditions  
• Nếu CT làm việc ở đk biên, nó sẽ làm việc đúng với các đk  
khác  
9
Boundary Testing Example  
• VD : đọc 1 dòng từ stdin và đưa vào mảng ký tự  
int i;  
char s[MAXLINE];  
for (i=0; (s[i]=getchar()) != '\n' && i < MAXLINE-1; i++)  
;
s[i] = '\0';  
printf("String: |%s|\n", s);  
• Boundary conditions  
• Dòng rỗng -Input starts with '\n'  
• In ra empty string (“\0”) => in ra “||” , ok  
• Nếu gặp EOF - End of file trước '\n‘  
• Tiếp tục gọi getchar() và lưu ӱ vào s[i]  
• Nếu gặp ngay EOF (empty file)  
• Tiếp tục gọi getchar() và lưu ӱ vào s[i]  
10  
Boundary Testing Example (cont.)  
int i;  
char s[MAXLINE];  
for (i=0; (s[i]=getchar()) != '\n' && i < MAXLINE-1; i++)  
;
s[i] = '\0';  
printf("String: |%s|\n", s);  
• Boundary conditions (tt)  
• Dòng chứa đúng MAXLINE-1 ký tự  
• In ra đúng, với ‘\0’ tại s[MAXLINE-1]  
• Dòng chứa đúng MAXLINE ký tự  
• Ký tự cuối cùng bị ghi đè, và dòng mới không bao giờ đc đọc  
• Dòng dài hơn MAXLINE ký tự  
• 1 số ký tự, kể cả newline, không đc đọc và sót lại trong stdin  
11  
Boundary Testing Example (cont.)  
• Rewrite the code  
int i;  
char s[MAXLINE];  
for (i=0; i<MAXLINE-1; i++)  
if ((s[i] = getchar()) == '\n')  
break;  
s[i] = '\0';  
• Another boundary condition: EOF  
for (i=0; i<MAXLINE-1; i++)  
if ((s[i] = getchar()) == '\n' || s[i] == EOF)  
break;  
s[i] = '\0';  
• What are other boundary conditions?  
• Nearly full  
• Exactly full  
• Over full  
This is wrong.  
Why?  
12  
Boundary Testing Example (cont.)  
• Rewrite yet again  
for (i=0; ; i++) {  
int c = getchar();  
if (c==EOF || c=='\n' || i==MAXLINE-1) {  
s[i] = '\0';  
break;  
}
else s[i] = c;  
}
• There’s still a problem...  
Output:  
FourØ  
score anØ  
sevenØ  
yearsØ  
Input:  
Four  
score and seven  
years  
Where’s  
the ‘d’?  
13  
Ambiguity in Specification  
• Nếu dòng quá dài, xử lý thế nào?  
• Giữ MAXLINE ký tự đầu, bỏ qua phần còn lại?  
• Giữ MAXLINE ký tự đầu + ‘\0’, bỏ qua phần còn lại?  
• Giữ MAXLINE ký tự đầu+’\0’, lưu phần còn lại cho lần gọi sau của  
input function?  
• Có thể phần đặc tả - specification không hề đề cập khi  
MAXLINE bị quá  
• Có thể người ta không muốn dòng dài quá giới hạn trong mọi  
trường hợp  
• Đạo đức: kiểm tra đã phát hiện ra một vấn đề thiết kế, thậm chí có  
thể là một vấn đề đặc điểm kỹ thuật !  
• Quyết định phải làm gì  
• Cắt những dòng quá dài?  
• Lưu phần còn lại để đọc như 1 dòng mới?  
14  
Vấn đề đạo đức  
• Phức tạp, các trường hợp ranh giới lộn xộn thường là triệu  
chứng của việc thiết kế tồi hay mô tả đặc điểm kỹ thuật tồi  
• Xóa bỏ đặc tả nếu bạn có thể  
• Nếu không thể sửa specification, thì hãy sửa code  
15  
Kiểm tra đk trước và đk sau  
• Xác định những thuộc tính cần đi trước ( đk trước) và sau (đk sau) mã  
nguồn đc thi hành  
• Ví dụ : các giá trị đầu vào phải thuộc 1 phạm vi cho trước  
double avg( double a[], int n) {  
int i; double sum=0.0;  
for ( i = 0; i<n; i++)  
sum+=a[i];  
return sum/n;  
}
Nếu n=0 ?, nếu n<0 ?  
Có thể thay : return n <=0 ? 0.0: sum/n;  
Tháng 11/1998, chiến hạm Yorktown bị chìm : nhập vào giá trị 0, Ct  
không kiểm tra dl nhập dẫn đến chia cho 0, và lỗi làm tầu rối loạn, hệ  
16  
thống đẩy ngưng hoạt động, tàu chìm !!!  
Statement Testing  
(2) Statement testing  
• “Testing để thỏa mãn điều kiện rằng mỗi statement trong  
1 CT phải thực hiện ít nhất trong khi testing.”  
‒ Glossary of Computerized System and Software  
Development Terminology  
17  
Statement Testing Example  
• Example pseudocode:  
if (condition1)  
statement1;  
else  
Statement testing:  
statement2;  
…
Phải chắc chắn cả lệnh “if” và  
4 lệnh lồng phải đc thực hiện  
if (condition2)  
statement3;  
else  
statement4;  
…
• Đòi hỏi 2 tập dữ liệu;vd:  
• condition1 là đúng và condition2 là đúng  
• Thực hiện statement1 và statement3  
• condition1 là sai và condition2 là sai  
• Thực hiện statement2 và statement4  
18  
Path Testing  
(3) Path testing  
• “Kiểm tra để đáp ứng các tiêu chuẩn đảm bảo rằng mỗi  
đường dẫn logic xuyên suốt chương trình được kiểm tra.  
Thường thì đường dẫn xuyên suốt chương trình này  
được nhóm thành một tập hữu hạn các lớp . Một đường  
dẫn từ mỗi lớp sau đó được kiểm tra. "  
‒ Glossary of Computerized System and Software Development Terminology  
• Khó hơn nhiều so với statement testing  
• Với các CT đơn giản, có thể liệt kê các nhánh đường dẫn xuyên  
suốt code  
• Ngược lại, bằng các đầu vào ngẫu nhiên tạo các đường dẫn theo ct  
19  
Path Testing Example  
• Example pseudocode:  
if (condition1)  
statement1;  
else  
Path testing:  
statement2;  
…
Cần đảm bảo tất cả các  
đường dẫn được thực hiện  
if (condition2)  
statement3;  
else  
statement4;  
…
• Đòi hỏi 4 tập dữ liệu:  
• condition1 là true và condition2 là true  
• condition1 là true và condition2 là false  
• condition1 là false và condition2 là true  
• condition1 là false và condition2 la false  
• Chương trình thực tế => bùng nổ các tổ hợp!!!  
20  
Tải về để xem bản đầy đủ
ppt 52 trang Thùy Anh 18740 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 6: Testing - Vũ Đức Vượng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pptbai_giang_ky_thuat_lap_trinh_chuong_6_testing_vu_duc_vuong.ppt