Menu
Coddy logo textTech

Тестирование и интеграция

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 104 из 107.

challenge icon

Задание

Легко

Давайте завершим создание нашей системы управления библиотекой, написав тесты, которые проверят корректность её работы! Вы создадите файл тестов, проверяющий основную функциональность библиотеки: правильность выдачи и возврата книг, а также корректную обработку ошибок.

Вы распределите код по пяти файлам:

  • book.go: ваша структура Book с полями ID, Title, Author, ISBN и Available. Добавьте конструктор NewBook, который инициализирует книги как доступные.
  • user.go: ваша структура User с полями ID, Name, Email и BorrowedBooks. Добавьте конструктор NewUser.
  • library.go: ваша структура Library с отображениями для книг и пользователей, а также методами NewLibrary, AddBook, AddUser, Borrow и Return. Метод Borrow должен возвращать ошибки для недействительного пользователя, недействительной книги или недоступной книги. Метод Return должен возвращать ошибки для недействительного пользователя, недействительной книги или книги, которая не была взята.
  • library_test.go: здесь вы напишете функции тестов! Создайте тесты, которые проверяют:
    • TestBorrowSuccess: проверьте, что выдача доступной книги проходит успешно (ошибка не возвращается), книга становится недоступной, а ID книги добавляется в список взятых пользователем книг
    • TestBorrowUnavailable: проверьте, что попытка взять уже выданную книгу возвращает ошибку
    • TestBorrowInvalidUser: проверьте, что попытка взять книгу с несуществующим ID пользователя возвращает ошибку
    • TestReturnSuccess: проверьте, что возврат взятой книги проходит успешно, книга снова становится доступной, а ID книги удаляется из списка взятых пользователем книг

    Каждый тест должен создавать собственную библиотеку с необходимыми книгами и пользователями, выполнять операцию и проверять результаты с помощью t.Error или t.Errorf, если проверки не пройдены.

  • main.go: запускайте тесты вручную и выводите результаты. Считайте имя теста для выполнения (borrow_success, borrow_unavailable, borrow_invalid_user или return_success). В зависимости от имени теста настройте соответствующий сценарий и выведите PASS, если все проверки пройдены, или FAIL: [reason], если какая-либо проверка не пройдена.

Будет предоставлен следующий ввод:

  • Имя теста: borrow_success, borrow_unavailable, borrow_invalid_user или return_success

Для каждого теста используйте следующие стандартные тестовые данные:

  • Книга: ID B001, название Go Programming, автор John Doe, ISBN 123-456
  • Пользователь: ID U001, имя Alice, электронная почта alice@test.com

Например, если задано:

borrow_success

Ваш вывод должен быть таким:

PASS

А если задано:

borrow_unavailable

Ваш вывод должен быть таким:

PASS

А если задано:

borrow_invalid_user

Ваш вывод должен быть таким:

PASS

А если задано:

return_success

Ваш вывод должен быть таким:

PASS

Для borrow_success: создайте библиотеку, добавьте книгу и пользователя, возьмите книгу, проверьте отсутствие ошибки, проверьте, что книга недоступна, и проверьте, что у пользователя есть книга в списке взятых книг.

Для borrow_unavailable: создайте библиотеку, добавьте книгу и пользователя, установите для Available книги значение false, попробуйте взять книгу и проверьте, что возвращена ошибка.

Для borrow_invalid_user: создайте библиотеку, добавьте только книгу (без пользователя), попробуйте взять книгу с ID пользователя U001 и проверьте, что возвращена ошибка.

Для return_success: создайте библиотеку, добавьте книгу и пользователя, сначала возьмите книгу, затем верните её, проверьте отсутствие ошибки, проверьте, что книга снова доступна, и проверьте, что список взятых пользователем книг пуст.

Написание тестов гарантирует корректную работу вашей библиотечной системы и позволит вам уверенно вносить изменения, не нарушая существующую функциональность!

Попробуйте сами

package main

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

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

	// Стандартные тестовые фикстуры
	// Книга: ID "B001", Title "Go Programming", Author "John Doe", ISBN "123-456"
	// Пользователь: ID "U001", Name "Alice", Email "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Протестировать, что взятие доступной книги проходит успешно
		// 1. Создать библиотеку, добавить книгу и пользователя
		// 2. Взять книгу
		// 3. Проверить: нет ошибки, книга недоступна, у пользователя есть книга в списке
		// Вывести "PASS", если все пройдено, или "FAIL: [reason]", если что-то не удалось
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Протестировать, что взятие недоступной книги возвращает ошибку
		// 1. Создать библиотеку, добавить книгу и пользователя
		// 2. Установить Available книги в false
		// 3. Попытаться взять книгу
		// 4. Проверить, что возвращается ошибка
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Проверить, что заимствование с недействительным пользователем возвращает ошибку
		// 1. Создать библиотеку, добавить только книгу (без пользователя)
		// 2. Попытаться взять книгу с ID пользователя "U001"
		// 3. Проверить, что возвращается ошибка
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Проверить, что возврат взятой книги проходит успешно
		// 1. Создать библиотеку, добавить книгу и пользователя
		// 2. Сначала взять книгу
		// 3. Вернуть книгу
		// 4. Проверить: нет ошибки, книга доступна, список пользователя пуст
		fmt.Println("FAIL: not implemented")

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Go