You are on page 1of 11

Bài tập Tuần 1

Kiểm thử và gỡ lỗi


Giới thiệu sơ lược về Kiểm thử, Gỡ lỗi
Giảng viên Thị phạm xây dựng trường hợp kiểm thử (test case) cho 1 chương trình
Thị phạm các bước gỡ lỗi cho 1 chương trình
Giao bài tập cho sinh viên
Kiểm tra bài tập của sinh viên (Gọi 1 số sinh viên lên bảng chữa bài tập)
Làm bài trắc nghiệm ở nhà
Sinh viên Thực hành các bài tập

Một số ý chính
1. Kiểm thử hộp đen là một phương pháp kiểm thử phần mềm nhằm kiểm tra chức năng của một
ứng dụng. Các trường hợp kiểm thử có thể được xây dựng dựa trên:
- Đặc tả của hàm/chức năng
- Các trường hợp biên
2. Kiểm thử hộp trắng
Kiểm thử dựa trên mã lệnh của chương trình
3 Kiểm thử đầy đủ (path-complete) nếu mọi trường hợp kiểm thử tiềm năng thông qua mã lệnh
được kiểm thử ít nhất một lần.

Danh sách bài tập


Bài 1.
Sử dụng phương pháp kiểm thử hộp đen (blackbox testing) để đưa ra các trường hợp
kiểm thử cho hàm sau. (các trường hợp kiểm thử cần kiểm tra đầy đủ các tình huống có
thể và các điều kiện biên, tránh các trường hợp kiểm thử không liên quan, không có tác
dụng).
Cho hàm trả về kích cỡ của một tập hợp các đối tượng.
def size(aSet):
""" aSet là một tập hợp các đối tượng, có thể rỗng (empty). Giả sử rằng các đối tượng là
có cùng một kiểu. """"
Đáp án tham khảo
STT Giá trị đầu vào Kết quả mong muốn Mô tả

1 aset: tập rỗng 0 Trường hợp biên


