Menu
Coddy logo textTech

Test e integrazione

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 104 di 107.

challenge icon

Sfida

Facile

Completiamo il ciclo del nostro sistema di gestione della biblioteca scrivendo test che verificano che tutto funzioni correttamente! Creerai un file di test che convalida le funzionalità principali della tua biblioteca: assicurarti che i libri possano essere presi in prestito e restituiti correttamente e che le condizioni di errore siano gestite nel modo giusto.

Organizzerai il codice in cinque file:

  • book.go: la tua struct Book con i campi ID, Title, Author, ISBN e Available. Includi il costruttore NewBook, che inizializza i libri come disponibili.
  • user.go: la tua struct User con i campi ID, Name, Email e BorrowedBooks. Includi il costruttore NewUser.
  • library.go: la tua struct Library con map per libri e utenti, insieme ai metodi NewLibrary, AddBook, AddUser, Borrow e Return. Il metodo Borrow dovrebbe restituire errori per utente non valido, libro non valido o libro non disponibile. Il metodo Return dovrebbe restituire errori per utente non valido, libro non valido o libro non preso in prestito.
  • library_test.go: qui scriverai le tue funzioni di test! Crea test che verifichino:
    • TestBorrowSuccess: verifica che prendere in prestito un libro disponibile vada a buon fine (non venga restituito alcun errore), che il libro diventi non disponibile e che l'ID del libro venga aggiunto alla lista dei libri presi in prestito dall'utente
    • TestBorrowUnavailable: verifica che prendere in prestito un libro già preso in prestito restituisca un errore
    • TestBorrowInvalidUser: verifica che tentare di prendere in prestito un libro con l'ID di un utente inesistente restituisca un errore
    • TestReturnSuccess: verifica che restituire un libro preso in prestito vada a buon fine, che il libro torni disponibile e che il suo ID venga rimosso dalla lista dei libri presi in prestito dall'utente

    Ogni test dovrebbe configurare la propria biblioteca con i libri e gli utenti necessari, eseguire l'operazione e controllare i risultati usando t.Error o t.Errorf quando le asserzioni non vengono soddisfatte.

  • main.go: esegui i test manualmente e riporta i risultati. Leggi il nome del test da eseguire (borrow_success, borrow_unavailable, borrow_invalid_user o return_success). In base al nome del test, configura lo scenario appropriato e stampa PASS se tutte le asserzioni vengono soddisfatte, oppure FAIL: [reason] se un'asserzione non viene soddisfatta.

Verrà fornito il seguente input:

  • Un nome di test: borrow_success, borrow_unavailable, borrow_invalid_user o return_success

Per ogni test, usa i seguenti dati di test standard:

  • Libro: ID B001, titolo Go Programming, autore John Doe, ISBN 123-456
  • Utente: ID U001, nome Alice, email alice@test.com

Per esempio, dato:

borrow_success

Il tuo output dovrebbe essere:

PASS

E dato:

borrow_unavailable

Il tuo output dovrebbe essere:

PASS

E dato:

borrow_invalid_user

Il tuo output dovrebbe essere:

PASS

E dato:

return_success

Il tuo output dovrebbe essere:

PASS

Per borrow_success: crea la biblioteca, aggiungi un libro e un utente, fai prendere in prestito il libro, verifica che non ci siano errori, verifica che il libro non sia disponibile e verifica che l'utente abbia il libro nella propria lista dei libri presi in prestito.

Per borrow_unavailable: crea la biblioteca, aggiungi un libro e un utente, imposta Available del libro su false, prova a farlo prendere in prestito e verifica che venga restituito un errore.

Per borrow_invalid_user: crea la biblioteca, aggiungi solo il libro (nessun utente), prova a farlo prendere in prestito con l'ID utente U001 e verifica che venga restituito un errore.

Per return_success: crea la biblioteca, aggiungi un libro e un utente, fai prendere in prestito il libro e poi restituiscilo; verifica che non ci siano errori, che il libro sia di nuovo disponibile e che la lista dei libri presi in prestito dall'utente sia vuota.

Scrivere test assicura che il sistema della biblioteca si comporti correttamente e ti dà la sicurezza necessaria per apportare modifiche senza compromettere le funzionalità esistenti!

Provalo tu

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	testName, _ := reader.ReadString('\n')
	testName = strings.TrimSpace(testName)

	// Dati di test standard
	// Libro: ID "B001", titolo "Go Programming", autore "John Doe", ISBN "123-456"
	// Utente: ID "U001", nome "Alice", email "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Verificare che il prestito di un libro disponibile riesca
		// 1. Creare la biblioteca, aggiungere il libro e l'utente
		// 2. Prendere in prestito il libro
		// 3. Verificare: nessun errore, libro non disponibile, libro presente nell'elenco dell'utente
		// Stampare "PASS" se tutte le verifiche riescono, oppure "FAIL: [reason]" se una fallisce
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Verificare che il prestito di un libro non disponibile restituisca un errore
		// 1. Creare la biblioteca, aggiungere il libro e l'utente
		// 2. Impostare Available del libro su false
		// 3. Tentare di prendere il libro in prestito
		// 4. Verificare che venga restituito un errore
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Verifica che il prestito con un utente non valido restituisca un errore
		// 1. Crea la biblioteca, aggiungi solo il libro (nessun utente)
		// 2. Prova a prendere in prestito il libro con l'ID utente "U001"
		// 3. Verifica che venga restituito un errore
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Verifica che la restituzione di un libro preso in prestito riesca
		// 1. Creare la biblioteca, aggiungere il libro e l'utente
		// 2. Prendi prima in prestito il libro
		// 3. Restituisci il libro
		// 4. Verifica: nessun errore, libro disponibile, elenco dell'utente vuoto
		fmt.Println("FAIL: not implemented")

	default:
		fmt.Println("FAIL: unknown test")
	}
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online