Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 5

BÀI TẬP NHÓM 2

MÔN KIỂM CHỨNG PHẦN MỀM

Bài tập 2: Dùng kỹ thuật phân tích lớp tương đương. Hãy phân tích và sinh ra bộ
testcase cho bài toán PreviousDate (tìm ngày trước đó từ ngày nhập vào).

I/ NỘI DUNG LÝ THUYẾT:


1.1.Kỹ thuật kiểm thử hộp đen (Black box testing):
 Kiểm thử theo góc nhìn sử dụng:
- Không cần kiến thức về chi tiết thiết kế và thực hiện (source code) bên
trong.
- Là chiến lược kiểm thử dựa vào thông tin duy nhất là các đặc tả về yêu cầu
chức năng cảu thành phần phần mềm (TPPM) tương ứng.
- Đây là chiến lược kiểm thử theo góc nhìn từ ngoài vào, các người tham gia
kiểm thử hộp đep không cần có kiến thức nào về thông tin thực hiện TPPM
cần kiểm thử (mã nguồn, thuật giải được dùng,…).
- Việc kiểm thử được tiến hành dựa vào việc kiểm thử TPPM làm được gì, có
phù hợp với yêu cầu của người dùng hay không. Các tester nhập số liệu vào
phần mềm và chỉ cần xem kết quả của phần mềm và các mục tiêu kiểm tra.
- Đối tượng được kiểm thử là 1 thành phần phần mềm: có thể là 1 hàm chức
năng, 1 module chức năng, 1 phân hệ chức năng…
- Nhìn chung, chiến lược kiểm thử hộp đen thích hợp cho mọi cấp độ kiểm
thử từ kiểm thử đơn vị, kiểm thử tích hợp, kiểm thử hệ thống, kiểm thử độ
chấp nhận của người dùng.
1.2.Quy trình kiểm thử hộp đen
 Quy trình kiểm thử hộp đen tổng quát gồm các bước chính
- Phân tích đặc tả về các yêu cầu chức năng mà TPPM cần thực hiện.
- Dùng 1 kỹ thuật phân tích, thiết kế các testcase để định nghĩa các testcase.
Định nghĩa mỗi testcase là xác định 3 thông tin sau:
o Giá trị dữ liệu nhập để TPPM xử lý(hợp lệ hoặc không hợp lệ).
o Trạng thái của TPPM cần có để thực hiện testcase
o Giá trị dữ liệu xuất mà TPPM phải tạo được.
- Kiểm thử các testcase đã định nghĩa trước.
- So sánh kết quả thu được với kết quả kỳ vọng trong từng testcase, từ đó lập
báo cáo về kết quả kiểm thử.
1.3.Kỹ thuật phân tích lớp đương đương
 Vì chiến lược kiểm thử hộp đen thích hợp cho mọi mức độ kiểm thử nên nhiều
nghiên cứu đã tìm hiểu và đưa ra nhiều kỹ thuật kiểm thử khác nhau, một số kỹ
thuật được dùng phổ biến nhất đó là:
- Kỹ thuật phân tích lớp tương đương
- Kỹ thuật phân tích các giá trị biên
- Kỹ thuật dùng các bảng quyết định
- Kỹ thuật dùng bảng chuyển trạng thái
 Và kỹ thuật phân tích lớp tương đương được nhóm tìm hiểu và trình bày để
kiểm thử bài toán PreviousDate (tìm ngày trước đó từ ngày nhập vào).
 Ý tưởng của kỹ thuật: là cố gắng phân các phân các testcase ra thành nhiều
nhóm khác nhau: các testcase trong mỗi nhóm sẽ kích hoạt TPPM thực hiện
cùng 1 hành vi.
- Mỗi nhóm testcase thỏa mãn tiêu chuẩn trên được gọi là một lớp đương
đương, ta chỉ cần xác định 1 testcase đại diện cho nhóm và dùng testcase
này để kiểm thử TPPM.
- Như vậy, đã giảm rất nhiều testcase cần định nghĩa (thiết kế) và kiểm thử,
nhưng chất lượng kiểm thử không bị giảm sút bao nhiêu so với vét cạn.
 Ý tưởng này là dựa vào kỳ vọng rất hợp lý sau đây:
- Nếu 1 testcase trong lớp tương đương nào đó gây lỗi TPPM thì các testcase
trong lớp này cũng sẽ gây lỗi như vậy.
- Nếu 1 testcase trong lớp tương đương nào đó không gây lỗi TPPM thì các
testcase trong lớp này cũng sẽ không gây lỗi.
II/ BÀI TOÁN PREVIOUSDATE
2.1.Mô tả bài toán
Cho trước một ngày bất kỳ. Viết hàm cho chương trình để tìm ra ngày hôm
trước của ngày cho trước.
2.2. Phân tích bài toán
 Đầu vào: một ngày bất kỳ được biểu diễn dưới dạng ngày, tháng, năm.
 Đầu ra: Ngày hôm trước của ngày đã cho, cũng được biểu diễn dưới dạng ngày
tháng năm.
 Thuật toán:
o Kiểm tra ngày hợp lệ: Đảm bảo rằng ngày được nhập là hợp lệ, bao gồm:
 Năm phải lớn hơn 0.
 Tháng phải nằm trong khoảng tử 1 đến 12.
 Ngày phải nằm trong khoảng hợp lệ của tháng đã cho.
o Tính toán ngày hôm trước:
 Trường hợp đơn giản: nếu ngày hiện tại là ngày 1 của tháng, ngày
hôm trước sẽ là ngày cuối cùng của tháng trước.
 Tháng trước được xác định bằng cách trừ 1 khỏi tháng hiện
tại.
 Nếu tháng trước là tháng 1, năm cũng được giảm 1.
 Trường hợp chung: Ngày hôm trước được tính bằng cách trừ 1
khỏi ngày hiện tại.
o Lưu ý:
 Cần xử lý trường hợp ngày 29 tháng 2 trong năm nhuận.
2.3.Sinh ra bộ testcase
Bảng bộ testcase bài toán previousdate
ID INPUT OUTPUT
Testcase 1 1/3/2024 29/2/2024
Testcase 2 30/2/2024 Ngày không hợp lệ
Testcase 3 1/1/2024 31/12/2023
Testcase 4 1/2/2024 31/1/2024
Testcase 5 32/8/2024 Ngày không hợp lệ
Testcase 6 29/2/2023 Ngày không hợp lệ

2.4.Mã lệnh thực hiện


 Mã lệnh chương trình sử dụng ngôn ngữ lập trình C++
#include <iostream>
#include <fstream>
using namespace std;

// Hàm kiểm tra xem một năm có phải là năm nhuận hay không
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// Hàm kiểm tra tính hợp lệ của ngày


bool isValidDate(int day, int month, int year) {
if (year < 1 || month < 1 || month > 12 || day < 1) {
return false;
}

int daysInMonth;
switch (month) {
case 4: case 6: case 9: case 11:
daysInMonth = 30;
break;
case 2:
daysInMonth = isLeapYear(year) ? 29 : 28;
break;
default:
daysInMonth = 31;
}

if (day > daysInMonth) {


return false;
}

return true;
}

// Hàm để lấy ngày trước đó


void getPrevDate(int* day, int* month, int* year)
{
// Nếu là ngày đầu tiên của tháng
if (*day == 1) {
// Các tháng có 30 ngày trong tháng trước đó
if (*month == 4 || *month == 6 || *month == 9 || *month == 11) {
*day = 31;
*month = *month - 1;
}
// Đối với tháng Ba, xác định ngày cuối cùng của tháng Hai
else if (*month == 3) {
if (isLeapYear(*year)) // Kiểm tra năm nhuận
*day = 29;
else
*day = 28;
*month = *month - 1;
}
// Đối với tháng Một, xác định ngày cuối cùng của tháng Mười Hai
else if (*month == 1) {
*day = 31;
*month = 12;
*year = *year - 1;
}
// Đối với tháng Hai, xác định ngày cuối cùng của tháng Một
else if (*month == 2) {
*day = 31;
*month = *month - 1;
}
// Đối với các tháng khác
else {
*day = 30;
*month = *month - 1;
}
}
// Các ngày khác trong tháng
else {
*day = *day - 1;
}
}

int main()
{
ifstream infile("dates.txt"); // Mở tệp tin dates.txt để đọc
if (!infile) {
cout << "Không thể mở tệp tin." << endl;
return 1;
}

int dd, mm, yy;


while (infile >> dd >> mm >> yy) {
// Kiểm tra tính hợp lệ của ngày
if (!isValidDate(dd, mm, yy)) {
cout << "Ngày không hợp lệ: " << dd << "/" << mm << "/" << yy << endl;
continue;
}

// In ngày đã cho
cout << "Ngày: " << dd << "/" << mm << "/" << yy;

// Gọi hàm để lấy ngày trước đó


getPrevDate(&dd, &mm, &yy);

// In ngày trước đó
cout << " => Ngày trước đó: " << dd << "/" << mm << "/" << yy << endl;
}

infile.close(); // Đóng tệp tin


return 0;
}

You might also like