2 aset = 1 1 Trường hợp kích
cỡ =1
3 aset =5 5 Trường hợp kích
cỡ >1
Bài 2.
Sử dụng phương pháp kiểm thử hộp đen (blackbox testing) để đưa ra các trường hợp
kiểm thử cho hàm sau. (các trường hợp kiểm thử cần kiểm tra đầy đủ các tình huống có
thể và các điều kiện biên, tránh các trường hợp kiểm thử không liên quan, không có tác
dụng).
def union(set1, set2):
""" set1 và set2 là một tập hợp các đối tượng, có thể rỗng (empty). Giả sử rằng các đối
tượng là có cùng một kiểu.
Mỗi tập hợp set1, set2 không chứa các đối tượng trùng lặp trong nó. Nhưng có thể có đối
tượng trong set1 trùng lặp với đối tượng trong set2.
Hàm trả về tập hợp các đối tượng chứa tất cả các đối tượng của set1 và set2 và không
chứa các đối tượng trùng lặp.
""""
Đáp án tham khảo
STT Giá trị đầu vào Kết quả mong muốn Mô tả
1 set1 là tập rỗng, set2 là tập rỗng Tập rỗng Điều kiện biên
(set1, set2 là
tập rỗng
2 set1 là tập rỗng, set2 là tập có kích tập có kích thước =kích thước set2
thước >=1
set1 là tập có kích thước >=1, set2 là
3 tập rỗng tập có kích thước = kích thước set1
set1, set2 có kích thước >0 và không tập có kích thước= kích thước set1+ Trường hợp
chứa đối tượng chung nào kích thước set2 không chứa đối
tượng chung
4 nào
tập có kích thước = (kích thước set1+ Trường hợp
set1, set2 có kích thước >0 và chứa kích thước set2) -1 chứa đối tượng
5 một đối tượng chung. chung

Bài 3.
Sử dụng phương pháp kiểm thử hộp trắng. Xây dựng bộ kiểm thử đầy đủ cho hàm sau
(với giả sử đầu vào là các chuỗi ký tự):
def union(set1, set2):
""" set1 và set2 là một tập hợp các đối tượng, có thể rỗng
(empty). Giả sử rằng các đối tượng là có cùng một kiểu.
Mỗi tập hợp set1, set2 không chứa các đối tượng trùng lặp trong nó.
Nhưng có thể có đối tượng trong set1 trùng lặp với đối tượng trong
set2.
Hàm trả về tập hợp các đối tượng chứa tất cả các đối tượng của set1 và
set2 và không chứa các đối tượng trùng lặp. """
if len(set1) == 0:
return set2
elif set1[0] in set2:
return union(set1[1:], set2)
else:
return set1[0] + union(set1[1:], set2)
Đáp án tham khảo
STT Giá trị đầu vào Kết quả mong muốn Mô tả
Kiểm tra điều kiện
1 union('','abc'), abc len(set1)==0
Kiểm tra điều kiện
2 union('a','abc'), abc set1[0] in set2
Kiểm tra điều kiện
3 union('ab','abc'), abc set1[0] in set2
Kiểm tra điều kiện
4 union('d','abc') abcd else

Bài 4.
Sử dụng phương pháp kiểm thử hộp trắng. Xây dựng bộ kiểm thử đầy đủ cho hàm sau:

def foo(x, a):


""" x,a: một số nguyên dương"""
count = 0
while x >= a:
count += 1
x = x - a
return count
Đáp án tham khảo
STT Giá trị đầu vào Kết quả mong muốn Mô tả
1 foo(10, 3), 3 Trong vòng lặp nhiều lần
2 foo(1, 4), 0 Ngoài vòng lặp
3 foo(10, 6) 1 Trong vòng lặp 1 lần

Bài 5.
Cho hàm sau:

def rem(x, a):


""" x: số nguyên không âm; a: số nguyên dương
returns: một số nguyên, phần số dư của x/a. """
if x == a:
return 0
elif x < a:
return x
else:
rem(x-a, a)
Xây dựng bộ dữ liệu kiểm thử để tìm lỗi, và sửa lỗi cho hàm trên
Đáp án tham khảo
Chú ý: Giảng viên hướng dẫn sinh viên phương pháp tìm lỗi (sử dụng lệnh print, phương
pháp chia đôi để tìm lỗi).

def rem(x, a):


if x == a:
return 0
elif x < a:
return x
else:
return rem(x-a, a)

Bài 6.
Cho hàm sau:

def f(n):
""" n: số nguyên, n >= 0. hàm trả về n*f(n-1) """
if n == 0:
return n
else:
return n * f(n-1)
Khi gọi hàm f(3) kết quả mọng đợi là 6
Khi gọi hàm f(1) kết quả mọng đợi là 1
Khi gọi hàm f(0) kết quả mọng đợi là 0
Hãy tìm lỗi và sửa lỗi cho hàm trên.
Đáp án tham khảo
Chú ý: Giảng viên hướng dẫn sinh viên phương pháp tìm lỗi (sử dụng lệnh print, phương
pháp chia đôi để tìm lỗi).
def f(n):
if n == 0 or n==1:
return n
else:
return n * f(n-1)

Bài 7.
Viết chương trình/hàm cho biết tháng và năm (Giả định năm là số nguyên, tháng là số tự
nhiên trong khoảng 1 - 12), chương trình phải in ra số ngày của tháng đó.
Xây dựng các trường hợp kiểm thử để tìm lỗi và sửa lại chương trình cho đúng.

def checkLeapYear(year):
if year % 400 ==0:
return true
elif year % 4 == 0:
return true
else:
return false

def getNumberDay(month, year):


dayOfMonth = {
"1": 31,
"2": 28,
"3": 31,
"4": 30,
"5": 31,
"6": 30,
"7": 31,
"8": 31,
"9": 30,
"10": 31,
"11": 30,
"12": 31
}
if checkLeapYear(year):
dayOfMonth["2"] = 29
return dayOfMonth[str(month)]
print(getNumberDay(int(input("thang: ")),int(input("nam: "))))

Đáp án tham khảo


Ý tưởng bài tập:
Giáo viên đưa chương trình lời giải sai như trên (lời giải đúng: thay đoạn code: (year %
4 == 0) bằng (year % 4 == 0)and (year % 100 != 0)) nhưng sinh viên vẫn xây
dựng bộ testcase cho chương trình trên. Sau đó tìm lỗi và sửa lại chương trình cho đúng.
Phương pháp kiểm thử
- Xây dựng bộ kiểm thử đầy đủ dựa trên code
 Có 3 testcase cho checkLeapYear:
- Năm chia hết cho 400
- Năm không chia hết cho 400 nhưng chia hết cho 4
- Năm không chia hết cho 400 và không chia hết cho 4
 Có 1 testcase cho getNumberDay
 Có 12 testcase tương ứng 12 tháng (kiểm tra dữ liệu của mảng dữ liệu
dayOfMonth )
- Xây dựng bộ kiểm thử dựa trên hiểu biết về các loại năm nhuận đặc biệt. (xem xét
trường hợp năm chia hết cho 100).
Dựa trên code, có các testcase cần xây dựng
Tháng Năm Kết quả mong muốn Mô tả
Năm chia hết cho 400 (kiểm tra điều kiện
2 2000 29 year % 400 ==0).
Năm không chia hết cho 400 nhưng chia hết
2 2016 29 cho 4.
Năm không chia hết cho 400 và cũng không
2 2015 28 chia hết cho 4.

Xây dựng 12 testcase tương ứng với 12 tháng (kiểm tra dữ liệu của mảng dữ liệu
dayOfMonth).
Dựa trên hiểu biết về năm nhuận xây dựng bộ testcase sau:
Tháng Năm Kết quả mong muốn Mô tả
Năm không chia hết cho 400 nhưng chia hết
cho 4 và chia hết cho 100 (là năm không
2 1900 28 nhuận) với tháng 2.
Năm không chia hết cho 400 nhưng chia hết
cho 4 và chia hết cho 100 (là năm không
nhuận). Có thể kiểm tra với tất cả các tháng
8 1900 31 khác tháng 2.

Bài 8
Viết chương trình cho biết độ dài 3 cạnh của một tam giác (Giả định 3 cạnh của tam giác
là các số nguyên hoặc số thực lớn hơn 0) , cho biết đây có phải là một tam giác hay
không và nó là loại tam giác nào (cân, đều, vuông, bình thường).
Xây dựng các trường hợp kiểm thử để tìm lỗi và sửa lại chương trình cho đúng.
Đáp án tham khảo

def validateTriangle(a,b,c):
if (a + b) <= c or (a + c) <= b or (b + c) <= a:
return False
return True

def getTriangleName(a,b,c):
if validateTriangle(a,b,c) == False:
return "khong phai tam giac"
if a == b and b == c:
return "tam giac deu"
if a*a == b*b + c*c or b*b == a*a + c*c or c*c == a*a + b*b:
return "tam giac vuong"

if a == b or b == c or c == a:
return "tam giac can"

return "tam giac thuong"


x = float(input())
y = float(input())
z = float(input())
print(getTriangleName(x, y, z))

Số bộ testcase cần xây dựng là 11 testcase:


- 3 trường hợp không phải tam giác
- 1 trường hợp tam giác đều.
- 3 trường hợp tam giác vuông
- 3 trường hợp tam giác cân
- 1 trường hợp tam giác thường
a,b,c Kết quả mong muốn Mô tả

1,2,3 khong phai tam giac Không phải tam giác (3 điểm thẳng hàng)
4,2,1 khong phai tam giac Không phải tam giác
1,5,3 khong phai tam giac Không phải tam giác
3.4,3.4,3.4 tam giac deu Tam giác đều
5,4,3 tam giac vuong Tam giác vuông
4,5,3 tam giac vuong Tam giác vuông
3,4,5 tam giac vuong Tam giác vuông
2,2,3 tam giac can Tam giác cân
3,4,4 tam giac can Tam giác cân
5,4,5 tam giac can Tam giác cân
6,4,5 tam giac thuong Tam giác thường

Kiểm tra trường hợp vuông cân, và sửa chương trình để in ra trường hợp này:
5,5,7.071 tam giac vuong can Tam giác vuông cân
Gợi ý 1 cách sửa

def validateTriangle(a,b,c):
if (a + b) <= c or (a + c) <= b or (b + c) <= a:
return False
return True

def getTriangleName(a,b,c):
if validateTriangle(a,b,c) == False:
return "khong phai tam giac"
if a == b and b == c:
return "tam giac deu"
if (round(a*a,2) == round(b*b + c*c, 2) or round(b*b,2) ==
round(a*a + c*c,2) or round(c*c,2) == round(a*a + b*b,2)) and (a == b
or b == c or c == a) :
return "tam giac vuong can"
else:
if a*a == b*b + c*c or b*b == a*a + c*c or c*c == a*a + b*b:
return "tam giac vuong"
else:
if a == b or b == c or c == a:
return "tam giac can"

return "tam giac thuong"


x = float(input())
y = float(input())
z= float(input())
print(getTriangleName(x, y, z))

Bài 9
Viết chương trình kiểm tra một số nguyên dương có phải là số nguyên tố hay không?
Xây dựng các trường hợp kiểm thử để tìm lỗi và sửa lại chương trình cho đúng nếu phát
hiện lỗi.
Đáp án tham khảo

def checkPrime(n):
for i in range(2,n):
if n % i ==0:
return False
return True;

print(checkPrime(int(input())))

Bài 10.
Viết chương trình yêu cầu người dùng nhập vào 1 chuỗi, chương trình phải rút gọn chuỗi
theo quy tắc: nếu kí tự giống nhau viết liên tiếp thì chỉ ghi kí tự đó 1 lần và kèm theo số,
trường hợp bằng 1 thì chỉ ghi kí tự không cần ghi con số.
Ví dụ: aabbbcddab => a2b3cd2ab
Xây dựng các trường hợp kiểm thử để tìm lỗi và sửa lại chương trình cho đúng.
Đáp án tham khảo

inputString = input()
result = ""
currentCount = 1
currentKey = inputString[0]
l = len(inputString)
for i in range(1, l):
if inputString[i] == currentKey:
currentCount += 1
else:
result += currentKey
if (currentCount > 1):
result += str(currentCount)
currentKey = inputString[i]
currentCount = 1

result += str(currentKey)
print(result)

Đầu vào kết quả mong muốn Mô tả

Bài 11.
Viết chương trình chuẩn hóa tên do người dùng nhập với yêu cầu sau:
+ không có dấu cách thừa ở đầu và cuối
+ giữa các từ phân cách nhau bởi 1 dấu cách
+ viết hoa chữ cái đầu của các từ, các chữ cái còn lại viết thường
Xây dựng các trường hợp kiểm thử để tìm lỗi và sửa lại chương trình cho đúng.
Đáp án tham khảo

s = input(""Moi nhap ten: "")


def deleteSpace(s):
s1 = s.strip()
s2 = """"
for i in range(len(s1)):
if s1[i] != ' ':
s2 += s1[i]
elif s1[i-1] != ' ':
s2 += s1[i]

return s2

def upperFirstCharacter(s):
s2 = """"
for i in range(len(s)):
if i == 0 or s[i-1] == ' ':
s2 += s[i].upper()
else:
s2 += s[i]
return s2

def formatName(s):
s1 = deleteSpace(s)
s2 = s1.lower()
s3 = upperFirstCharacter(s2)
return s3
print(formatName(s))"

Đầu vào kết quả mong muốn Mô tả

Bài 12.
Viết chương trình giải phương trình bậc hai: a*x^2 +b*x +c = 0
Xây dựng các trường hợp kiểm thử để tìm lỗi và sửa lại chương trình cho đúng.
Đáp án tham khảo

import math
a = float(input("moi nhap he so a: "))
b = float(input("moi nhap he so b: "))
c = float(input("moi nhap he so c: "))

delta = b*b - 4*a*c


if delta < 0:
print("phuong trinh vo nghiem")
elif delta == 0:
print("phuong trinh co 1 nghiem x = ", -b/2*a)
else:
x1 = (-b + math.sqrt(delta))/(2*a)
x2 = (-b - math.sqrt(delta))/(2*a)
print("phuong trinh co nghiem x1 = ", x1)
print("phuong trinh co nghiem x2 = ", x2)

Đáp án tham khảo


Đầu vào kết quả mong muốn Mục đích

You might also like