Pruebas e integración
Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 60 de 64.
Desafío
IntermedioEn este desafío, implementarás un sistema de biblioteca de múltiples archivos con una cobertura de pruebas exhaustiva. Trabajarás con tres archivos de solo lectura y un archivo editable que contiene comentarios TODO detallados que guiarán tu implementación:
- book.py - Contiene la definición de la clase Book
- user.py - Contiene la clase User que necesitas implementar
- library.py - Contiene la definición de la clase Library
Hoja de referencia
Este desafío consiste en implementar un sistema de biblioteca de archivos múltiples con tres componentes principales:
- book.py - Definición de la clase Book
- user.py - Implementación de la clase User
- library.py - Definición de la clase Library
La implementación debe incluir una cobertura de pruebas exhaustiva y seguir los comentarios TODO proporcionados en cada archivo.
Pruébalo tú mismo
from book import Book
from user import User
from library import Library
# Manejador de casos de prueba
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")
# Agregar libros y usuarios
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)
# Tomar libros prestados
library.borrow_book("123456", "U001")
library.borrow_book("789012", "U001")
library.borrow_book("345678", "U001")
print(f"Books borrowed before: {len(user.books_borrowed)}")
# Devolver todos los libros
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")
# Verificar si todos los libros están disponibles
for book in library.books:
print(f"Book {book.isbn} available: {book.available}")
elif test_case == "return_some_books":
library = Library("Community Library")
# Agregar libros y usuarios
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)
# Tomar prestado solo un libro
library.borrow_book("123456", "U001")
print(f"Books borrowed before: {len(user.books_borrowed)}")
# Devolver todos los libros
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)}")
# Devolver todos los libros (debería ser 0)
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
elif test_case == "multiple_users":
library = Library("Community Library")
# Agregar libros
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
# Agregar usuarios
user1 = User("U001", "Alice")
user2 = User("U002", "Bob")
library.add_user(user1)
library.add_user(user2)
# Tomar libros prestados
library.borrow_book("123456", "U001")
library.borrow_book("789012", "U002")
print(user1)
print(user2)
# Devolver todos los libros para 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")
# Agregar libro y usuario
library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
user = User("U001", "Alice")
library.add_user(user)
# Intentar tomar prestado un libro inexistente
result = library.borrow_book("999999", "U001")
print(result)
# Intentar tomar prestado para un usuario inexistente
result = library.borrow_book("123456", "U999")
print(result)
# Tomar prestado un libro existente
result = library.borrow_book("123456", "U001")
print(result)
# Intentar tomar prestado el mismo libro de nuevo
result = library.borrow_book("123456", "U001")
print(result)
# Intentar devolver un libro que no fue prestado
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)
# Agregar 100 libros
for i in range(1, 101):
isbn = f"{i:03d}" # Formatear como 001, 002, etc.
library.add_book(Book(f"Book {i}", f"Author {i}", isbn))
library.borrow_book(isbn, "U001")
print(f"Books borrowed: {len(user.books_borrowed)}")
# Devolver todos los libros
num_returned = user.return_all_books(library)
print(f"Books returned: {num_returned}")
print(f"Books borrowed after: {len(user.books_borrowed)}")Todas las lecciones de Object Oriented Programming
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias6Encapsulamiento
Miembros públicos, protegidos y privadosModificadores de accesoOcultamiento de informaciónDecoradores de propiedades avanzadosResumen - Sistema de registros de estudiantes12Proyecto: Gestión de biblioteca
Descripción general del proyectoClases de Libros y Usuarios