テストと統合
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 104/107。
チャレンジ
簡単すべてが正しく動作することを確認するテストを書いて、図書館管理システムを完成させましょう!ライブラリのコア機能を検証するテストファイルを作成します。本が適切に貸出・返却できること、およびエラー条件が正しく処理されることを確認します。
コードは5つのファイルに分けて構成します:
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がユーザーの貸出リストから削除されることを検証します。
各テストは、必要な本とユーザーを含む独自のライブラリをセットアップし、操作を実行し、アサーションが失敗した場合には
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、TitleGo Programming、AuthorJohn Doe、ISBN123-456 - ユーザー:ID
U001、NameAlice、Emailalice@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)
// 標準テスト用フィクスチャ
// 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")
}
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー