Testes de Unidade: Segurança no Tratamento de Erros

Imagine a seguinte cena: você fez uma mudança no código para resolver um pequeno bug e, sem perceber, acabou adicionando um novo problema🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. que só foi descoberto em produção. Para evitar esse pesadelo, testes de unidade focados em tratamento de erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. são um verdadeiro cinturão de segurança🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real.. Neste artigo, você vai aprender como escrever testes que garantem a robustez do seu código mesmo em cenários de falhas.

Erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. são inevitáveis, mas catástrofes são opcionais. Testes de unidade para tratamento de erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. são como simulados de incêndio para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! seu código: preparam você para o pior, garantindo que quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. algo falhar, seu sistema reagirá com elegância (ou pelo menos sem explodir). Vamos aprender a criar testes que forçam erros e validam se suas defesas estão funcionando.

📌 Tabela de Conteúdo🔗

Por que Testar Tratamento de Erros?🔗

Mesmo o código mais bem escrito está sujeito a situações imprevistas: entradas de dados inválidas, indisponibilidade de recursos📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. ou comportamentos fora do normal. Sem testes, esses cenários podem passar despercebidos, gerando falhas em produção. Quando você testa o tratamento de erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades., está garantindo que:

Imagine um sistema bancário que só foi testado para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! transferências bem-sucedidas. No primeiro erro de conexão com o banco de dados: 💥 caos total. Testar cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. de erro:

1. Valida comportamentos esperados em condições anormais

2. Garante que exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. não vazem para o usuário final

3. Documenta como o sistema deve reagir a falhas

Exemplo real: Um método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. que lê arquivos deve ser testado para:

// Cenário de sucesso (arquivo existe)
var content = ReadFile("dados.csv");
// Cenário de erro (arquivo não encontrado)
Assert.Throws<FileNotFoundException>(() => ReadFile("arquivo_fantasma.txt"));

Abordagens para Testar Erros e Exceções🔗

Para cobrir o máximo🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. de casos possíveis, é importante simular situações de falha de diferentes tipos. Veja algumas abordagens:

1. VerificaçãoComo Assegurar Validação e Cobertura de Código em Projetos LINQComo Assegurar Validação e Cobertura de Código em Projetos LINQAprenda estratégias avançadas para testar consultas LINQ, garantindo cobertura de código e confiabilidade com ferramentas e práticas recomendadas. de Mensagens de Erro: Confirme se as mensagens emitidas pelo sistema são claras o bastante e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. mantêm um padrão.

2. Teste de Exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código.: Garanta que o código exploda (dispare uma exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código.) quando algo realmente grave ocorrer, ou que ele não dispare indevidamente se a condição de erro🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. não se justificar.

3. Entradas Inválidas e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Borda: Verifique como o sistema se comporta com dados aguardados, como também com dados fora do padrão (limites máximos, valores🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. vazios, tipos diferentes etc.).

Criando Cenários de Falha Controlados🔗

Para testar o tratamento de erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. de forma controlada, você pode:

Exemplo de Teste de Unidade para Lidar com Erros🔗

Abaixo está um exemplo genérico (usando o estilo de asserção que muitos frameworks oferecem) para testar se um método lança uma exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. quando recebe um valor nulo indevido:

public class Calculadora
{
    public int SomarValores(List<int> valores)
    {
        if (valores == null)
            throw new ArgumentNullException(nameof(valores));
        var soma = 0;
        foreach(var valor in valores)
        {
            soma += valor;
        }
        return soma;
    }
}
// Teste de Unidade (exemplo genérico)
public class CalculadoraTests
{
    // Testa se o método lança exceção quando a lista é nula
    [Fact]
    public void SomarValores_ListaNula_DisparaArgumentNullException()
    {
        // Arrange
        var calc = new Calculadora();
        // Act & Assert
        Assert.Throws<ArgumentNullException>(() => calc.SomarValores(null));
    }
    // Testa comportamento normal com valores válidos
    [Fact]
    public void SomarValores_ListaValida_RetornaSomaCorreta()
    {
        // Arrange
        var calc = new Calculadora();
        var valores = new List<int> {1, 2, 3};
        // Act
        var resultado = calc.SomarValores(valores);
        // Assert
        Assert.Equal(6, resultado);
    }
}

O que observar nesse teste?

Dicas para Escrever Testes Eficientes🔗

1. Mantenha os Testes Simples: Um teste deve checar apenas uma condição ou caminho de falha por vez. Isso facilita a manutenção e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. a compreensão do que está sendo validado.

2. Nomes Descritivos: Indique claramente o cenário e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. o resultado esperado no nome do teste.

3. Use Dados Anômalos: Teste entradas “esquisitas”, como lista vazia, strings📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance. com caracteres especiais ou números muito grandes.

4. Crie Categorias de Teste: Separe testes de erros locais (que não dependem de nada externo) de cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. que envolvem outras camadas do sistema.

5. Automatize: Certifique-se de que esses testes rodem sempre que o sistema for buildado ou integrado, para pegar regressões📈 Regression: Previsões Numéricas com Redes Neurais!📈 Regression: Previsões Numéricas com Redes Neurais!Descubra como utilizar redes neurais no ML.NET para prever valores, dos imóveis a vendas, com exemplos práticos e técnicas avançadas de regressão. rapidamente.

Estruturando Testes para Exceções🔗

🧪 Testando exceções síncronas

