테스트 및 통합
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 104번째.
챌린지
쉬움모든 것이 올바르게 작동하는지 검증하는 테스트를 작성하여 Library Management System을 완성해 봅시다! 라이브러리의 핵심 기능을 검증하는 테스트 파일을 만들게 됩니다. 즉, 책을 올바르게 빌리고 반납할 수 있는지, 그리고 오류 조건이 올바르게 처리되는지를 확인합니다.
코드를 다섯 개의 파일로 구성합니다.
book.go:ID,Title,Author,ISBN,Available필드를 포함하는Book구조체입니다. 책을 대여 가능한 상태로 초기화하는NewBook생성자를 포함하세요.user.go:ID,Name,Email,BorrowedBooks필드를 포함하는User구조체입니다.NewUser생성자를 포함하세요.library.go: 책과 사용자에 대한 맵과 함께NewLibrary,AddBook,AddUser,Borrow,Return메서드를 포함하는Library구조체입니다.Borrow메서드는 유효하지 않은 사용자, 유효하지 않은 책 또는 대여할 수 없는 책에 대해 오류를 반환해야 합니다.Return메서드는 유효하지 않은 사용자, 유효하지 않은 책 또는 대여하지 않은 책에 대해 오류를 반환해야 합니다.library_test.go: 테스트 함수를 작성할 곳입니다! 다음을 검증하는 테스트를 만드세요.TestBorrowSuccess: 대여 가능한 책의 대여가 성공하고(오류가 반환되지 않음), 책을 대여할 수 없는 상태가 되며, 책 ID가 사용자의 대여 목록에 추가되는지 검증합니다.TestBorrowUnavailable: 이미 대여된 책을 대여하려고 하면 오류가 반환되는지 검증합니다.TestBorrowInvalidUser: 존재하지 않는 사용자 ID로 대여하려고 하면 오류가 반환되는지 검증합니다.TestReturnSuccess: 대여한 책의 반납이 성공하고, 책을 다시 대여할 수 있는 상태가 되며, 책 ID가 사용자의 대여 목록에서 제거되는지 검증합니다.
각 테스트는 필요한 책과 사용자를 포함하는 자체 라이브러리를 설정하고, 작업을 수행한 다음, 어설션이 실패하면
t.Error또는t.Errorf를 사용하여 결과를 확인해야 합니다.main.go: 테스트를 수동으로 실행하고 결과를 보고합니다. 실행할 테스트 이름(borrow_success,borrow_unavailable,borrow_invalid_user또는return_success)을 읽습니다. 테스트 이름에 따라 적절한 시나리오를 설정하고 모든 어설션이 통과하면PASS를 출력하며, 어설션 하나라도 실패하면FAIL: [reason]을 출력합니다.
다음 입력이 제공됩니다.
- 테스트 이름:
borrow_success,borrow_unavailable,borrow_invalid_user또는return_success
각 테스트에 다음 표준 테스트 데이터를 사용하세요.
- 책: ID
B001, 제목Go Programming, 저자John Doe, ISBN123-456 - 사용자: ID
U001, 이름Alice, 이메일alice@test.com
예를 들어 다음이 주어지면:
borrow_success출력은 다음과 같아야 합니다.
PASS그리고 다음이 주어지면:
borrow_unavailable출력은 다음과 같아야 합니다.
PASS그리고 다음이 주어지면:
borrow_invalid_user출력은 다음과 같아야 합니다.
PASS그리고 다음이 주어지면:
return_success출력은 다음과 같아야 합니다.
PASSborrow_success의 경우: 라이브러리를 만들고, 책과 사용자를 추가하고, 책을 대여한 다음, 오류가 없는지 확인하고, 책을 대여할 수 없는 상태인지 확인하며, 사용자의 대여 목록에 책이 있는지 확인합니다.
borrow_unavailable의 경우: 라이브러리를 만들고, 책과 사용자를 추가하고, 책의 Available을 false로 설정한 다음, 대여를 시도하고 오류가 반환되는지 확인합니다.
borrow_invalid_user의 경우: 라이브러리를 만들고, 책만 추가하고(사용자는 추가하지 않음), 사용자 ID U001로 대여를 시도한 다음, 오류가 반환되는지 확인합니다.
return_success의 경우: 라이브러리를 만들고, 책과 사용자를 추가하고, 먼저 책을 대여한 다음 반납하고, 오류가 없는지 확인하고, 책을 다시 대여할 수 있는 상태인지 확인하며, 사용자의 대여 목록이 비어 있는지 확인합니다.
테스트를 작성하면 라이브러리 시스템이 올바르게 작동하는지 확인할 수 있으며, 기존 기능을 손상시키지 않고 변경할 수 있다는 확신을 얻을 수 있습니다!
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
testName, _ := reader.ReadString('\n')
testName = strings.TrimSpace(testName)
// 표준 테스트 픽스처
// 도서: ID "B001", Title "Go Programming", Author "John Doe", ISBN "123-456"
// 사용자: ID "U001", Name "Alice", Email "alice@test.com"
switch testName {
case "borrow_success":
// TODO: 이용 가능한 책 대출이 성공하는지 테스트
// 1. 라이브러리 생성, 책과 사용자 추가
// 2. 책 대출
// 3. 확인: 오류 없음, 책 이용 불가, 사용자 목록에 책 있음
// 모두 통과하면 "PASS" 출력, 실패하면 "FAIL: [reason]" 출력
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: 이용 불가능한 책 대출 시 오류가 반환되는지 테스트
// 1. 라이브러리 생성, 책과 사용자 추가
// 2. 책의 Available을 false로 설정
// 3. 대출 시도
// 4. 오류가 반환되는지 확인
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: 잘못된 사용자로 대출 시 오류가 반환되는지 테스트
// 1. 라이브러리 생성, 책만 추가 (사용자 없음)
// 2. 사용자 ID "U001"로 대출 시도
// 3. 오류가 반환되는지 확인
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: 대출한 책 반납이 성공하는지 테스트
// 1. 라이브러리 생성, 책과 사용자 추가
// 2. 먼저 책을 대출
// 3. 책을 반납
// 4. 확인: 오류 없음, 책 이용 가능, 사용자 목록이 비어 있음
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러