テストと統合
CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 60/64。
チャレンジ
中級このチャレンジでは、包括的なテストカバレッジを備えたマルチファイル構成のライブラリシステムを実装します。3つの読み取り専用ファイルと、実装のガイドとなる詳細な TODO コメントが含まれた1つの編集可能ファイルを使用します。
- book.py - Book クラスの定義が含まれています
- user.py - 実装が必要な User クラスが含まれています
- library.py - Library クラスの定義が含まれています
チートシート
このチャレンジでは、3つの主要なコンポーネントで構成されるマルチファイル・ライブラリ・システムの実装を行います:
- book.py - Bookクラスの定義
- user.py - Userクラスの実装
- library.py - Libraryクラスの定義
実装には包括的なテストカバレッジを含め、各ファイルに記載されているTODOコメントに従う必要があります。
自分で試してみよう
from book import Book
from user import User
from library import Library
# テストケースのハンドラー
test_case = input()
if test_case == "create_user":
user_id = "1"
name = "Name"
user = User(user_id, name)
print(user)
print(f"Books borrowed: {len(user.books_borrowed)}")
elif test_case == "borrow_and_return_all":
library = Library("Community Library")
# 本とユーザーを追加
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
library.add_book(Book("1984", "George Orwell", "345678"))
user = User("U001", "Alice")
library.add_user(user)
# 本を借りる
library.borrow_book("123456", "U001")
library.borrow_book("789012", "U001")
library.borrow_book("345678", "U001")
print(f"Books borrowed before: {len(user.books_borrowed)}")
# すべての本を返却
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")
# すべての本が利用可能か確認
for book in library.books:
print(f"Book {book.isbn} available: {book.available}")
elif test_case == "return_some_books":
library = Library("Community Library")
# 本とユーザーを追加
book1 = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
book2 = Book("To Kill a Mockingbird", "Harper Lee", "789012")
library.add_book(book1)
library.add_book(book2)
user = User("U001", "Alice")
library.add_user(user)
# 1冊だけ本を借りる
library.borrow_book("123456", "U001")
print(f"Books borrowed before: {len(user.books_borrowed)}")
# すべての本を返却
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")
elif test_case == "empty_return":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
print(f"Books borrowed: {len(user.books_borrowed)}")
# すべての本を返却(0冊になるはず)
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
elif test_case == "multiple_users":
library = Library("Community Library")
# 本を追加
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
# ユーザーを追加
user1 = User("U001", "Alice")
user2 = User("U002", "Bob")
library.add_user(user1)
library.add_user(user2)
# 本を借りる
library.borrow_book("123456", "U001")
library.borrow_book("789012", "U002")
print(user1)
print(user2)
# user1のすべての本を返却
num_returned = user1.return_all_books(library)
print(f"Books returned by {user1.name}: {num_returned}")
print(user1)
print(user2)
elif test_case == "error_handling":
library = Library("Community Library")
# 本とユーザーを追加
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
user = User("U001", "Alice")
library.add_user(user)
# 存在しない本を借りようとする
result = library.borrow_book("999999", "U001")
print(result)
# 存在しないユーザーで借りようとする
result = library.borrow_book("123456", "U999")
print(result)
# 存在する本を借りる
result = library.borrow_book("123456", "U001")
print(result)
# 同じ本を再度借りようとする
result = library.borrow_book("123456", "U001")
print(result)
# 借りていない本を返却しようとする
result = library.return_book("789012", "U001")
print(result)
elif test_case == "stress_test":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
# 100冊の本を追加
for i in range(1, 101):
isbn = f"{i:03d}" # 001, 002などの形式にする
library.add_book(Book(f"Book {i}", f"Author {i}", isbn))
library.borrow_book(isbn, "U001")
print(f"Books borrowed: {len(user.books_borrowed)}")
# すべての本を返却
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")