Menu
Coddy logo textTech

テストと統合

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 104/107。

challenge icon

チャレンジ

簡単

すべてが正しく動作することを確認するテストを書いて、図書館管理システムを完成させましょう!ライブラリのコア機能を検証するテストファイルを作成します。本が適切に貸出・返却できること、およびエラー条件が正しく処理されることを確認します。

コードは5つのファイルに分けて構成します:

  • book.go: IDTitleAuthorISBN、および Available フィールドを持つ Book 構造体。本を「利用可能」として初期化する NewBook コンストラクタを含めます。
  • user.go: IDNameEmail、および BorrowedBooks フィールドを持つ User 構造体。NewUser コンストラクタを含めます。
  • library.go: 本とユーザーのマップを持つ Library 構造体と、NewLibraryAddBookAddUserBorrow、および Return メソッド。Borrow メソッドは、無効なユーザー、無効な本、または利用不可能な本に対してエラーを返す必要があります。Return メソッドは、無効なユーザー、無効な本、または貸出されていない本に対してエラーを返す必要があります。
  • library_test.go: ここにテスト関数を記述します!以下の内容を検証するテストを作成してください:
    • TestBorrowSuccess — 利用可能な本の貸出が成功すること(エラーが返されないこと)、本が利用不可になること、および本のIDがユーザーの貸出リストに追加されることを検証します。
    • TestBorrowUnavailable — すでに貸出されている本の貸出がエラーを返すことを検証します。
    • TestBorrowInvalidUser — 存在しないユーザーIDでの貸出がエラーを返すことを検証します。
    • TestReturnSuccess — 貸出中の本の返却が成功すること、本が再び利用可能になること、および本のIDがユーザーの貸出リストから削除されることを検証します。

    各テストは、必要な本とユーザーを含む独自のライブラリをセットアップし、操作を実行し、アサーションが失敗した場合には t.Error または t.Errorf を使用して結果をチェックする必要があります。

  • main.go: テストを手動で実行し、結果を報告します。実行するテスト名(borrow_successborrow_unavailableborrow_invalid_user、または return_success)を読み取ります。テスト名に基づいて適切なシナリオをセットアップし、すべてのアサーションがパスした場合は PASS を、いずれかのアサーションが失敗した場合は FAIL: [reason] を出力します。

以下の入力が提供されます:

  • テスト名:borrow_successborrow_unavailableborrow_invalid_user、または return_success

各テストでは、以下の標準的なテスト用データ(フィクスチャ)を使用してください:

  • 本:ID B001、Title Go Programming、Author John Doe、ISBN 123-456
  • ユーザー:ID U001、Name Alice、Email alice@test.com

例えば、次のように入力された場合:

borrow_success

出力は次のようになります:

PASS

また、次のように入力された場合:

borrow_unavailable

出力は次のようになります:

PASS

また、次のように入力された場合:

borrow_invalid_user

出力は次のようになります:

PASS

また、次のように入力された場合:

return_success

出力は次のようになります:

PASS

borrow_success の場合:ライブラリを作成し、本とユーザーを追加し、本を貸し出し、エラーがないことを確認し、本が利用不可であることを確認し、ユーザーの貸出リストにその本があることを確認します。

borrow_unavailable の場合:ライブラリを作成し、本とユーザーを追加し、本の Availablefalse に設定し、貸出を試行し、エラーが返されることを確認します。

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: [理由]" を出力する
		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")
	}
}

オブジェクト指向プログラミングのすべてのレッスン