Menu
Coddy logo textTech

테스트 및 통합

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 104번째.

challenge icon

챌린지

쉬움

모든 것이 올바르게 작동하는지 검증하는 테스트를 작성하여 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, ISBN 123-456
  • 사용자: ID U001, 이름 Alice, 이메일 alice@test.com

예를 들어 다음이 주어지면:

borrow_success

출력은 다음과 같아야 합니다.

PASS

그리고 다음이 주어지면:

borrow_unavailable

출력은 다음과 같아야 합니다.

PASS

그리고 다음이 주어지면:

borrow_invalid_user

출력은 다음과 같아야 합니다.

PASS

그리고 다음이 주어지면:

return_success

출력은 다음과 같아야 합니다.

PASS

borrow_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")
	}
}

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Go 컴파일러