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 concluir seu projeto Library System adicionando testes unitários! Testar é essencial para garantir que seu código funcione corretamente e continue funcionando à medida que você faz alterações. Você criará um arquivo de teste dedicado que verifica as principais funcionalidades do seu sistema de biblioteca.
Você continuará trabalhando com a estrutura existente do seu projeto, 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 o controle de empréstimos, a constanteMaxBooks,CanBorrow()e os métodos para gerenciar os livros emprestados.Library.cs: Mantenha sua classe Library com a lógica de empréstimos, os métodos de pesquisa e os métodosGetAllBooks()eGetAllUsers().LibraryTests.cs: Este é seu novo arquivo de teste! Crie uma classe de teste que verifique se seu sistema de biblioteca funciona corretamente. Você escreverá métodos de teste que verificam vários cenários e informam se cada teste foi aprovado ou reprovado.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- Verifique se o empréstimo de um livro disponível é bem-sucedido e altera sua disponibilidadeTestBookBorrowUnavailable- Verifique se a tentativa de emprestar um livro que já está emprestado falha como esperadoTestUserBorrowingLimit- Verifique se os usuários não podem pegar emprestados mais de 3 livrosTestBookReturn- Verifique se a devolução de um livro emprestado funciona corretamenteTestSearchByAuthor- Verifique se a pesquisa por autor retorna os livros corretos
Cada método de teste deve retornar um valor booleano que indique se o teste foi aprovado. 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 a executar (1-5, correspondendo aos testes listados acima)
Para cada teste executado, imprima o resultado no formato:
{TestName}: {PASS|FAIL}Depois que todos os testes forem concluídos, imprima um resumo:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Por exemplo, se a entrada for:
3A saída deverá ser:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Outro exemplo, com todos os 5 testes:
5A saída deverá 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, a fim de garantir o isolamento. Assim, o estado de um teste não afetará outro. Pense em cada teste como uma verificação independente de um comportamento específico do seu sistema!
Experimente você mesmo
using System;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Leia o número de testes a executar
int numTests = Convert.ToInt32(Console.ReadLine());
// TODO: Crie um objeto LibraryTests e execute os primeiros numTests testes
}
}
}
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árioLógica do Sistema de EmpréstimosLINQ para BuscasInterface de Console / Interface de AdminTestes de Unidade (NUnit/xUnit)Pratique por conta própria: Compilador de C# online