Menu
Coddy logo textTech

테스트 및 통합

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

challenge icon

챌린지

쉬움

모든 것이 올바르게 작동하는지 확인하는 테스트를 작성하여 도서 관리 시스템을 완성해 봅시다! 도서관의 핵심 기능인 도서 대출 및 반납이 제대로 이루어지는지, 그리고 오류 조건이 올바르게 처리되는지 검증하는 테스트 파일을 만들 것입니다.

코드는 다음 다섯 개의 파일로 구성됩니다:

  • book.go: ID, Title, Author, ISBN, Available 필드를 가진 Book 구조체입니다. 도서를 대출 가능 상태로 초기화하는 NewBook 생성자를 포함하세요.
  • user.go: ID, Name, Email, BorrowedBooks 필드를 가진 User 구조체입니다. NewUser 생성자를 포함하세요.
  • library.go: 도서와 사용자를 위한 맵을 가진 Library 구조체와 NewLibrary, AddBook, AddUser, Borrow, Return 메서드입니다. Borrow 메서드는 잘못된 사용자, 잘못된 도서 또는 대출 불가능한 도서에 대해 에러를 반환해야 합니다. Return 메서드는 잘못된 사용자, 잘못된 도서 또는 대출하지 않은 도서에 대해 에러를 반환해야 합니다.
  • library_test.go: 테스트 함수를 작성하는 곳입니다! 다음을 검증하는 테스트를 만드세요:
    • TestBorrowSuccess — 대출 가능한 도서를 대출하는 것이 성공하고(에러가 반환되지 않음), 도서가 대출 불가능 상태가 되며, 도서 ID가 사용자의 대출 목록에 추가되는지 확인합니다.
    • TestBorrowUnavailable — 이미 대출된 도서를 대출하려고 할 때 에러가 반환되는지 확인합니다.
    • TestBorrowInvalidUser — 존재하지 않는 사용자 ID로 대출을 시도할 때 에러가 반환되는지 확인합니다.
    • TestReturnSuccess — 대출한 도서를 반납하는 것이 성공하고, 도서가 다시 대출 가능 상태가 되며, 도서 ID가 사용자의 대출 목록에서 제거되는지 확인합니다.

    각 테스트는 필요한 도서와 사용자가 포함된 자체 라이브러리를 설정하고, 작업을 수행한 후, 단언(assertion)이 실패할 경우 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)

	// 표준 테스트 픽스처
	// Book: ID "B001", Title "Go Programming", Author "John Doe", ISBN "123-456"
	// User: 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")
	}
}

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