Menu
CoddyTech

Kiểm thử và tích hợp

Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 104 trên 107.

challenge icon

Thử thách

Dễ

Hãy hoàn thiện Hệ thống quản lý thư viện bằng cách viết các bài kiểm tra để xác nhận mọi thứ hoạt động chính xác! Bạn sẽ tạo một tệp kiểm tra để xác thực các chức năng cốt lõi của thư viện: đảm bảo sách có thể được mượn và trả đúng cách, đồng thời các trường hợp lỗi được xử lý chính xác.

Bạn sẽ sắp xếp code trong năm tệp:

  • book.go: Struct Book với các trường ID, Title, Author, ISBN và Available. Thêm hàm khởi tạo NewBook để khởi tạo sách ở trạng thái có sẵn.
  • user.go: Struct User với các trường ID, Name, Email và BorrowedBooks. Thêm hàm khởi tạo NewUser.
  • library.go: Struct Library với các map lưu sách và người dùng, cùng các phương thức NewLibrary, AddBook, AddUser, Borrow và Return. Phương thức Borrow cần trả về lỗi nếu người dùng không hợp lệ, sách không hợp lệ hoặc sách không có sẵn. Phương thức Return cần trả về lỗi nếu người dùng không hợp lệ, sách không hợp lệ hoặc sách chưa được mượn.
  • library_test.go: Đây là nơi bạn viết các hàm kiểm tra! Tạo các bài kiểm tra để xác nhận:
    • TestBorrowSuccess: Xác nhận việc mượn một cuốn sách có sẵn thành công, không trả về lỗi, sách chuyển sang trạng thái không có sẵn và mã sách được thêm vào danh sách sách đã mượn của người dùng
    • TestBorrowUnavailable: Xác nhận việc mượn một cuốn sách đã được mượn sẽ trả về lỗi
    • TestBorrowInvalidUser: Xác nhận việc mượn sách bằng mã người dùng không tồn tại sẽ trả về lỗi
    • TestReturnSuccess: Xác nhận việc trả một cuốn sách đã mượn thành công, sách lại trở nên có sẵn và mã sách được xóa khỏi danh sách sách đã mượn của người dùng

    Mỗi bài kiểm tra cần tự thiết lập thư viện cùng những cuốn sách và người dùng cần thiết, thực hiện thao tác rồi kiểm tra kết quả bằng t.Error hoặc t.Errorf khi xác nhận không đạt.

  • main.go: Chạy thủ công các bài kiểm tra và báo cáo kết quả. Đọc tên bài kiểm tra cần chạy (borrow_success, borrow_unavailable, borrow_invalid_user hoặc return_success). Dựa trên tên bài kiểm tra, thiết lập tình huống tương ứng và in ra PASS nếu mọi xác nhận đều đạt, hoặc FAIL: [reason] nếu có xác nhận nào không đạt.

Đầu vào sẽ có dạng sau:

  • Tên bài kiểm tra: borrow_success, borrow_unavailable, borrow_invalid_user hoặc return_success

Với mỗi bài kiểm tra, hãy dùng dữ liệu kiểm tra tiêu chuẩn sau:

  • Sách: mã B001, tiêu đề Go Programming, tác giả John Doe, ISBN 123-456
  • Người dùng: mã U001, tên Alice, email alice@test.com

Ví dụ, với đầu vào:

borrow_success

Đầu ra cần là:

PASS

Với đầu vào:

borrow_unavailable

Đầu ra cần là:

PASS

Với đầu vào:

borrow_invalid_user

Đầu ra cần là:

PASS

Với đầu vào:

return_success

Đầu ra cần là:

PASS

Với borrow_success: Tạo thư viện, thêm sách và người dùng, mượn sách, xác nhận không có lỗi, xác nhận sách không còn có sẵn và xác nhận sách nằm trong danh sách sách đã mượn của người dùng.

Với borrow_unavailable: Tạo thư viện, thêm sách và người dùng, đặt Available của sách thành false, thử mượn sách rồi xác nhận có lỗi được trả về.

Với borrow_invalid_user: Tạo thư viện, chỉ thêm sách mà không thêm người dùng, thử mượn sách bằng mã người dùng U001 rồi xác nhận có lỗi được trả về.

Với return_success: Tạo thư viện, thêm sách và người dùng, mượn sách trước rồi trả lại, xác nhận không có lỗi, sách lại có sẵn và danh sách sách đã mượn của người dùng trống.

Viết bài kiểm tra giúp đảm bảo hệ thống thư viện hoạt động chính xác và giúp bạn tự tin thay đổi code mà không làm hỏng các chức năng hiện có!

Tự làm thử

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	testName, _ := reader.ReadString('\n')
	testName = strings.TrimSpace(testName)

	// Dữ liệu mẫu chuẩn cho kiểm thử
	// Sách: ID "B001", tiêu đề "Go Programming", tác giả "John Doe", ISBN "123-456"
	// Người dùng: ID "U001", tên "Alice", email "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Kiểm tra việc mượn sách còn sẵn có thành công
		// 1. Tạo thư viện, thêm sách và người dùng
		// 2. Mượn sách
		// 3. Kiểm tra: không có lỗi, sách không còn sẵn, người dùng có sách trong danh sách
		// In ra "PASS" nếu tất cả đều đạt, hoặc "FAIL: [reason]" nếu có trường hợp không đạt
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Kiểm tra việc mượn sách không còn sẵn trả về lỗi
		// 1. Tạo thư viện, thêm sách và người dùng
		// 2. Đặt Available của sách thành false
		// 3. Thử mượn sách
		// 4. Kiểm tra có lỗi trả về
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Kiểm tra việc mượn sách bằng người dùng không hợp lệ có trả về lỗi hay không
		// 1. Tạo thư viện, chỉ thêm sách (không thêm người dùng)
		// 2. Thử mượn sách bằng ID người dùng "U001"
		// 3. Kiểm tra xem có trả về lỗi hay không
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Kiểm tra việc trả sách đã mượn có thành công hay không
		// 1. Tạo thư viện, thêm sách và người dùng
		// 2. Mượn sách trước
		// 3. Trả sách
		// 4. Kiểm tra: không có lỗi, sách có thể mượn, danh sách sách đã mượn của người dùng trống
		fmt.Println("FAIL: not implemented")

	default:
		fmt.Println("FAIL: unknown test")
	}
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Go online