Menu
Coddy logo textTech

Testowanie i integracja

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 104 z 107.

challenge icon

Wyzwanie

Łatwy

Domknijmy działanie naszego systemu zarządzania biblioteką, pisząc testy weryfikujące, czy wszystko działa poprawnie! Utworzysz plik testowy, który sprawdzi podstawowe funkcje biblioteki: upewni się, że książki można prawidłowo wypożyczać i zwracać oraz że błędy są odpowiednio obsługiwane.

Rozmieścisz kod w pięciu plikach:

  • book.go: Struktura Book z polami ID, Title, Author, ISBN i Available. Dodaj konstruktor NewBook, który inicjuje książki jako dostępne.
  • user.go: Struktura User z polami ID, Name, Email i BorrowedBooks. Dodaj konstruktor NewUser.
  • library.go: Struktura Library z mapami książek i użytkowników oraz metodami NewLibrary, AddBook, AddUser, Borrow i Return. Metoda Borrow powinna zwracać błędy w przypadku nieprawidłowego użytkownika, nieprawidłowej książki lub niedostępnej książki. Metoda Return powinna zwracać błędy w przypadku nieprawidłowego użytkownika, nieprawidłowej książki lub książki, która nie została wypożyczona.
  • library_test.go: Tutaj napiszesz swoje funkcje testowe! Utwórz testy, które sprawdzą:
    • TestBorrowSuccess: Sprawdź, czy wypożyczenie dostępnej książki powiedzie się (nie zostanie zwrócony błąd), książka stanie się niedostępna, a jej ID zostanie dodane do listy wypożyczonych książek użytkownika
    • TestBorrowUnavailable: Sprawdź, czy próba wypożyczenia już wypożyczonej książki zwróci błąd
    • TestBorrowInvalidUser: Sprawdź, czy próba wypożyczenia książki przez nieistniejącego użytkownika zwróci błąd
    • TestReturnSuccess: Sprawdź, czy zwrócenie wypożyczonej książki powiedzie się, książka ponownie stanie się dostępna, a jej ID zostanie usunięte z listy wypożyczonych książek użytkownika

    Każdy test powinien skonfigurować własną bibliotekę z niezbędnymi książkami i użytkownikami, wykonać operację i sprawdzić wyniki za pomocą t.Error lub t.Errorf, gdy asercje nie przejdą.

  • main.go: Uruchom testy ręcznie i wyświetl ich wyniki. Odczytaj nazwę testu do wykonania (borrow_success, borrow_unavailable, borrow_invalid_user lub return_success). Na podstawie nazwy testu skonfiguruj odpowiedni scenariusz i wyświetl PASS, jeśli wszystkie asercje przejdą, lub FAIL: [reason], jeśli któraś asercja nie przejdzie.

Otrzymasz następujące dane wejściowe:

  • Nazwę testu: borrow_success, borrow_unavailable, borrow_invalid_user lub return_success

W każdym teście użyj tych standardowych danych testowych:

  • Książka: ID B001, tytuł Go Programming, autor John Doe, ISBN 123-456
  • Użytkownik: ID U001, imię Alice, adres e-mail alice@test.com

Na przykład, dla danych wejściowych:

borrow_success

Wynik powinien wyglądać tak:

PASS

A dla danych wejściowych:

borrow_unavailable

Wynik powinien wyglądać tak:

PASS

A dla danych wejściowych:

borrow_invalid_user

Wynik powinien wyglądać tak:

PASS

A dla danych wejściowych:

return_success

Wynik powinien wyglądać tak:

PASS

Dla borrow_success: Utwórz bibliotekę, dodaj książkę i użytkownika, wypożycz książkę, sprawdź, czy nie wystąpił błąd, sprawdź, czy książka jest niedostępna, i sprawdź, czy książka znajduje się na liście wypożyczonych książek użytkownika.

Dla borrow_unavailable: Utwórz bibliotekę, dodaj książkę i użytkownika, ustaw wartość Available książki na false, spróbuj ją wypożyczyć i sprawdź, czy został zwrócony błąd.

Dla borrow_invalid_user: Utwórz bibliotekę, dodaj tylko książkę (bez użytkownika), spróbuj ją wypożyczyć, używając ID użytkownika U001, i sprawdź, czy został zwrócony błąd.

Dla return_success: Utwórz bibliotekę, dodaj książkę i użytkownika, najpierw wypożycz książkę, a następnie ją zwróć. Sprawdź, czy nie wystąpił błąd, książka znów jest dostępna, a lista wypożyczonych książek użytkownika jest pusta.

Pisanie testów pozwala upewnić się, że system biblioteczny działa poprawnie, i daje pewność, że możesz wprowadzać zmiany bez psucia istniejących funkcji!

Spróbuj swoich sił

package main

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

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

	// Standardowe dane testowe
	// Książka: ID "B001", tytuł "Go Programming", autor "John Doe", ISBN "123-456"
	// Użytkownik: ID "U001", imię "Alice", adres e-mail "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Sprawdź, czy wypożyczenie dostępnej książki się powodzi
		// 1. Utwórz bibliotekę, dodaj książkę i użytkownika
		// 2. Wypożycz książkę
		// 3. Sprawdź: brak błędu, książka niedostępna, użytkownik ma książkę na liście
		// Wypisz "PASS", jeśli wszystkie testy przejdą, lub "FAIL: [reason]", jeśli którykolwiek się nie powiedzie
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Sprawdź, czy próba wypożyczenia niedostępnej książki zwraca błąd
		// 1. Utwórz bibliotekę, dodaj książkę i użytkownika
		// 2. Ustaw Available książki na false
		// 3. Spróbuj wypożyczyć książkę
		// 4. Sprawdź, czy zwrócono błąd
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Sprawdź, czy próba wypożyczenia książki przez nieprawidłowego użytkownika zwraca błąd
		// 1. Utwórz bibliotekę i dodaj tylko książkę (bez użytkownika)
		// 2. Spróbuj wypożyczyć książkę, używając ID użytkownika "U001"
		// 3. Sprawdź, czy zwrócono błąd
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Sprawdź, czy zwrot wypożyczonej książki się powiedzie
		// 1. Utwórz bibliotekę, dodaj książkę i użytkownika
		// 2. Najpierw wypożycz książkę
		// 3. Zwróć książkę
		// 4. Sprawdź: brak błędu, książka jest dostępna, lista użytkownika jest pusta
		fmt.Println("FAIL: not implemented")

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

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online