[Fact]
public void Dividir_QuandoDivisorZero_DeveLancarDivideByZeroException()
{
    // Arrange
    var calculadora = new Calculadora();
    // Act & Assert
    var excecao = Assert.Throws<DivideByZeroException>(() => calculadora.Dividir(10, 0));
    Assert.Equal("Divisor não pode ser zero", excecao.Message);
}

⚡ Testando exceções assíncronas

[Fact]
public async Task ProcessarPagamentoAsync_QuandoCartaoInvalido_DeveLancarExcecao()
{
    // Arrange
    var servico = new PagamentoService();
    // Act & Assert
    await Assert.ThrowsAsync<PaymentFailedException>(
        async () => await servico.ProcessarPagamentoAsync("cartao_invalido"));
}

Mockando Dependências que Geram Erros🔗

Cenário: Testar como seu código reage quando um repositório🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. de banco de dados falha.

[Fact]
public void BuscarUsuario_QuandoRepositorioFalha_DeveLancarDatabaseException()
{
    // Arrange
    var mockRepo = new Mock<IUserRepository>();
    mockRepo.Setup(r => r.GetUser(It.IsAny<int>()))
            .Throws(new DatabaseConnectionException("Conexão perdida"));
    var userService = new UserService(mockRepo.Object);
    // Act & Assert
    var ex = Assert.Throws<DatabaseConnectionException>(() => userService.BuscarUsuario(123));
    Assert.Contains("Conexão perdida", ex.Message);
}

Testando Mensagens e Códigos de Erro🔗

Erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. precisam ser úteis para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! debug. Teste não só o tipo da exceção, mas também suas propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção.:

[Fact]
public void ValidarIdade_QuandoMenorQue18_DeveLancarExcecaoComDetalhes()
{
    // Arrange
    var validator = new AgeValidator();
    // Act
    var ex = Assert.Throws<BusinessRuleException>(() => validator.ValidarIdade(17));
    // Assert
    Assert.Equal("IDADE_INVALIDA", ex.ErrorCode);
    Assert.Equal(400, ex.StatusCode);
    Assert.Contains("idade mínima é 18", ex.Message);
}

Boas Práticas para Testes de Erro🔗

1. Cubra todos os catch

Cada bloco try/catch💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. no seu código precisa de um teste que force a entrada no catch

2. Teste mensagens e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. códigos

Erros genéricosUso de generics e reflection com AOT: Dicas e truquesUso de generics e reflection com AOT: Dicas e truquesDescubra como otimizar performance e segurança ao utilizar generics e reflection em aplicações .NET Native AOT, evitando erros em tempo de execução. dificultam a solução de problemas

3. Use Assert.Throws ao invés de try/catch💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. em testes

Mais expressivo e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. evite falsos positivos

4. Mocke comportamentos de erro em dependências externas🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro.

Banco de dados, APIs🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real., sistemas de arquivos

5. Teste falhas em operações assíncronasRepositório Assíncrono: Como Estruturar o Acesso a DadosRepositório Assíncrono: Como Estruturar o Acesso a DadosDescubra como implementar um repositório assíncrono em C# seguindo boas práticas de separação de responsabilidades e eficiência de dados.

Use Assert.ThrowsAsync

Projeto Prático: Testando um Serviço de Validação🔗

Objetivo: Criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um UserService com validaçõesComo Assegurar Validação e Cobertura de Código em Projetos LINQComo Assegurar Validação e Cobertura de Código em Projetos LINQAprenda estratégias avançadas para testar consultas LINQ, garantindo cobertura de código e confiabilidade com ferramentas e práticas recomendadas. e testar todos os cenários de erro.

public class UserService
{
    public void RegisterUser(User user)
    {
        if (user.Age < 18)
            throw new ValidationException("Usuário menor de idade", "UNDERAGE");
        if (string.IsNullOrEmpty(user.Email))
            throw new ValidationException("Email inválido", "INVALID_EMAIL");
    }
}
// TESTES
[Theory]
[InlineData(17, "UNDERAGE")]
[InlineData(20, "INVALID_EMAIL")]
public void RegisterUser_QuandoDadosInvalidos_DeveLancarExcecaoCorreta(int age, string expectedErrorCode)
{
    var service = new UserService();
    var user = new User { Age = age, Email = age == 20 ? "" : "test@test.com" };
    var ex = Assert.Throws<ValidationException>(() => service.RegisterUser(user));
    Assert.Equal(expectedErrorCode, ex.ErrorCode);
}

Desafio: Sistema de Upload de Arquivos🔗

Crie um FileUploader que:

1. Lança InvalidFileTypeException para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! arquivos não PDF

2. Lança FileSizeExceededException para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! arquivos > 10MB

3. Teste todos os cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. de erro com mocks de IFileSystem

Dica: Use [Theory] com [InlineData] para múltiplos cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.!

Conclusão🔗

Ter testes de unidade especificamente focados em tratamento de erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. é essencial para garantir a saúde a longo prazo de qualquer aplicação. Eles funcionam como um verificador automático que impede falhas críticas de chegarem à produção. Invista tempo em planejar e escrever testes claros, abordando cenários mais prováveis (e também os mais improváveis!), e você terá um código mais resiliente e confiável.

Testar tratamento de erros🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. é como colocar airbags no seu código – você espera nunca precisar, mas quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. precisar, vai agradecer por ter feito. Comece criando testes para os erros mais críticos do seu sistema e expanda gradualmente. Lembre-se: um erro🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. testado é um desastre evitado! 🛡️

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo