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 ciclo do nosso Sistema de Gerenciamento de Biblioteca escrevendo testes que verifiquem 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 corretamente e que as condições de erro sejam tratadas adequadamente.

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 mapas para livros e usuários, juntamente 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 fica indisponível e se o ID do livro é adicionado à lista de livros emprestados do usuário
    • TestBorrowUnavailable: verifique se o empréstimo de um livro que já foi 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 fica disponível novamente e se o ID do livro é removido da lista de livros 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 informe 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 exiba PASS se todas as asserções passarem ou FAIL: [reason] se alguma 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 dados de teste padrão:

  • Livro: ID B001, título Go Programming, autor John Doe, ISBN 123-456
  • Usuário: ID U001, nome Alice, e-mail alice@test.com

Por exemplo, dada a entrada:

borrow_success

Sua saída deve ser:

PASS

E dada a entrada:

borrow_unavailable

Sua saída deve ser:

PASS

E dada a entrada:

borrow_invalid_user

Sua saída deve ser:

PASS

E dada a entrada:

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 e verifique se o usuário tem o livro em sua lista de livros emprestados.

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

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

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

Escrever testes garante que seu sistema de biblioteca se comporte corretamente e dá a você confiança para fazer alterações sem quebrar 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", Title "Go Programming", Author "John Doe", ISBN "123-456"
	// Usuário: ID "U001", Name "Alice", Email "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Testar que o empréstimo de um livro disponível é bem-sucedido
		// 1. Crie a biblioteca, adicione o livro e o usuário
		// 2. Empreste o livro
		// 3. Verifique: sem erro, livro indisponível, usuário tem o livro na lista
		// Imprima "PASS" se todos passarem, ou "FAIL: [reason]" se algum falhar
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Testar que o empréstimo de um livro indisponível retorna erro
		// 1. Crie a biblioteca, adicione o livro e o usuário
		// 2. Defina Available do livro como false
		// 3. Tente emprestar
		// 4. Verifique que um erro é retornado
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Teste que emprestar com usuário inválido retorna erro
		// 1. Crie a biblioteca, adicione apenas o livro (sem usuário)
		// 2. Tente emprestar com o ID de usuário "U001"
		// 3. Verifique se um erro é retornado
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Teste que devolver um livro emprestado tem sucesso
		// 1. Crie a biblioteca, adicione o livro e o usuário
		// 2. Empreste o livro primeiro
		// 3. Devolva o livro
		// 4. Verifique: 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

Pratique por conta própria: Compilador de Go online