Pruebas e integración
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 104 de 107.
Desafío
Fácil¡Completemos nuestro Sistema de Gestión de Bibliotecas escribiendo pruebas que verifiquen que todo funciona correctamente! Crearás un archivo de pruebas que valide la funcionalidad principal de tu biblioteca: comprobar que los libros se puedan prestar y devolver correctamente, y que las condiciones de error se gestionen de forma adecuada.
Organizarás tu código en cinco archivos:
book.go: Tu estructuraBookcon los camposID,Title,Author,ISBNyAvailable. Incluye el constructorNewBook, que inicializa los libros como disponibles.user.go: Tu estructuraUsercon los camposID,Name,EmailyBorrowedBooks. Incluye el constructorNewUser.library.go: Tu estructuraLibrarycon mapas para libros y usuarios, junto con los métodosNewLibrary,AddBook,AddUser,BorrowyReturn. El métodoBorrowdebe devolver errores para un usuario no válido, un libro no válido o un libro no disponible. El métodoReturndebe devolver errores para un usuario no válido, un libro no válido o un libro que no se haya prestado.library_test.go: ¡Aquí escribirás tus funciones de prueba! Crea pruebas que verifiquen:TestBorrowSuccess: Verifica que prestar un libro disponible tenga éxito (no se devuelva ningún error), que el libro pase a estar no disponible y que el ID del libro se añada a la lista de libros prestados del usuario.TestBorrowUnavailable: Verifica que prestar un libro que ya se ha prestado devuelva un error.TestBorrowInvalidUser: Verifica que prestar un libro con un ID de usuario inexistente devuelva un error.TestReturnSuccess: Verifica que devolver un libro prestado tenga éxito, que el libro vuelva a estar disponible y que el ID del libro se elimine de la lista de libros prestados del usuario.
Cada prueba debe configurar su propia biblioteca con los libros y usuarios necesarios, realizar la operación y comprobar los resultados usando
t.Errorot.Errorfcuando fallen las comprobaciones.main.go: Ejecuta las pruebas manualmente e informa de los resultados. Lee el nombre de la prueba que se ejecutará (borrow_success,borrow_unavailable,borrow_invalid_useroreturn_success). Según el nombre de la prueba, configura el escenario adecuado e imprimePASSsi todas las comprobaciones tienen éxito, oFAIL: [reason]si falla alguna comprobación.
Se proporcionará la siguiente entrada:
- Un nombre de prueba:
borrow_success,borrow_unavailable,borrow_invalid_useroreturn_success
Para cada prueba, usa estos datos de prueba estándar:
- Book: ID
B001, TitleGo Programming, AuthorJohn Doe, ISBN123-456 - User: ID
U001, NameAlice, Emailalice@test.com
Por ejemplo, dada la siguiente entrada:
borrow_successTu salida debe ser:
PASSY dada la siguiente entrada:
borrow_unavailableTu salida debe ser:
PASSY dada la siguiente entrada:
borrow_invalid_userTu salida debe ser:
PASSY dada la siguiente entrada:
return_successTu salida debe ser:
PASSPara borrow_success: Crea la biblioteca, añade el libro y el usuario, presta el libro, verifica que no haya ningún error, verifica que el libro no esté disponible y verifica que el usuario tenga el libro en su lista de libros prestados.
Para borrow_unavailable: Crea la biblioteca, añade el libro y el usuario, establece Available del libro en false, intenta prestarlo y verifica que se devuelva un error.
Para borrow_invalid_user: Crea la biblioteca, añade únicamente el libro (sin usuario), intenta prestar el libro con el ID de usuario U001 y verifica que se devuelva un error.
Para return_success: Crea la biblioteca, añade el libro y el usuario, presta primero el libro y después devuélvelo; verifica que no haya ningún error, que el libro vuelva a estar disponible y que la lista de libros prestados del usuario esté vacía.
¡Escribir pruebas garantiza que tu sistema de biblioteca funcione correctamente y te da la confianza necesaria para realizar cambios sin alterar la funcionalidad existente!
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
testName, _ := reader.ReadString('\n')
testName = strings.TrimSpace(testName)
// Fixtures de prueba estándar
// Libro: ID "B001", Título "Go Programming", Autor "John Doe", ISBN "123-456"
// Usuario: ID "U001", Nombre "Alice", Email "alice@test.com"
switch testName {
case "borrow_success":
// TODO: Prueba que prestar un libro disponible se realiza con éxito
// 1. Crea la biblioteca, añade el libro y el usuario
// 2. Presta el libro
// 3. Verifica: sin error, libro no disponible, el usuario tiene el libro en la lista
// Imprime "PASS" si todo pasa, o "FAIL: [reason]" si alguno falla
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: Prueba que prestar un libro no disponible devuelve un error
// 1. Crea la biblioteca, añade el libro y el usuario
// 2. Establece Available del libro a false
// 3. Intenta prestar
// 4. Verifica que se devuelve un error
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Prueba que prestar con un usuario inválido devuelve un error
// 1. Crea la biblioteca, añade solo el libro (sin usuario)
// 2. Intenta prestar con el ID de usuario "U001"
// 3. Verifica que se devuelve un error
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: Prueba que devolver un libro prestado tiene éxito
// 1. Crea la biblioteca, añade el libro y el usuario
// 2. Presta el libro primero
// 3. Devuelve el libro
// 4. Verifica: sin error, libro disponible, lista del usuario vacía
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de POO en Go
Archivos externosEspacio de trabajo y módulos de GoPaquetes e importacionesNombres exportados vs. no exportadosIntroducción a la POO en GoStructs como clasesDefinición de métodos en structsReceptores de puntero vs. de valorInicialización de structsFunciones constructorasResumen - Calculadora simple4Interfaces
Introducción a las interfacesImplementación implícitaLa interfaz como contratoInterfaz vacía (any)Type AssertionType SwitchComposición de interfacesInterfaces Stringer y ErrorResumen: Calculadora de figuras7Encapsulamiento
Campos exportados vs. no exportadosEncapsulamiento a nivel de paqueteMétodos Getter y SetterOcultamiento de información en GoResumen - Registros de estudiantes10Genéricos (Go 1.18+)
Introducción a los GenéricosParámetros de tipoRestricciones de tipoStructs genéricosSolución alternativa para métodos genéricosResumen - Colección genérica13Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón Abstract FactoryPatrón ObserverPatrón Strategy2Inmersión profunda en Tipos y Structs
Tipos básicos y compuestosDefiniciones de tipos personalizadosEtiquetas de StructsStructs anónimosStructs anidadosValores cero y por defectoRepaso - Libreta de contactos5Composición sobre herencia
Por qué Go no tiene herenciaConceptos básicos de incrustación de structsPromoción de métodosIncrustación de múltiples structsIncrustación vs AgregaciónShadowing de métodos incrustadosResumen - Jerarquía de empleados8Manejo de Errores y OOP
La interfaz errorTipos de errores personalizadosEnvoltura de errores (fmt.Errorf)Errores centinelaerrors.Is() y errors.As()Panic, Defer y RecoverResumen - Analizador de archivos3Punteros y Memoria
Fundamentos de punteros en GoPunteros a StructsPaso por valor vs referenciaLa función new()Garbage Collection en GoResumen - Constructor de Linked List6Polimorfismo en Go
Polimorfismo mediante interfacesDuck Typing en GoReglas de satisfacción de interfacesColecciones polimórficasInyección de dependenciasResumen - Procesador de pagos9Concurrencia y POO
Fundamentos de GoroutinesChannels y comunicaciónChannels con buffer vs. sin bufferSentencia Selectsync.Mutex y sync.RWMutexsync.WaitGroupDiseño de estructuras Thread-SafeResumen - Worker Pool12Conceptos avanzados de POO
Patrón Functional OptionsPatrón Builder en GoEncadenamiento de métodosAlias de tipos vs. definicionesFundamentos de ReflectionDescripción general de generación de código15Proyecto: Gestión de bibliotecas
Descripción general y estructura del proyectoStructs de libros y usuariosPractica por tu cuenta: Compilador de Go online