Testes de Unidade (NUnit/xUnit)
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 67 de 70.
Desafio
FácilVamos completar o seu projeto de Sistema de Biblioteca adicionando testes unitários! Testar é essencial para garantir que seu código funcione corretamente e continue funcionando conforme você faz alterações. Você criará um arquivo de teste dedicado que verifica a funcionalidade principal do seu sistema de biblioteca.
Você continuará trabalhando com a estrutura do seu projeto existente, adicionando um novo arquivo de teste:
Book.cs: Mantenha sua classe Book comId,Title,Author,IsAvailablee os métodosBorrow()eReturn().User.cs: Mantenha sua classe User com rastreamento de empréstimos, a constanteMaxBooks,CanBorrow()e métodos para gerenciar livros emprestados.Library.cs: Mantenha sua classe Library com a lógica de empréstimo, métodos de busca e os métodosGetAllBooks()eGetAllUsers().LibraryTests.cs: Este é o seu novo arquivo de teste! Crie uma classe de teste que verifique se o seu sistema de biblioteca funciona corretamente. Você escreverá métodos de teste que verificam vários cenários e relatam se cada teste passa ou falha.Program.cs: Seu ponto de entrada que executa os testes e exibe os resultados.
Sua classe de teste deve incluir métodos que testem estes cenários:
TestBookBorrow- Verifica se o empréstimo de um livro disponível é bem-sucedido e altera sua disponibilidadeTestBookBorrowUnavailable- Verifica se o empréstimo de um livro já emprestado falha apropriadamenteTestUserBorrowingLimit- Verifica se os usuários não podem emprestar mais de 3 livrosTestBookReturn- Verifica se a devolução de um livro emprestado funciona corretamenteTestSearchByAuthor- Verifica se a busca por autor retorna os livros corretos
Cada método de teste deve retornar um booleano indicando se o teste passou. Crie um executor de testes simples que execute todos os testes e imprima os resultados.
Você receberá as seguintes entradas:
- Número de cenários de teste para executar (1-5, correspondendo aos testes listados acima)
Para cada teste executado, imprima o resultado no formato:
{TestName}: {PASS|FAIL}Após a conclusão de todos os testes, imprima um resumo:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Por exemplo, se a entrada for:
3A saída deve ser:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Outro exemplo com todos os 5 testes:
5A saída deve ser:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Seus testes devem criar novas instâncias de Book, User e Library para cada teste para garantir o isolamento. Dessa forma, o estado de um teste não afeta o outro. Pense em cada teste como uma verificação independente de um comportamento específico em seu sistema!
Experimente você mesmo
using System;
using Library.Tests;
class Program
{
public static void Main(string[] args)
{
// TODO: Crie uma instância de BorrowingServiceTests
// TODO: Execute cada método de teste, imprimindo o nome do teste antes de cada resultado
// Exemplo:
// Console.WriteLine("BorrowBook_WhenBookAvailable_ReturnsTrue");
// tests.BorrowBook_WhenBookAvailable_ReturnsTrue();
}
}Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos12Projeto: Sistema de Biblioteca
Estrutura do ProjetoModelos de Livro e Usuário