テストと統合
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 104/107。
チャレンジ
簡単ライブラリ管理システムが正しく動作することを検証するテストを書いて、仕上げましょう!ライブラリの中核機能を検証するテストファイルを作成します。本を正しく借りたり返したりできること、そしてエラー条件が正しく処理されることを確認します。
コードは5つのファイルに分けて整理します。
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、ISBN123-456 - ユーザー:ID
U001、名前Alice、メールアドレスalice@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)
// 標準テストフィクスチャ
// 本: 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")
}
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