Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.97 MB, 89 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>---****--- </b>
<b> </b>
<b><small>2.2.Mục tiêu và nguyên tắc khi kiểm thử tự động ... 9 </small></b>
<b><small>2.3.Kiến trúc của một bộ kiểm thử tự động ... 9 </small></b>
<b><small>2.4.Ưu, nhược điểm khi sử dụng kiểm thử tự động ... 10 </small></b>
<b><small>B. THỰC HÀNH KIỂM THỬ ... 12 </small></b>
<b><small>I.PHÁT BIỂU BÀI TỐN ... 12 </small></b>
<b><small>1.1.Mơ tả bài tốn ... 12 </small></b>
<b><small>1.2.Yêu cầu chức năng và phi chức năng ... 13 </small></b>
<b><small>1.3.Bảng giá trị ... 14 </small></b>
<b><small>1.4.Bảng cơ sở dữ liệu ... 14 </small></b>
<b><small>1.5.Ca sử dụng ... 15 </small></b>
<b><small>1.6.Cấu trúc kiểm thử ... 16 </small></b>
<b><small>1.7. Giá trị đầu vào, giá trị đầu ra với các chức năng kiểm thử ... 17 </small></b>
<b><small>II.CODE CHƯƠNG TRÌNH ... 18 </small></b>
<b><small>III.KẾ HOẠCH KIỂM THỬ ... 31 </small></b>
<b><small>3.1.Mục tiêu kiểm thử</small></b><small> ... 31 </small>
<b><small>3.2.Chiến lược kiểm thử ... 31 </small></b>
<b><small>3.3.Tiêu chí đảm bảo đầu ra ... 31 </small></b>
<b><small>3.4.Quy trình thực hiện... 31 </small></b>
<b><small>3.5.Lịch trình thực hiện ... 31 </small></b>
<b><small>3.6.Hoạch định nguồn nhân lực ... 31 </small></b>
<b><small>3.7.Phân công công việc ... 32 </small></b>
<b><small>3.8.Các tài liệu báo cáo kiểm thử ... 33 </small></b>
<b><small>IV.THIẾT KẾ CA KIỂM THỬ ... 33 </small></b>
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3"><b><small>4.1. Thiết kế kiểm thử dựa trên mô tả ca sử dụng ... 34 </small></b>
<b><small>4.2. Thiết kế kiểm thử hộp đen ... 38 </small></b>
<b><small>4.2.1. Thiết kế kiểm thử lớp biên (chức năng Nhập điểm sinh viên) ... 38 </small></b>
<b><small>4.2.2. Thiết kế kiểm thử phân hoạch tương đương (chức năng Nhập điểm sinh viên) ... 45 </small></b>
<b><small>4.2.3. Thiết kế kiểm thử bảng quyết định (Chức năng tạo hồ sơ sinh viên) ... 48 </small></b>
<b><small>4.3. Thiết kế kiểm thử hộp trắng ... 50 </small></b>
<b><small>4.3.1. Kiểm thử với dòng điều khiển (Chức năng xóa điểm sinh viên) ... 50 </small></b>
<b><small>4.3.2. Thiết kế kiểm thử dòng dữ liệu ... 53 </small></b>
<b><small>V. CHUẨN BỊ KIỂM THỬ</small></b><small> ... 59 </small>
<b><small>5.1. Môi trường kiểm thử ... 59 </small></b>
<b><small>5.2. Dữ liệu kiểm thử ... 60 </small></b>
<b><small>VI. THỰC HIỆN CA KIỂM THỬ ... 60 </small></b>
<b><small>6.1. Thực hiện kiểm thử dựa trên tài liệu đặc tả ... 60 </small></b>
<b><small>6.2. Thực hiện kiểm thử hộp đen ... 62 </small></b>
<b><small>6.2.1. Thực hiện kiểm thử giá trị biên ... 62 </small></b>
<b><small>6.2.2. Thực hiện kiểm thử phân hoạch lớp tương đương ... 68 </small></b>
<b><small>6.2.3. Thực hiện kiểm thử bảng quyết định (chức năng tạo hồ sơ sinh viên)... 70 </small></b>
<b><small>6.3. Thực hiện kiểm thử hộp trắng ... 70 </small></b>
<b><small>6.3.1. Thực hiện kiểm thử dòng điều khiển ... 70 </small></b>
<b><small>6.3.2. Thực hiện kiểm thử dòng dữ liệu ... 72 </small></b>
<b><small>VII. ĐÁNH GIÁ ... 78 </small></b>
<b><small>7.1. Số lượng ca kiểm thử được xây dựng theo mỗi kỹ thuật ... 78 </small></b>
<b><small>7.2. Số ca kiểm có thể phát hiện ra lỗi ... 79 </small></b>
<b><small>7.3. Các ca kiểm thử không phát hiện ra lỗi ... 79 </small></b>
<b><small>7.4. Số ca kiểm thử trùng lặp ... 79 </small></b>
<b><small>VIII. KIỂM THỬ TỰ ĐỘNG BẰNG CÔNG CỤ GOOGLE TEST</small></b><small> ... 79 </small>
<b><small>8.1. Tổng quan về Google Test ... 79 </small></b>
<b><small>8.2. Kiểm thử tự động chức năng nhập mã sinh viên ... 82 </small></b>
<b><small>KẾT LUẬN ... 89 </small></b>
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4"><b>BẢNG PHÂN CÔNG NHIỆM VỤ VÀ ĐÁNH GIÁ </b>
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5"><b>LỜI MỞ ĐẦU </b>
Ngày nay, công nghệ ngày càng phát triển nhanh chóng, đã kéo theo hệ thống mạng và các phần mềm gia tăng về số lượng theo quy mô rộng và cả chất lượng của phần mềm theo chiều sâu. Từ đó đã làm nảy sinh ra nhiều vấn đề về lỗi hỏng hóc phần mềm khơng đáng có, gây ra những ảnh hưởng nghiêm trọng đến những mặt khác. Những lỗi này có thể do chính bản thân phần mềm bị hỏng hóc hoặc cũng có thể là do con người cố tình gây nên. Vấn đề nan giải và đầy tính cấp thiết ấy đang ngày càng có xu hướng mở rộng và càng khó giải quyết.
Vì vậy, u cầu đặt ra là cần có cơng tác kiểm thử phần mềm để có thể ngăn chặn và phòng ngừa các lỗi xuất hiện ở trong phần mềm. Tuy nhiên, số lượng phần mềm ngày càng lớn gây khó khăn khơng nhỏ đến hoạt động kiểm thử khi thực hiện kiểm thử thủ cơng. Từ đó đã xuất hiện các cơng cụ kiểm thử tự động nhằm hỗ trợ cho hoạt động kiểm thử, giúp giảm thời gian, giảm tài nguyên, tăng độ chính xác và sự đảm bảo.
<b>Đó là lý do nhóm chọn đề tài “Xây dựng và kiểm thử chức năng Quản lý điểm sinh viên và kiểm thử tự động bằng công cụ Google Test”. </b>
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6"><b>A. CƠ SỞ LÝ THUYẾT I. KIỂM THỬ PHẦN MỀM </b>
<b>1.1. Khái niệm </b>
- Kiểm thử là quy trình kiểm chứng để đánh giá và tăng cường chất lượng của sản phẩm phần mềm, nhằm phát hiện lỗi hoặc bất cứ vấn đề gì về sản phẩm. Kiểm thử phần mềm (software testing) là một hoạt động kiểm tra, đánh giá chất lượng của phần mềm.
- Kiểm thử phần mềm đóng vai trị rất quan trọng:
tính sống cịn trong các dự án sản xuất phần mềm. Vì vậy nó đã trở thành quy trình bắt buộc trong các dự án phần mềm hiện nay.
trình tạo ra sản phẩm.
<b>1.2. Quy trình kiểm thử phần mềm </b>
<i>1.2.1. Phân tích yêu cầu </i>
- Đầu vào: tài liệu đặc tả yêu cầu, tài liệu thiết kế hệ thống, tài liệu khách hàng, bản prototype của khách hàng yêu cầu (nếu có),...
- Hoạt động: Đọc hiểu, nghiên cứu phân tích các u cầu có trong các bản tài liệu. Đưa ra các câu hỏi còn thắc mắc về yêu cầu phần mềm với BA, team, leader, khách hàng để hiểu rõ hơn về yêu cầu sản phẩm
- Đầu ra: tài liệu chứa các câu hỏi và câu trả lời liên quan đến nghiệp vụ của hệ thống, tài liệu báo cáo tính khả thi, phân tích rủi ro của việc kiểm thử phần mềm.
<i>1.2.2. Lập kế hoạch kiểm thử </i>
- Đầu vào: các tài liệu đặc tả đã được cập nhật thông qua các câu hỏi và trả lời được đưa ra trong giai đoạn phân tích yêu cầu.
- Hoạt động:
cần thực hiện trước, sau, ai là người thực hiện.
- Đầu ra: các tài liệu như test plan, test estimation, test schedule.
<i>1.2.3. Thiết kế kịch bản kiểm thử </i>
- Đầu vào: test plan, test estimation, test schedule, các tài liệu đặc tả đã được cập nhật.
- Hoạt động:
Viết test case/checklist.
Chuẩn bị dữ liệu kiểm thử: test data, test script.
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7"> Review test case/checklist: tránh rủi ro trong thiết kế test case - Đầu ra: test design, test case, check list, test data, test automation script.
<i>1.2.4. Thiết lập môi trường kiểm thử </i>
- Đầu vào: test plan, smoke test case, test data.
- Hoạt động: Thực thi các smoke test case để kiểm tra môi trường kiểm thử đã sẵn sàng cho việc test chưa
- Đầu ra: môi trường đã được cài đặt đúng theo yêu cầu, sẵn sàng cho việc kiểm thử và kết quả của smoke test case.
<i>1.2.5. Thực hiện kiểm thử </i>
- Đầu vào: test plan, test design, test case, check list, test data, test automation script.
- Hoạt động:
và theo dõi trạng thái của lỗi đến khi được sửa thành công.
- Đầu ra: test results (kết quả kiểm thử), defect reports (danh sách các lỗi tìm được).
<i>1.2.6. Đóng chu trình kiểm thử </i>
- Đầu vào: tất cả những tài liệu liên quan đã được tổng hợp, ghi chép và hoàn thiện đầy đủ trong suốt quy trình kiểm thử của dự án
- Hoạt động: Tổng kết báo cáo kết quả về việc thực thi test, chức năng nào hoàn thành/ chức năng chưa hồn thành, lỗi cịn nhiều ở chức năng nào, dev nào cịn nhiều lỗi, lỗi có nghiêm trọng hay không...
- Đầu ra: các tài liệu Test report, Test results (final)
<b>1.3. Các cấp độ kiểm thử </b>
Có 4 cấp độ kiểm thử phần mềm là:
<i>- Kiểm thử đơn vị (Unit Testing) là cấp độ kiểm thử cơ bản, thực hiện test từng </i>
module nhỏ trong hệ thống. Kiểm thử đơn vị có thể được thực hiện tách biệt với phần còn lại của hệ thống tùy thuộc vào mơ hình vịng đời phát triển được chọn cho ứng dụng cụ thể đó.
<i>- Kiểm thử tích hợp (Integration Testing) có nghĩa là kiểm thử kết hợp. Một dự án </i>
phần mềm được kết hợp bởi nhiều module riêng lẻ khác nhau và được code bởi nhiều lập trình viên khác nhau. Chính vì thế kiểm thử tích hợp là tích hợp kiểm tra các module riêng lẻ với nhau thành một nhóm
<i>- Kiểm thử hệ thống (System Testing) là thực hiện kiểm thử một hệ thống đã được </i>
tích hợp hồn chỉnh để xác minh rằng nó đúng yêu cầu của phần mềm. Kiểm thử hệ thống nằm trong phạm vi kiểm thử hộp đen và do đó, khơng u cầu kiến thức về thiết kế bên trong của mã hoặc logic.
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8"><i>- Kiểm thử chấp nhận (Acceptance Testing): Sau khi kiểm tra hệ thống đã sửa tất </i>
cả hoặc hầu hết các lỗi, hệ thống sẽ được gửi đến người dùng hoặc khách hàng để kiểm tra chấp nhận. Về cơ bản kiểm thử chấp nhận cũng khá giống kiểm thử hệ thống nhưng được thực hiện bởi khách hàng
<b>1.4. Các kỹ thuật kiểm thử phần mềm </b>
<i>- Kiểm thử hộp đen: là một phương pháp kiểm thử phần mềm được thực hiện mà </i>
không biết được cấu tạo bên trong của phần mềm, là cách mà các tester kiểm tra xem hệ thống như một chiếc hộp đen, khơng có cách nào nhìn thấy bên trong của cái hộp.
Đối tượng kiểm thử có thể là 1 hàm chức năng, 1 module chức năng, 1 phân hệ chức năng...
<i>- Kiểm thử hộp trắng: là một phương pháp kiểm thử phần mềm trong đó tester biết </i>
về cấu trúc nội bộ / thiết kế. Người kiểm tra chọn đầu vào để thực hiện các đường dẫn thông qua mã và xác định đầu ra thích hợp. Kiến thức lập trình và kiến thức thực hiện là rất cần thiết trong kiểm thử hộp trắng.
Đố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…
<i>- Kiểm thử hộp xám: là phương pháp kiểm thử phần mềm kết hợp giữa kiểm thử </i>
hộp đen và kiểm thử hộp trắng. Hộp xám trong kiểm thử phần mềm giống như bán trong suốt, nhìn vào sẽ thấy lớp vỏ bên ngoài và một phần cấu trúc bên trong. Đối tượng kiểm thử: Cấu trúc mã, cách sử dụng ứng dụng, kiểm thử tích hợp
<b>1.5. Kỹ thuật thiết kế ca kiểm thử </b>
<i>- Kiểm thử tĩnh: Kiểm thử tĩnh là một kỹ thuật kiểm thử phần mềm để tìm kiếm </i>
lỗi trong code, thuật tốn, tài liệu u cầu và tài liệu thiết kế mà không cần thực thi code. Kiểm thử tĩnh được ứng dụng ở giai đoạn đầu của quá trình phát triển phần mềm, giúp tránh lỗi sớm, dễ dàng xác định và giải quyết lỗi. Kiểm thử tĩnh cũng có thể rút kinh nghiệm từ các lỗi tìm được và cải tiến quy trình
<i>- Kiểm thử động: Kiểm thử động là một phương pháp kiểm thử phần mềm được </i>
sử dụng để kiểm tra hành vi động của mã phần mềm. Mục đích chính của kiểm thử động là kiểm tra hành vi của phần mềm với các biến động hoặc các biến không phải là hằng số và tìm ra các khu vực yếu trong mơi trường thời gian chạy phần mềm. Kiểm thử động là một trong các loại kiểm thử phần mềm, bao gồm cả kiểm thử tự động.
<b>2.1. Khái niệm </b>
Kiểm thử tự động là quá trình sử dụng các công cụ và phần mềm để thực hiện các bước kiểm thử một cách tự động, thay vì thủ công bởi con người. Các công cụ và kịch bản được thiết kế để tự động hóa việc thực hiện các bước kiểm thử, đánh giá kết quả và báo cáo kết quả kiểm thử.
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9"><b>2.2. Mục tiêu và nguyên tắc khi kiểm thử tự động Mục tiêu: </b>
<i>Tăng tốc độ thực hiện kiểm thử: Kiểm thử tự động thực hiện các trường hợp kiểm </i>
thử bằng mã, giúp thực hiện kiểm thử nhanh hơn nhiều so với kiểm thử thủ công. Tiết kiệm thời gian và công sức cho các nhà kiểm thử, cho phép họ tập trung vào các nhiệm vụ quan trọng hơn như phân tích kết quả và thiết kế trường hợp kiểm thử mới.
<i>Tăng tính nhất quán: Các kịch bản kiểm thử tự động đảm bảo rằng các bước kiểm </i>
thử được thực hiện một cách chính xác và nhất quán mỗi lần. Loại bỏ sự sai sót do con người, dẫn đến kết quả kiểm thử đáng tin cậy hơn.
<i>Tăng độ chính xác: Cơng cụ kiểm thử tự động có khả năng so sánh kết quả thực tế </i>
với kết quả mong đợi một cách chính xác. Phát hiện lỗi sớm và chính xác hơn so với kiểm thử thủ cơng.
<b> Ngun tắc: </b>
<i>Tự động hóa mọi thứ có thể: Tự động hóa tất cả các cơng đoạn kiểm thử có thể, từ </i>
việc khởi chạy ứng dụng đến nhập dữ liệu và so sánh kết quả. Giảm thiểu sự can thiệp của con người, giúp tăng tốc độ và hiệu quả của quá trình kiểm thử.
<i>Lặp lại: Chạy các kịch bản kiểm thử tự động nhiều lần để đảm bảo tính ổn định và </i>
độ tin cậy của ứng dụng. Phát hiện các lỗi tiềm ẩn có thể xảy ra sau nhiều lần sử dụng.
<i>Sử dụng mã nguồn mở: Sử dụng các công cụ và framework kiểm thử tự động mã </i>
nguồn mở để giảm chi phí và tận dụng sự đóng góp của cộng đồng. Tiếp cận nhiều lựa chọn công cụ đa dạng và phù hợp với nhu cầu cụ thể.
Kiểm thử tự động mang lại nhiều lợi ích cho quá trình phát triển phần mềm. Việc áp dụng các mục tiêu và nguyên tắc trên sẽ giúp tối ưu hóa hiệu quả của kiểm thử tự động, góp phần nâng cao chất lượng phần mềm.
<b>2.3. Kiến trúc của một bộ kiểm thử tự động </b>
Tự động hóa kiểm thử phần mềm bao gồm một chuỗi các quá trình, các hoạt động, thao tác được quy tụ với nhau để thực hiện phần mềm cần kiểm thử và ghi lại kết quả kiểm thử.
Phần lớn các kiến trúc kiểm thử thường là những hệ thống mở bởi yêu cầu kiểm thử là một tổ chức xác định.
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">Hình 1: Kiến trúc kiểm thử
Trong đó, các cơng cụ được dùng để tự động hóa quy trình kiểm thử trong mơ hình kiểm thử thực hiện các chức năng:
<b>- Test Manager: quản lý việc thực hiện các kiểm thử của chương trình, theo dõi </b>
dữ liệu kiểm thử, kết quả mong đợi và các chức năng, tiện ích của chương trình được kiểm thử.
<b>- Test data generator: sinh dữ liệu kiểm thử cho chương trình </b>
<b>- Oracle: tạo các phán đốn của kết quả mong đợi. Nó có thể là các phiên bản </b>
chương trình trước đó hoặc các hệ thống prototype. Chú ý, ở đây không phải là cơ sở dư liệu Oracle
<b>- File comparator: Đối chiếu kết quả kiểm thử chương trình với kết quả kiểm thử </b>
trước đó và ghi lại sự khác nhau vào tài liệu
<b>- Report generator: cung cấp các mẫu báo cáo và các tiện ích cho kết quả kiểm </b>
thử
<b>- Dynamic analyzer: thêm mã cho chương trình để tính lượng thời gian mỗi lệnh </b>
được thực hiện.
<b>- Simulator: mô phỏng môi trường kiểm thử cho sản phẩm phần mềm. 2.4. Ưu, nhược điểm khi sử dụng kiểm thử tự động </b>
<i>2.4.1. Ưu điểm: </i>
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">- Tăng hiệu suất và tiết kiệm thời gian: Kiểm thử tự động thực hiện các trường hợp kiểm thử tự động, giúp tiết kiệm thời gian và công sức so với kiểm thử thủ công. Tăng tốc độ phát triển và đưa sản phẩm ra thị trường nhanh hơn.
- Tính nhất quán: Các kịch bản kiểm thử tự động đảm bảo các bước kiểm thử được thực hiện chính xác và nhất quán mỗi lần. Nâng cao độ tin cậy của quá trình kiểm thử.
- Tăng độ chính xác: Cơng cụ kiểm thử tự động so sánh kết quả thực tế với kết quả mong đợi một cách chính xác. Phát hiện lỗi sớm và chính xác hơn so với kiểm thử thủ cơng.
- Lợi ích khác: Khả năng chạy thử nghiệm song song trên nhiều thiết bị. Dễ dàng theo dõi và quản lý quá trình kiểm thử. Tạo báo cáo chi tiết về kết quả kiểm thử.
<i>2.4.2. Nhược điểm: </i>
- Đòi hỏi kiến thức kỹ thuật cao: Cần có kiến thức về lập trình và cơng cụ kiểm thử tự động để viết kịch bản hiệu quả. u cầu đội ngũ nhân viên có trình độ chun mơn cao.
- Chi phí ban đầu cao: Đầu tư ban đầu cho việc mua công cụ, đào tạo nhân viên và xây dựng hệ thống kiểm thử tự động có thể tốn kém. Phù hợp với các dự án lớn và dài hạn.
- Khơng thể thay thế hồn tồn kiểm thử thủ cơng: Kiểm thử tự động gặp khó khăn trong việc phát hiện các lỗi giao diện, trải nghiệm người dùng và các vấn đề về hiệu suất. Vẫn cần sự can thiệp của con người để kiểm tra các yếu tố này. - Nhược điểm khác: Khó khăn trong việc bảo trì và cập nhật kịch bản kiểm thử
khi phần mềm thay đổi. Có thể bỏ sót một số lỗi do giới hạn của công cụ và kịch bản kiểm thử.
Kiểm thử tự động là một công cụ mạnh mẽ giúp nâng cao hiệu quả và chất lượng của quá trình phát triển phần mềm. Tuy nhiên, cần cân nhắc kỹ lưỡng các ưu và nhược điểm trước khi áp dụng để đảm bảo phù hợp với mục tiêu và ngân sách của dự án.
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12"><b>B. THỰC HÀNH KIỂM THỬ I. PHÁT BIỂU BÀI TOÁN </b>
<b>1.1. Mơ tả bài tốn </b>
Hệ thống quản lý điểm của sinh viên gồm có hai chức năng chính, bao gồm quản lý hồ sơ sinh viên và quản lý điểm sinh viên.
<b> Quản lý hồ sơ sinh viên: </b>
<i>- Chức năng tạo hồ sơ sinh viên </i>
<i>- Chức năng cập nhật hồ sơ sinh viên </i>
Trong quá trình nhập thơng tin, nếu có thơng tin sai sót hoặc nhầm lẫn dựa trên sự phản ánh của sinh viên, cán bộ quản lý sinh viên cần tiến hành cập nhật lại các thông tin trong hồ sơ sinh viên trên hệ thống. Ngồi ra cịn trong trường hợp sau này, có một số thơng tin của sinh viên thay đổi (ví dụ như số điện thoại, địa chỉ thường trú…) thì cán bộ quản lý sinh viên cũng cần cập nhật lại hồ sơ.
<i>- Chức năng xóa hồ sơ sinh viên </i>
Khi sinh viên đã tốt nghiệp ra trường hoặc khơng cịn theo học tại trường, cán bộ quản lý sinh viên tiến hành xóa bỏ hồ sơ sinh viên trên hệ thống để đảm bảo về vấn đề bảo mật thông tin cho sinh viên.
<i>- Chức năng báo cáo và thống kê hồ sơ sinh viên </i>
Cán bộ quản lý sinh viên thực hiện việc báo cáo và thống kê về hồ sơ sinh viên theo yêu cầu, mục đích của ban giám hiệu và các phịng ban.
<b> Quản lý điểm sinh viên: </b>
<i>- Chức năng nhập điểm cho sinh viên </i>
Cuối mỗi học kỳ giảng viên sẽ tổng kết điểm học phần mà mình phụ trách theo từng lớp và gửi bảng điểm cho phòng đào tạo. Cán bộ quản lý điểm của phịng đào tạo có nhiệm vụ nhận bảng điểm của giảng viên, đăng nhập vào hệ thống với tài khoản và password của mình để nhập điểm sau mỗi kỳ thi cho sinh viên.
<i>- Chức năng cập nhật điểm cho sinh viên </i>
Trong q trình xử lý điểm, nếu phát hiện sai sót, hoặc có sự phản hồi, khiếu nại từ giảng viên hoặc sinh viên, thì thơng qua hệ thống, cán bộ quản lý điểm sẽ sử dụng chức năng sửa điểm để cập nhật lại điểm số cho sinh viên.
<i>- Chức năng xóa điểm cho sinh viên </i>
Khi hệ thống gặp lỗi không thể nhập điểm hoặc không thể cập nhật lại điểm, cán bộ quản lý điểm sẽ phải tiến hành xóa điểm.
<i>- Chức năng báo cáo và thống kê điểm cho sinh viên </i>
Thông qua hệ thống, cán bộ quản lý điểm thực hiện việc báo cáo và thống kê theo yêu cầu của nhà trường. Có thể bao gồm như báo cáo điểm trung bình của sinh viên theo lớp, khoa; báo cáo tiến độ học tập của mỗi sinh viên; thống kê số sinh viên đạt điểm cao theo từng lớp, ngành…
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13"><b>1.2. Yêu cầu chức năng và phi chức năng</b>
<i> Yêu cầu chức năng </i>
- Quản lý hồ sơ sinh viên cho phép cán bộ quản lý sinh viên thực hiện các chức năng:
Tạo mới hồ sơ sinh viên khi có tân sinh viên nhập học.
Tiến hành cập nhật lại hồ sơ sinh viên khi có sự thiếu sót hoặc nhầm lẫn về thơng tin trong hồ sơ.
Xóa bỏ hồ sơ sinh viên khi sinh viên thôi học hoặc đã tốt nghiệp.
Tạo các báo cáo thống kê về hồ sơ sinh viên theo yêu cầu, mục đích của ban giám hiệu và các phòng ban.
- Quản lý điểm sinh viên cho phép cán bộ quản lý điểm thực hiện các chức năng: Nhập điểm của sinh viên sau mỗi đợt thi cuối kì.
Cập nhật lại điểm khi có sự sai sót hoặc nhầm lẫn. Tiến hành xóa điểm khi gặp phải sự cố từ hệ thống.
Thực hiện việc báo cáo và thống kê theo yêu cầu của nhà trường.
<i> Yêu cầu phi chức năng </i>
- Yêu cầu về hoạt động
Cấu hình tối thiểu: Hệ thống chạy với vi xử lý Core 2 Duo (Hoặc tương đương) và RAM yêu cầu 2GB trở lên.
Tính linh động: Hệ thống chạy được trên nhiều hệ điều hành khác nhau như Windows, MacOS và Linux.
Vấn đề bảo trì và nâng cấp: Mỗi lần bảo trì và nâng cấp hệ thống định kỳ sẽ không kéo dài quá 1h, không bảo trì trong giờ hành chính. Khi cài đặt, có nhân viên được đào tạo kỹ thuật hỗ trợ phòng khi hệ thống có lỗi. - Yêu cầu về hiệu năng
Tốc độ: Tối đa 3s/ thao tác.
Phạm vi, giới hạn: Lưu trữ được từ 10.000 hồ sơ sinh viên trở lên. Cho phép tối đa 5000 người truy cập vào hệ thống cùng lúc.
Độ tin cậy và tính khả dụng: Hệ thống cho phép truy cập 24/7 không kể thời gian bảo trì và nâng cấp. Khi đăng nhập sai quá 5 lần thì tài khoản sẽ bị vơ hiệu q trong vịng 2h. Tích hợp tường lửa (Firewall) và phần mềm diệt virus tự động quét phần mềm.
- Yêu cầu về tính bảo mật
Hệ thống cần phải đảm bảo khơng xảy ra sai sót, thất thốt, rị rỉ thơng tin cá nhân của sinh viên.
Vấn đề mã hóa và xác thực danh tính: Cấp tài khoản và mật khẩu phải đảm bảo bí mật và an toàn.
Vấn đề về phân quyền và kiểm soát việc truy cập cũng cần được đảm bảo một cách tốt nhất.
- Yêu cầu về văn hóa, chính trị
Ngơn ngữ: tiếng Anh và tiếng Việt
Tính hợp pháp của hệ thống: tồn bộ quy trình nghiệp vụ của hệ thống phải tuân theo nghị định/ quyết định về thương mại điện tử của Chính phủ.
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14"><b>1.3. Bảng giá trị</b>
Input Miền giá trị Mã sinh viên String
Bảng cơ sở dữ liệu hồ sơ sinh viên
MSV Họ tên Ngày sinh Giới tính Lớp SĐT Địa chỉ 21D01 TRAN A 01/01/2003 NAM 1 0100000000 HA NOI 21D02 LE B 02/02/2003 NU 1 0200000000 CA MAU 21D03 BUI C 03/03/2002 NAM 1 0300000000 SON LA 21D04 CAO D 04/04/2003 NAM 1 0400000000 HUE 21D05 NGO H 05/05/2002 NAM 1 0500000000 HA NOI 21D06 TO K 06/06/2002 NU 1 0600000000 HA NAM 21D07 LE L 07/07/2003 NAM 1 0700000000 LAI CHAU 21D08 GIAP M 08/08/2003 NAM 1 0800000000 HA TINH 21D09 VU N 09/09/2003 NU 1 0900000000 HUE 21D10 VU V 10/10/2002 NU 1 0000000010 HA NOI
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">Bảng cơ sở dữ liệu điểm sinh viên
MSV Tên học phần ĐCC Điểm giữa kỳ Điểm cuối kỳ
21D03 PHAT TRIEN HE THONG 9.5 7.5 8 21D04 PHAN TICH THIET KE 10 8.5 8.5
21D07 PHAT TRIEN HE THONG 8.5 7 7.5
<b>1.5. Ca sử dụng</b>
<i>Biểu đồ ca sử dụng tổng quát </i>
Hình 2: Biểu đồ ca sử dụng tổng quát
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16"><i>Biểu đồ ca sử dụng chức năng quản lý hồ sơ sinh viên </i>
Hình 3: Biểu đồ ca sử dụng chức năng quản lý hồ sơ sinh viên
<i>Biểu đồ ca sử dụng chức năng quản lý điểm sinh viên </i>
Hình 4: Biểu đồ ca sử dụng chức năng quản lý điểm sinh viên
<b>1.6. Cấu trúc kiểm thử</b>
Quản lý hồ sơ sinh viên Quản lý điểm sinh viên -a1: Tạo hồ sơ sinh viên
-a2: Cập nhật hồ sơ sinh viên -a3: Xóa hồ sơ sinh viên -a4: Báo cáo và thống kê
Kiểm thử hộp đen Kiểm thử hộp trắng - Test Use Case: a1, b1
<small></small> Tạo hồ sơ thành công
<small></small> Mã sinh viên không hợp lệ
<small></small> Mã sinh viên đã tồn tại
<small></small> Ngày sinh không hợp lệ
<small></small> Số điện thoại không hợp lệ
<small></small> Tạo báo cáo hồ sơ thành công
<small></small> Tạo thống kê hồ sơ thành
<small></small> Mã sinh viên không hợp lệ
<small></small> Mã sinh viên không tồn tại
<small></small> Nhập điểm thành công
<small></small> Điểm thi đã tồn tại
<small></small> Điểm chuyên cần không hợp lệ. Nhập lại!
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18"><small></small> Điểm giữa kỳ không hợp lệ.
<small></small> Mã sinh viên không hợp lệ
<small></small> Mã sinh viên khơng tồn tại
<small></small> Khơng tìm thấy mơn học
<small></small> Xóa điểm thành cơng
<small></small> Tạo báo cáo điểm thành công
<small></small> Tạo thống kê điểm thành
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19"><small>// Hàm thống kê hồ sơ sinh viên</small>
<small>voidthongkeHoSoSinhVien() {</small>
<small> cout<<"\nHo so sinh vien:"<<endl;</small>
<small> for (size_t = 0; i < danhSachSinhVien.size(); ++i) { </small>
<small> cout<<"Ma SV: "<<danhSachSinhVien[]maSV<<", Ho ten: "</small>
<small><<danhSachSinhVien[]hoTen<<", Lop: "<<danhSachSinhVien[]lop </small>
<small> <<", So dien thoai: "<<danhSachSinhVien[i.soDienThoai</small>
<small><<", Dia chi: "<<danhSachSinhVien[i.diaChi<<endl; }</small>
<small>// Hàm tạo định dạng cho mã sinh viên và kiểm tra trùng lặp mã sinh viên</small>
<small>boolisValidMaSV(conststd :: string&maSV) {</small>
<small> if (maSV.length() !=5||!isupper(maSV[])) return false; // Kiểm tra độ dài và ký tự thứ 3 là chữ in hoa</small>
<small> if (!isdigit(maSV[]) ||isdigit(maSV[1) ||!isalpha(maSV[])) </small>
<small> for (size_t; i<maSV.length(); ++i) { if (!isdigit(maSV[])) returnfalse; }</small>
<small> returntrue;}</small>
<small>boolmaSVDaTonTai(conststring&maSV) {</small>
<small> for (size_t; i<danhSachSinhVien.size(); ++i) { if (danhSachSinhVien[]maSV==maSV) {</small>
<small>boolisValidNgaySinh(conststring&ngaySinh) { for (size_t; i<ngaySinh.size(); ++i) {</small>
<small>boolisValidSoDienThoai(conststring&soDienThoai) { for (size_t; i<soDienThoai.length(); ++i) {</small>
<small> // Kiểm tra mã sinh viên</small>
<small> while (!isValidMaSV(sv.maSV) ||maSVDaTonTai(sv.maSV)) { if (!isValidMaSV(sv.maSV)) {</small>
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20"><small> cout<<"Ma sinh vien khong hop le. \nNhap lai: ";</small>
<small> getline(cin, sv.hoTen);</small>
<small> cout<<"Nhap ngay sinh (dd/mm/yyyy): "; getline(cin, sv.ngaySinh);</small>
<small> //Kiểm tra ngày sinh </small>
<small> while (!isValidNgaySinh(sv.ngaySinh)) {</small>
<small> cout<<"Ngay sinh khong hop le. \nNhap lai (dd/mm/yyyy): "; getline(cin, sv.ngaySinh);</small>
<small> }</small>
<small> cout<<"Nhap gioi tinh (nam/nu): "; getline(cin, sv.gioiTinh);</small>
<small> cout<<"Nhap lop: "; getline(cin, sv.lop); floatsoDienthoai;</small>
<small> cout<<"Nhap so dien thoai: "; cin>>sv.soDienThoai;</small>
<small> // Kiểm tra số điện thoại</small>
<small> while (!isValidSoDienThoai(sv.soDienThoai)) {</small>
<small> cout<<"So dien thoai khong hop le. \nNhap lai: ";</small>
<small> cout<<"Tao ho so sinh vien thanh cong."<<endl; cout<<"\nThong tin ho so sinh vien vua tao:"<<endl;</small>
<small> cout<<"Ma SV: "<<sv.maSV<<", Ho ten: "<<sv.hoTen<<", Ngay sinh: "<<sv.ngaySinh<<", Gioi tinh: "<<sv.gioiTinh </small>
<small> <<", Lop: "<<sv.lop<<", So dien thoai: "<<</small>
<small>sv.soDienThoai<<", Dia chi: "<<sv.diaChi<<endl;</small>
<small> while (!isValidMaSV(maSV)) {</small>
<small> cout<<"Ma sinh vien khong hop le. \nNhap lai: "; cin>>maSV;</small>
<small> }</small>
<small> boolfoundfalse; do {</small>
<small> for (size_t; idanhSachSinhVien.size(); ++i) { if (danhSachSinhVien[]maSV==maSV) {</small>
<small> cout<<\nHo so sinh vien can cap nhat:"<<endl;</small>
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21"><small> cout<<"Ma SV: "<<danhSachSinhVien[i.maSV<<", Ho ten: "<<danhSachSinhVien[]hoTen<<", Ngay sinh: "<<</small>
<small>danhSachSinhVien[i.ngaySinh<<", Gioi tinh: "<<</small>
<small>danhSachSinhVien[i.gioiTinh<<", Lop: "<<danhSachSinhVien[]lop </small>
<small> <<", So dien thoai: "<<</small>
<small>danhSachSinhVien[i.soDienThoai<<", Dia chi: "<<</small>
<small> intluaChon;</small>
<small> cout<<\nChon muc can cap nhat:"<<endl; cout<<"1. Ma sinh vien"<<endl;</small>
<small> cout<<"2. Ho ten"<<endl; cout<<"3. Ngay sinh"<<endl; cout<<"4. Gioi tinh"<<endl; cout<<"5. Lop"<<endl;</small>
<small> cout<<"6. So dien thoai"<<endl; cout<<"7. Dia chi"<<endl;</small>
<small> cout<<"Lua chon cua ban: ";</small>
<small> getline(cin, danhSachSinhVien[i.maSV);</small>
<small> while (!isValidMaSV(danhSachSinhVien[]maSV) ||</small>
<small>maSVDaTonTai(danhSachSinhVien[i.maSV)) {</small>
<small> if (!isValidMaSV(danhSachSinhVien[i.maSV)) { cout<<"Ma sinh vien khong hop le. \nNhap lai: </small>
<small> getline(cin, danhSachSinhVien[i.hoTen);</small>
<small> cout<<"Cap nhat ho ten thanh cong."<<endl; break;</small>
<small> case3</small>
<small> cout<<"Nhap ngay sinh moi: "; cin.ignore();</small>
<small> getline(cin, danhSachSinhVien[i.ngaySinh);</small>
<small> cout<<"Cap nhat ngay sinh thanh cong."<<endl; break;</small>
<small> case4</small>
<small> cout<<"Nhap gioi tinh: "; cin.ignore();</small>
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22"><small> getline(cin, danhSachSinhVien[i.gioiTinh);</small>
<small> cout<<"Cap nhat gioi tinh thanh cong."<<endl; break;</small>
<small> case5</small>
<small> cout<<"Nhap lop moi: "; cin.ignore();</small>
<small> getline(cin, danhSachSinhVien[i.lop); cout<<"Cap nhat lop thanh cong."<<endl; break;</small>
<small> case6</small>
<small> cout<<"Nhap so dien thoai moi: "; cin.ignore();</small>
<small> cin>>danhSachSinhVien[]soDienThoai;</small>
<small> cout<<"Cap nhat so dien thoai thanh cong."<<</small>
<small> getline(cin, danhSachSinhVien[i.diaChi);</small>
<small> cout<<"Cap nhat dia chi thanh cong."<<endl;</small>
<small> cout<<\nThong tin ho so sinh vien vua tao:"<<endl; cout<<"Ma SV: "<<danhSachSinhVien[i.maSV<<", Ho ten: "<<danhSachSinhVien[]hoTen<<", Ngay sinh: "<<</small>
<small>danhSachSinhVien[i.ngaySinh<<", Gioi tinh: "<<</small>
<small>danhSachSinhVien[i.gioiTinh </small>
<small> <<", Lop: "<<danhSachSinhVien[i.lop<<", So dien thoai: "<<danhSachSinhVien[]soDienThoai<<", Dia chi: "<<</small>
<small> while (!isValidMaSV(maSV)) {</small>
<small> cout<<"Ma sinh vien khong hop le. \nNhap lai: "; cin>>maSV;</small>
<small> }</small>
<small> for (size_t; i<danhSachSinhVien.size(); ++i) {</small>
</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23"><small> if (danhSachSinhVien[]maSV==maSV) {</small>
<small> danhSachSinhVien.erase(danhSachSinhVien.begin() +i); cout<<"Xoa ho so sinh vien thanh cong."<<endl;</small>
<small> for (size_t; i<danhSachSinhVien.size(); ++i) {</small>
<small> cout<<"Ma SV: "<<danhSachSinhVien[]maSV<<", Ho ten: "</small>
<small><<danhSachSinhVien[]hoTen<<", Lop: "<<danhSachSinhVien[]lop<<endl;</small>
<small> cout<<"Ten hoc phan:"<<endl;</small>
<small> for (size_t; jdanhSachSinhVien[].danhSachDiem.size(); </small>
<small>++j) {</small>
<small> cout<<danhSachSinhVien[i.danhSachDiem[]monHoc<<": "</small>
<small> cout<<"Diem chuyen can: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemChuyenCan<<endl; cout<<"Diem giua ky: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemGiuaKy<<endl; cout<<"Diem cuoi ky: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemCuoiKy<<endl; }</small>
<small> cout<<endl; }</small>
<small>// Hàm tạo khoảng hợp lệ cho điểm</small>
<small>boolisValidDiem(floatdiem) {</small>
<small> return (diem>=&&diem<=10);</small>
<small> while (!isValidMaSV(maSV)) {</small>
<small> cout<<"Ma sinh vien khong hop le. Nhap lai: "; cin>>maSV;</small>
<small> }</small>
<small> boolfoundfalse; do {</small>
<small> for (size_t; idanhSachSinhVien.size(); ++i) { if (danhSachSinhVien[]maSV==maSV) {</small>
<small> foundtrue; Diemd</small>
<small> boolduplicatefalse;</small>
</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24"><small> do {</small>
<small> cout<<"Nhap ten hoc phan: "; cin.ignore();</small>
<small> getline(cin, d.monHoc);</small>
<small> // Kiểm tra xem điểm cho học phần này đã tồn tại chưa</small>
<small> duplicate=false; for (size_tj=0; j<danhSachSinhVien[i.danhSachDiem.size(); ++j) {</small>
<small> if (danhSachSinhVien[i.danhSachDiem[].monHoc</small>
<small> } while (!isValidDiem(.diemCuoiKy));</small>
<small> danhSachSinhVien[]danhSachDiem.push_back(); cout<<"Nhap diem thanh cong."<<endl;</small>
<small> cout<<\nBang diem sinh vien da nhap:"<<endl; cout<<"Ma SV: "<<danhSachSinhVien[i.maSV </small>
<small> <<", Ho ten: "<<danhSachSinhVien[i.hoTen<<", Lop: "<<danhSachSinhVien[]lop<<endl;</small>
<small> cout<<"Diem:"<<endl; for (size_tj=0; j<</small>
<small>danhSachSinhVien[i.danhSachDiem.size(); ++j) {</small>
<small> cout<<danhSachSinhVien[i.danhSachDiem[].monHoc</small>
<small><<": "<<endl;</small>
<small> cout<<"Diem chuyen can: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemChuyenCan<<endl;</small>
</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25"><small> cout<<"Diem giua ky: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemGiuaKy<<endl; cout<<"Diem cuoi ky: "<<</small>
<small> while (!isValidMaSV(maSV)) {</small>
<small> cout<<"Ma sinh vien khong hop le. \nNhap lai: "; cin>>maSV;</small>
<small> }</small>
<small> boolfoundfalse; do {</small>
<small> for (size_t; idanhSachSinhVien.size(); ++i) { if (danhSachSinhVien[]maSV==maSV) {</small>
<small> cout<<\nHien thi sinh vien can cap nhat diem:"<<endl;</small>
<small> cout<<"Ma SV: "<<danhSachSinhVien[i.maSV<<", Ho ten: "<<danhSachSinhVien[]hoTen<<", Lop: "<<</small>
<small> cout<<"Ten hoc phan:"<<endl; for (size_tj=0; j<</small>
<small>danhSachSinhVien[i.danhSachDiem.size(); ++j) {</small>
<small> cout<<danhSachSinhVien[i.danhSachDiem[].monHoc</small>
<small><<": "<<endl;</small>
<small> cout<<"Diem chuyen can"<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemChuyenCan<<endl; cout<<"Diem giua ky"<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemGiuaKy<<endl; cout<<"Diem cuoi ky"<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemCuoiKy<<endl; </small>
</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26"><small> if (danhSachSinhVien[i.danhSachDiem[]monHoc==</small>
<small>monHoc) {</small>
<small> floatdiemChuyenCan, diemGiuaKy, diemCuoiKy; cout<<"Nhap diem chuyen can moi: ";</small>
<small> cout<<"Cap nhat diem thanh cong."<<endl;</small>
<small> cout<<\nBang diem sinh vien vua cap nhat:"<<endl;</small>
<small> cout<<"Ma SV: "<<danhSachSinhVien[i.maSV<<", Ho ten: "<<danhSachSinhVien[]hoTen<<", Lop: "<<danhSachSinhVien[]lop</small>
<small> cout<<"Diem:"<<endl; for (size_t0; j</small>
<small>danhSachSinhVien[i.danhSachDiem.size(); ++j) {</small>
<small> cout<<danhSachSinhVien[i.danhSachDiem[]monHoc<<</small>
<small>": "<<endl;</small>
<small> cout<<"Diem chuyen can: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemChuyenCan<<endl; cout<<"Diem giua ky: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemGiuaKy<<endl; cout<<"Diem cuoi ky: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemCuoiKy<<endl; } </small>
<small> return; }</small>
<small> cout<<"Khong tim thay hoc phan "<<monHoc<<" trong danh sach diem cua sinh vien."<<endl;</small>
</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27"><small> stringmaSV;</small>
<small> cout<<"Nhap ma sinh vien can xoa diem: "; cin>>maSV;</small>
<small> while (!isValidMaSV(maSV)) {</small>
<small> cout<<"Ma sinh vien khong hop le. \nNhap lai: "; cin>>maSV;</small>
<small> }</small>
<small> for (size_t; i<danhSachSinhVien.size(); ++i) { if (danhSachSinhVien[]maSV==maSV) {</small>
<small> cout<<\nHien thi sinh vien can phai xoa diem:"<<endl; cout<<"Ma SV: "<<danhSachSinhVien[i.maSV<<", Ho ten: "<<danhSachSinhVien[]hoTen<<", Lop: "<<danhSachSinhVien[]lop</small>
<small> cout<<"Ten hoc phan:"<<endl; for (size_tj=0; j<</small>
<small>danhSachSinhVien[i.danhSachDiem.size(); ++j) {</small>
<small> cout<<danhSachSinhVien[i.danhSachDiem[].monHoc</small>
<small><<": "<<endl;</small>
<small> cout<<"Diem chuyen can"<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemChuyenCan<<endl; cout<<"Diem giua ky"<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemGiuaKy<<endl; cout<<"Diem cuoi ky"<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemCuoiKy<<endl; </small>
<small>danhSachSinhVien[i.danhSachDiem.size(); ++j) {</small>
<small> if (danhSachSinhVien[i.danhSachDiem[]monHoc==</small>
<small>monHoc) {</small>
<small> danhSachSinhVien[i.danhSachDiem.erase(danhSachSinhVien[]danhSachDiem.begin() +);</small>
<small> cout<<"Xoa diem thanh cong."<<endl; return;</small>
<small> } }</small>
<small> cout<<"Khong tim thay mon hoc "<<monHoc<<" cua sinh vien co ma "<<maSV<<endl;</small>
<small> for (size_t; idanhSachSinhVien.size(); ++i) { file<<danhSachSinhVien[i.maSV<<","<<</small>
<small>danhSachSinhVien[i.hoTen<<","<<danhSachSinhVien[]ngaySinh </small>
<small> <<","<<danhSachSinhVien[]gioiTinh<<","<<</small>
<small>danhSachSinhVien[i.lop </small>
</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28"><small> for (size_t; idanhSachSinhVien.size(); ++i) {</small>
<small> file<<"Ma SV: "<<danhSachSinhVien[i.maSV<<", Ho ten: "<<danhSachSinhVien[]hoTen<<", Lop: "<<danhSachSinhVien[]lop</small>
<small> </small>
<small> // Kiểm tra nếu danh sách điểm của sinh viên không rỗng</small>
<small> if (!danhSachSinhVien[i.danhSachDiem.empty()) { file<<"Ten hoc phan:"<<endl;</small>
<small> for (size_tj=0; j<</small>
<small>danhSachSinhVien[i.danhSachDiem.size(); ++j) {</small>
<small> file<<danhSachSinhVien[i.danhSachDiem[].monHoc</small>
<small><<": "<<endl;</small>
<small> file<<"Diem chuyen can: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemChuyenCan<<endl; file<<"Diem giua ky: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemGiuaKy<<endl; file<<"Diem cuoi ky: "<<</small>
<small>danhSachSinhVien[i.danhSachDiem[]diemCuoiKy<<endl; </small>
</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29"><small> stringmaSV, monHoc;</small>
<small> floatdiemChuyenCan, diemGiuaKy, diemCuoiKy;</small>
<small> for (size_t0; idanhSachSinhVien.size(); ++i) { if (danhSachSinhVien[i.maSV==maSV) {</small>
</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30"><small> intluaChon; do {</small>
<small> cout<<\nMenu: "<<endl;</small>
<small> cout<<"1. Tao ho so sinh vien"<<endl; cout<<"2. Cap nhat ho so sinh vien"<<endl; cout<<"3. Xoa ho so sinh vien"<<endl; cout<<"4. Thong ke ho so sinh vien"<<endl; cout<<"5. Nhap diem cho sinh vien"<<endl; cout<<"6. Cap nhat diem cho sinh vien"<<endl; cout<<"7. Xoa diem cho sinh vien"<<endl;</small>
<small> cout<<"8. Bao cao va thong ke diem sinh vien"<<endl; cout<<"0. Thoat"<<endl;</small>
<small> cout<<"Lua chon cua ban: ";</small>
</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31"><b>III. KẾ HOẠCH KIỂM THỬ 3.1. Mục tiêu kiểm thử </b>
Nhằm đảm bảo rằng chương trình đáp ứng được đầy đủ các yêu cầu của chức năng quản lý điểm của sinh viên và kết quả phù hợp cho từng bộ số liệu của các ca kiểm thử. Xác định và chỉ rõ các lỗi hay rủi ro liên quan nếu có và đảm bảo các lỗi đều được xử lý sau khi kiểm thử kết thúc. Kiểm tra chức năng hệ thống (system testing): kiểm tra chức năng quản lý điểm của sinh viên.
<b>3.2. Chiến lược kiểm thử </b>
Kiểm thử chức năng quản lý điểm của sinh viên hoạt động chính xác bằng việc thực hiện kiểm thử thủ công dựa trên 6 kỹ thuật kiểm thử (thiết kế kiểm thử Use Case, kiểm thử biên, phân hoạch tương đương, bảng quyết định, dòng điều khiển và dòng dữ liệu) đưa vào các dữ liệu hợp lệ và không hợp lệ để xác nhận kết quả mong đợi khi xảy ra với dữ liệu hợp lệ, thông báo lỗi xuất hiện khi nhập vào dữ liệu khơng hợp lệ. Tiêu chí hồn thành: các testcase đều được thực hiện và các lỗi có thể xác định được đề cập.
<b>3.3. Tiêu chí đảm bảo đầu ra </b>
Run rate: Tỷ lệ giữa các trường hợp kiểm thử được thực hiện / tổng số trường
Pass rate: tỷ lệ giữa số lượng các trường hợp kiểm thử pass/ số lượng các trường hợp kiểm thử được thực hiện đạt trên 90%.
<b>3.4. Quy trình thực hiện </b>
- Chuẩn bị các trường hợp, kịch bản cần kiểm tra
- Thiết kế các test case và số liệu cho quá trình kiểm thử - Thực thi các trường hợp kiểm thử và kiểm tra kết quả - Kiểm tra lại sau khi sửa lỗi
</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">Test manager
</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33"><b>3.8. Các tài liệu báo cáo kiểm thử </b>
kiểm thử
Tài liệu này cần được lập bởi Test leader trước khi kiểm thử
Khi kiểm thử hết một vòng hoặc trước khi kết thúc dự án cần cho ra báo cáo tổng kết quá trình đánh giá trình bày tổng kết về kết quả kiểm thử và đánh giá hệ thống
<b>IV. THIẾT KẾ CA KIỂM THỬ </b>
<b>BẢNG CƠ SỞ DỮ LIỆU HỒ SƠ SINH VIÊN </b>
21D01 TRAN A 01/01/2003 NAM 1 0100000000 HA NOI 21D02 LE B 02/02/2003 NU 1 0200000000 CA MAU 21D03 BUI C 03/03/2002 NAM 1 0300000000 SON LA 21D04 CAO D 04/04/2003 NAM 1 0400000000 HUE 21D05 NGO H 05/05/2002 NAM 1 0500000000 HA NOI 21D06 TO K 06/06/2002 NU 1 0600000000 HA NAM 21D07 LE L 07/07/2003 NAM 1 0700000000 LAI CHAU
</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">21D08 GIAP M 08/08/2003 NAM 1 0800000000 HA TINH 21D09 VU N 09/09/2003 NU 1 0900000000 HUE 21D10 VU V 10/10/2002 NU 1 0000000010 HA NOI
<b>BẢNG CƠ SỞ DỮ LIỆU ĐIỂM SINH VIÊN </b>
21D03 PHAT TRIEN HE THONG 9.5 7.5 8 21D04 PHAN TICH THIET KE 10 8.5 8.5
21D07 PHAT TRIEN HE THONG 8.5 7 7.5
<b>4.1. Thiết kế kiểm thử dựa trên mô tả ca sử dụng </b>
<i>4.1.1. Chức năng tạo hồ sơ sinh viên </i>
<i><b> Đặc tả ca sử dụng </b></i>
<b>Tên ca sử </b>
<b>dụng </b> <sup>Tạo hồ sơ sinh viên</sup> <b>Tác nhân </b> Cán bộ quản lý sinh viên
<b>Mục đích </b> Để tiến hành tạo hồ sơ sinh viên
<b>Mô tả </b> Cán bộ quản lý sinh viên chọn chức năng Tạo hồ sơ sinh viên, sau đó nhập các thông tin về mã sinh viên, họ tên, ngày sinh, giới tính, số điện thoại và địa chỉ của sinh viên
<b>Điều kiện đầu vào </b>
Cán bộ quản lý sinh viên đăng nhập vào hệ thống thành công
</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">1. Cán bộ quản lý sinh viên chọn chức năng Tạo hồ sơ sinh viên
2. Hệ thống hiển thị giao diện điền thông tin mã sinh viên, họ tên, ngày sinh, giới tính, số điện thoại, địa chỉ
3. Cán bộ quản lý sinh viên nhập thông tin mã sinh viên, họ tên, ngày sinh, giới tính, số điện thoại, địa chỉ và tạo hồ sơ sinh viên
4. Hệ thống thông báo tạo hồ sơ sinh viên thành công và hiển thị thông tin hồ sơ sinh viên đã được tạo
5. Kết thúc ca sử dụng
<b>Luồng rẽ nhánh </b>
A1: Mã sinh viên đã tồn tại
1. Hệ thống thông báo mã sinh viên đã tồn tại và yêu cầu nhập mã sinh viên khác
2. Cán bộ quản lý sinh viên nhập mã sinh viên mới và tạo hồ sơ sinh viên
Hệ thống thông báo tạo hồ sơ sinh viên thành công và hiển thị thông tin hồ sơ sinh viên đã được tạo
A2: Mã sinh viên không hợp lệ
1. Hệ thống thông báo mã sinh viên không hợp lệ và yêu cầu nhập mã sinh viên khác
2. Cán bộ quản lý sinh viên nhập lại mã sinh viên hợp lệ và tạo hồ sơ sinh viên
3. Hệ thống thông báo tạo hồ sơ sinh viên thành công và hiển thị thông tin hồ sơ sinh viên đã được tạo
A3: Ngày sinh không hợp lệ
1. Hệ thống thông báo ngày sinh không hợp lệ và yêu cầu nhập lại ngày sinh.
2. Cán bộ quản lý sinh viên nhập lại ngày sinh hợp lệ và tạo hồ sơ sinh viên
3. Hệ thống thông báo tạo hồ sơ sinh viên thành công và hiển thị thông tin hồ sơ sinh viên đã được tạo
A4: Số điện thoại không hợp lệ
1. Hệ thống thông báo số điện thoại không hợp lệ và yêu cầu nhập lại số điện thoại
2. Cán bộ quản lý sinh viên nhập lại số điện thoại hợp lệ và tạo hồ sơ sinh viên
3. Hệ thống thông báo tạo hồ sơ sinh viên thành công và hiển thị thông tin hồ sơ sinh viên đã được tạo
<i><b> Thiết kế ca sử dụng dựa trên kịch bản hành vi </b></i>
</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">2 Mã sinh viên không hợp lệ
Nhập điểm cho sinh viên
<b>Tác nhân </b> Cán bộ quản lý điểm
<b>Mục đích </b> Để tiến hành nhập điểm cho sinh viên
<b>Mô tả </b> Cán bộ quản lý điểm chọn chức năng Nhập điểm cho sinh viên, sau đó nhập các thông tin về mã sinh viên, tên học phần, điểm chuyên cần, điểm giữa kỳ, điểm cuối kỳ của sinh viên
Thông báo nhập điểm cho sinh viên thành công, điểm của sinh viên được lưu trên hệ thống
</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37"><b>Luồng chính </b>
1. Cán bộ quản lý điểm chọn chức năng Nhập điểm cho sinh viên 2. Hệ thống hiển thị giao diện điền thông tin mã sinh viên, tên học phần, điểm chuyên cần, điểm giữa kỳ, điểm cuối kỳ
3. Cán bộ quản lý điểm nhập thông tin mã sinh viên, tên học phần, điểm chuyên cần, điểm giữa kỳ, điểm cuối kỳ và tạo bảng điểm sinh viên
4. Hệ thống thông báo nhập điểm cho sinh viên thành công và hiển thị điểm của sinh viên đã được tạo
5. Kết thúc ca sử dụng
<b>Luồng rẽ nhánh </b>
A1: Mã sinh viên không hợp lệ/ không tồn tại
1. Hệ thống hiển thị mã sinh viên không hợp lệ/ chưa tồn tại và yêu cầu nhập lại
2. Cán bộ quản lý điểm nhập lại mã sinh viên khác
3. Hệ thống thông báo nhập điểm cho sinh viên thành công và hiển thị bảng điểm của sinh viên đã được tạo
A2: Điểm thi đã tồn tại
1. Hệ thống hiển thị điểm thi học phần của mã sinh viên vừa nhập đã tồn tại và yêu cầu nhập lại tên học phần.
A3: Thông tin điểm không hợp lệ
1. Cán bộ quản lý điểm nhập thông tin không hợp lệ, hệ thống hiển thị lỗi
1.1 Điểm chuyên cần không hợp lệ 1.2 Điểm giữa kỳ không hợp lệ 1.3 Điểm cuối kỳ không hợp lệ
viên
hiển thị thông tin bảng điểm của sinh viên đã được tạo
<i><b> Thiết kế ca sử dụng dựa trên kịch bản hành vi </b></i>
<b> Mô tả các ca kiểm thử </b>
</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">Test case
<small>MEM</small> – – – Điểm đã tồn tại. Nhập lại
Nhập lại! 3 21D02 <small>KIEM THU PHAN </small>
Nhập lại! 4 21D02 <small>KIEM THU PHAN </small>
Nhập lại! 5 21D02 <small>KIEM THU PHAN </small>
Nhập lại! 6 21D10 Kiểm thử phần
<b>4.2. Thiết kế kiểm thử hộp đen </b>
<b>4.2.1. Thiết kế kiểm thử lớp biên</b><i><b>(chức năng Nhập điểm sinh viên)</b></i>
</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39"><b> Điểm kiểm tra </b>
<b>4.2.1.2. Sinh test case </b>
Kiểm thử chức năng Nhập điểm sinh viên và 129 test cases.
<b>4.2.1.3. Các ca kiểm thử </b>
<b> Nhập điểm sinh viên : </b>
Input : Mã sinh viên (MSV), Tên học phần, Điểm chuyên cần (CC), Điểm giữa kỳ (GK), Điểm cuối kì (CK).
<small>121D01KIEM THU PHAN MEM———Điểm đã tồn tại. Nhập lại!</small>
<small>221D11————Mã sinh viên không tồn tại. Nhập lại!</small>
<small>321DABC————Mã sinh viên không hợp lệ. Nhập lại!</small>
<small>421D02PHAN TICH THIET KE———Điểm đã tồn tại. Nhập lại!</small>
<small>521D02KIEM THU PHAN MEM000Nhập điểm thành công</small>
<small>621D02KIEM THU PHAN MEM001Nhập điểm thành công</small>
<small>721D02KIEM THU PHAN MEM006Nhập điểm thành công</small>
<small>821D02KIEM THU PHAN MEM009Nhập điểm thành công</small>
<small>921D02KIEM THU PHAN MEM0010Nhập điểm thành công</small>
</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40"><small>1021D02KIEM THU PHAN MEM010Nhập điểm thành công</small>
<small>1121D02KIEM THU PHAN MEM011Nhập điểm thành công</small>
<small>1221D02KIEM THU PHAN MEM016Nhập điểm thành công</small>
<small>1321D02KIEM THU PHAN MEM019Nhập điểm thành công</small>
<small>1421D02KIEM THU PHAN MEM0110Nhập điểm thành công</small>
<small>1521D02KIEM THU PHAN MEM070Nhập điểm thành công</small>
<small>1621D02KIEM THU PHAN MEM071Nhập điểm thành công</small>
<small>1721D02KIEM THU PHAN MEM076Nhập điểm thành công</small>
<small>1821D02KIEM THU PHAN MEM079Nhập điểm thành công</small>
<small>1921D02KIEM THU PHAN MEM0710Nhập điểm thành công</small>
<small>2021D02KIEM THU PHAN MEM090Nhập điểm thành công</small>
<small>2121D02KIEM THU PHAN MEM091Nhập điểm thành công</small>
<small>2221D02KIEM THU PHAN MEM096Nhập điểm thành công</small>
<small>2321D02KIEM THU PHAN MEM099Nhập điểm thành công</small>
<small>2421D02KIEM THU PHAN MEM0910Nhập điểm thành công</small>
<small>2521D02KIEM THU PHAN MEM0100Nhập điểm thành công</small>
<small>2621D02KIEM THU PHAN MEM0101Nhập điểm thành công</small>
<small>2721D02KIEM THU PHAN MEM0106Nhập điểm thành công</small>
<small>2821D02KIEM THU PHAN MEM0109Nhập điểm thành công</small>
<small>2921D02KIEM THU PHAN MEM01010Nhập điểm thành công</small>
<small>3021D02KIEM THU PHAN MEM100Nhập điểm thành công</small>
</div>