Kiểm thử đơn vị (NUnit/xUnit)
Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 67 trên 70.
Thử thách
DễHãy hoàn thiện dự án Library System bằng cách thêm các bài kiểm thử đơn vị! Kiểm thử rất quan trọng để đảm bảo code hoạt động chính xác và tiếp tục hoạt động đúng khi bạn thay đổi code. Bạn sẽ tạo một tệp kiểm thử riêng để xác minh các chức năng cốt lõi của hệ thống thư viện.
Bạn sẽ tiếp tục làm việc với cấu trúc dự án hiện có và thêm một tệp kiểm thử mới:
Book.cs: Giữ lớp Book vớiId,Title,Author,IsAvailablecùng các phương thứcBorrow()vàReturn().User.cs: Giữ lớp User với chức năng theo dõi sách đang mượn, hằng sốMaxBooks, phương thứcCanBorrow()và các phương thức quản lý sách đang mượn.Library.cs: Giữ lớp Library với logic mượn sách, các phương thức tìm kiếm và các phương thứcGetAllBooks()cùngGetAllUsers().LibraryTests.cs: Đây là tệp kiểm thử mới của bạn! Tạo một lớp kiểm thử để xác minh hệ thống thư viện hoạt động chính xác. Bạn sẽ viết các phương thức kiểm thử để kiểm tra nhiều tình huống và báo cáo từng bài kiểm thử đạt hay không đạt.Program.cs: Điểm bắt đầu để chạy các bài kiểm thử và hiển thị kết quả.
Lớp kiểm thử của bạn nên có các phương thức kiểm tra những tình huống sau:
TestBookBorrow- Xác minh việc mượn một cuốn sách có sẵn thành công và làm thay đổi trạng thái sẵn có của sáchTestBookBorrowUnavailable- Xác minh việc mượn một cuốn sách đã được mượn sẽ thất bại như mong đợiTestUserBorrowingLimit- Xác minh người dùng không thể mượn quá 3 cuốn sáchTestBookReturn- Xác minh việc trả một cuốn sách đã mượn hoạt động chính xácTestSearchByAuthor- Xác minh việc tìm kiếm theo tác giả trả về đúng các cuốn sách
Mỗi phương thức kiểm thử nên trả về một giá trị boolean cho biết bài kiểm thử có đạt hay không. Tạo một trình chạy kiểm thử đơn giản để chạy tất cả các bài kiểm thử và in kết quả.
Bạn sẽ nhận đầu vào sau:
- Số lượng tình huống kiểm thử cần chạy (từ 1 đến 5, tương ứng với các bài kiểm thử ở trên)
Với mỗi bài kiểm thử được chạy, hãy in kết quả theo định dạng:
{TestName}: {PASS|FAIL}Sau khi tất cả bài kiểm thử hoàn tất, hãy in phần tổng kết:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Ví dụ, nếu đầu vào là:
3Đầu ra sẽ là:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Ví dụ khác với cả 5 bài kiểm thử:
5Đầu ra sẽ là:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Các bài kiểm thử nên tạo các instance mới của Book, User và Library cho mỗi lần kiểm thử để đảm bảo chúng độc lập. Như vậy, trạng thái của bài kiểm thử này sẽ không ảnh hưởng đến bài kiểm thử khác. Hãy xem mỗi bài kiểm thử như một lần xác minh độc lập cho một hành vi cụ thể trong hệ thống của bạn!
Tự làm thử
using System;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Đọc số lượng bài kiểm tra cần chạy
int numTests = Convert.ToInt32(Console.ReadLine());
// TODO: Tạo đối tượng LibraryTests và chạy numTests bài kiểm tra đầu tiên
}
}
}
Tất cả bài học trong Lập trình hướng đối tượng
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợp3Kiến trúc lớp
Dữ liệu instance và dữ liệu tĩnhTừ khóa 'readonly' và 'const'Trường lưu trữÔn tập: Trình quản lý tài khoản ngân hàng6Đóng gói
Bộ điều chỉnh quyền truy cậpThuộc tính để đóng góiTriển khai ẩn dữ liệuCác mẫu bất biếnÔn tập: hồ sơ học sinh12Dự án: hệ thống thư viện
Cấu trúc dự ánMô hình sách và người dùngLogic hệ thống mượn sáchLINQ để tìm kiếmGiao diện console / giao diện quản trịKiểm thử đơn vị (NUnit/xUnit)Tự luyện tập: Trình biên dịch C# online