Menu
Coddy logo textTech

Testes e Integração

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 104 de 107.

challenge icon

Desafio

Fácil

Vamos completar o nosso Sistema de Gerenciamento de Biblioteca escrevendo testes que verificam se tudo funciona corretamente! Você criará um arquivo de teste que valida a funcionalidade principal da sua biblioteca — garantindo que os livros possam ser emprestados e devolvidos adequadamente, e que as condições de erro sejam tratadas corretamente.

Você organizará seu código em cinco arquivos:

  • book.go: Sua struct Book com os campos ID, Title, Author, ISBN e Available. Inclua o construtor NewBook que inicializa os livros como disponíveis.
  • user.go: Sua struct User com os campos ID, Name, Email e BorrowedBooks. Inclua o construtor NewUser.
  • library.go: Sua struct Library com maps para livros e usuários, junto com os métodos NewLibrary, AddBook, AddUser, Borrow e Return. O método Borrow deve retornar erros para usuário inválido, livro inválido ou livro indisponível. O método Return deve retornar erros para usuário inválido, livro inválido ou livro não emprestado.
  • library_test.go: É aqui que você escreverá suas funções de teste! Crie testes que verifiquem:
    • TestBorrowSuccess — Verifique se o empréstimo de um livro disponível é bem-sucedido (nenhum erro retornado), se o livro se torna indisponível e se o ID do livro é adicionado à lista de emprestados do usuário
    • TestBorrowUnavailable — Verifique se o empréstimo de um livro já emprestado retorna um erro
    • TestBorrowInvalidUser — Verifique se o empréstimo com um ID de usuário inexistente retorna um erro
    • TestReturnSuccess — Verifique se a devolução de um livro emprestado é bem-sucedida, se o livro se torna disponível novamente e se o ID do livro é removido da lista de emprestados do usuário

    Cada teste deve configurar sua própria biblioteca com os livros e usuários necessários, realizar a operação e verificar os resultados usando t.Error ou t.Errorf quando as asserções falharem.

  • main.go: Execute seus testes manualmente e relate os resultados. Leia o nome do teste a ser executado (borrow_success, borrow_unavailable, borrow_invalid_user ou return_success). Com base no nome do teste, configure o cenário apropriado e imprima PASS se todas as asserções passarem, ou FAIL: [reason] se qualquer asserção falhar.

A seguinte entrada será fornecida:

  • Um nome de teste: borrow_success, borrow_unavailable, borrow_invalid_user ou return_success

Para cada teste, use estes fixtures de teste padrão:

  • Livro: ID B001, Title Go Programming, Author John Doe, ISBN 123-456
  • Usuário: ID U001, Name Alice, Email alice@test.com

Por exemplo, dado:

borrow_success

Sua saída deve ser:

PASS

E dado:

borrow_unavailable

Sua saída deve ser:

PASS

E dado:

borrow_invalid_user

Sua saída deve ser:

PASS

E dado:

return_success

Sua saída deve ser:

PASS

Para borrow_success: Crie a biblioteca, adicione o livro e o usuário, empreste o livro, verifique se não há erro, verifique se o livro está indisponível, verifique se o usuário tem o livro em sua lista de emprestados.

Para borrow_unavailable: Crie a biblioteca, adicione o livro e o usuário, defina o Available do livro como false, tente emprestar, verifique se um erro é retornado.

Para borrow_invalid_user: Crie a biblioteca, adicione apenas o livro (sem usuário), tente emprestar com o ID de usuário U001, verifique se um erro é retornado.

Para return_success: Crie a biblioteca, adicione o livro e o usuário, primeiro empreste o livro e depois devolva-o, verifique se não há erro, verifique se o livro está disponível novamente, verifique se a lista de emprestados do usuário está vazia.

Escrever testes garante que seu sistema de biblioteca se comporte corretamente e lhe dá confiança para fazer alterações sem quebrar as funcionalidades existentes!

Experimente você mesmo

package main

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

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

	// Fixtures de teste padrão
	// Livro: ID "B001", Título "Go Programming", Autor "John Doe", ISBN "123-456"
	// Usuário: ID "U001", Nome "Alice", Email "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Testar se o empréstimo de um livro disponível é bem-sucedido
		// 1. Criar biblioteca, adicionar livro e usuário
		// 2. Emprestar o livro
		// 3. Verificar: sem erro, livro indisponível, usuário tem o livro na lista
		// Imprimir "PASS" se tudo passar, ou "FAIL: [motivo]" se algum falhar
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Testar se o empréstimo de um livro indisponível retorna erro
		// 1. Criar biblioteca, adicionar livro e usuário
		// 2. Definir Available do livro como false
		// 3. Tentar emprestar
		// 4. Verificar se um erro é retornado
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Testar se o empréstimo com usuário inválido retorna erro
		// 1. Criar biblioteca, adicionar apenas o livro (sem usuário)
		// 2. Tentar emprestar com o ID de usuário "U001"
		// 3. Verificar se um erro é retornado
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Testar se a devolução de um livro emprestado é bem-sucedida
		// 1. Criar biblioteca, adicionar livro e usuário
		// 2. Emprestar o livro primeiro
		// 3. Devolver o livro
		// 4. Verificar: sem erro, livro disponível, lista do usuário vazia
		fmt.Println("FAIL: not implemented")

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

Todas as lições de Programação Orientada a Objetos