Menu
Coddy logo textTech

テストと統合

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

challenge icon

チャレンジ

簡単

ライブラリ管理システムが正しく動作することを検証するテストを書いて、仕上げましょう!ライブラリの中核機能を検証するテストファイルを作成します。本を正しく借りたり返したりできること、そしてエラー条件が正しく処理されることを確認します。

コードは5つのファイルに分けて整理します。

  • book.goIDTitleAuthorISBNAvailableフィールドを持つBook構造体です。本を利用可能な状態で初期化するNewBookコンストラクターを含めます。
  • user.goIDNameEmailBorrowedBooksフィールドを持つUser構造体です。NewUserコンストラクターを含めます。
  • library.go:本とユーザーのマップ、およびNewLibraryAddBookAddUserBorrowReturnメソッドを持つLibrary構造体です。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、タイトル 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", タイトル "Go Programming", 著者 "John Doe", ISBN "123-456"
	// ユーザー: ID "U001", 名前 "Alice", メール "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オンラインコンパイラ