Guia Completo: Testes de Integração em C# para Sistemas
Guia Completo: Sistema de Agendamento com EF Core e SQLite
Introdução
Imagine que você precise gerenciar agendas de serviços, reuniões ou compromissos de clientes. Um sistema de agendamento permite que você controle horários ocupados ou disponíveis, e garanta que não haja conflitos🤝 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. na hora de marcar um novo compromisso. Aqui, vamos criar um projeto simples utilizando EF Core e SQLite para armazenar todos os dados de agendamentos de forma prática e eficiente.
Tabela de Conteúdo🔗
1. Modelando Dados para🔄 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! Agendamentos
2. Configuração🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real. do Projeto
3. Configurando o EF Core🌍 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. com SQLite
4. Criando e📊 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. Aplicando Migrations
5. Operações CRUD🌍 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.
6. Consultas🎲 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. Personalizadas
7. Validações e Boas Práticas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados.
8. Dicas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. de Uso no Mundo Real
10. Conclusão
Modelando Dados para Agendamentos🔗
Para começar, precisamos de uma classe🏗️ 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. que represente um compromisso (Appointment). O model
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. deve conter as informações básicas para
🔄 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! que possamos gerenciar cada agendamento. Exemplo:
public class Appointment
{
public int AppointmentId { get; set; }
public string Titulo { get; set; }
public DateTime DataInicio { get; set; }
public DateTime DataFim { get; set; }
public bool Confirmado { get; set; }
}
- AppointmentId: Identificador único do agendamento.
- Título
🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades!: Uma breve descrição do compromisso (ex.: “Consulta
🎲 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. Dentista”).
- DataInicio / DataFim: Intervalo de tempo do agendamento.
- Confirmado: Indica se o agendamento está ou não confirmado.
Você pode adicionar📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. outros campos conforme a necessidade, como local, nome do cliente ou qualquer outra informação relevante.
Configuração do Projeto🔗
Passo 1: Crie um novo projeto Console App no Visual Studio🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE. (ou via CLI):
dotnet new console -n AgendamentoSystem
cd AgendamentoSystem
Passo 2: Instale os pacotes necessários:
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
👉 Dica rápida: O SQLite é perfeito para prototipagem - sem servidor necessário, apenas um arquivo .db
!
Configurando o EF Core com SQLite🔗
Para trabalhar com SQLite via EF Core🌍 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., instale o pacote Microsoft.EntityFrameworkCore.Sqlite.
No seu arquivo .csproj, você pode adicionar📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos.:
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="x.x.x" />
</ItemGroup>
Em seguida, crie uma classe🏗️ 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. de contexto:
using Microsoft.EntityFrameworkCore;
public class AgendaContext : DbContext
{
public DbSet<Appointment> Appointments { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// A string de conexão define o arquivo .db local que o SQLite usará
optionsBuilder.UseSqlite("Data Source=agenda.db");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Se desejar configurar restrições ou relacionamentos
base.OnModelCreating(modelBuilder);
}
}
- OnConfiguring: Define como queremos configurar o banco de dados (neste caso, SQLite).
- UseSqlite("Data Source=agenda.db"): Indica onde
🎲 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. o arquivo do banco será gerado.
Criando e Aplicando Migrations🔗
Com o contexto e as entidades prontos, podemos criar📡 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. as migrations:
- No terminal (ou Package Manager Console), execute
🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção.:
- dotnet ef migrations add
📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. Inicial
- dotnet ef database update
📝 SQL Básico: SELECT, INSERT, UPDATE e DELETE para Sobreviver!Aprenda os comandos cruciais de SQL para manipular dados em bancos relacionais com exemplos práticos, dicas e boas práticas para livrarias.
- dotnet ef migrations add
Isso vai criar📡 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. a estrutura de tabelas necessária no arquivo
agenda.db
. A migration🔄 Migrations: Evolua seu Banco sem Perder Dados!Aprenda como aplicar migrations com segurança usando Entity Framework Core para evoluir seu banco de dados sem perder dados. “Inicial” conterá as instruções para
🔄 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! montar a tabela de
Appointments
.
Operações CRUD🔗
Para mostrar como o EF Core🌍 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. lida com operações básicas, vamos exemplificar o CRUD
🌍 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.:
Criar Agendamento
public void CriarAgendamento(Appointment novo)
{
using var context = new AgendaContext();
context.Appointments.Add(novo);
context.SaveChanges();
}
Ler / Listar Agendamentos
public List<Appointment> ListarAgendamentos()
{
using var context = new AgendaContext();
return context.Appointments.ToList();
}
Atualizar Agendamento
public void AtualizarAgendamento(int id, string novoTitulo)
{
using var context = new AgendaContext();
var agendamento = context.Appointments.Find(id);
if (agendamento != null)
{
agendamento.Titulo = novoTitulo;
context.SaveChanges();
}
}
Deletar Agendamento
public void DeletarAgendamento(int id)
{
using var context = new AgendaContext();
var agendamento = context.Appointments.Find(id);
if (agendamento != null)
{
context.Appointments.Remove(agendamento);
context.SaveChanges();
}
}
- Find(id): Busca a entidade pelo valor da chave
🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. primária.
- Add
📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos.(), Remove
📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos.(): Operações padrão para incluir ou excluir dados
📝 SQL Básico: SELECT, INSERT, UPDATE e DELETE para Sobreviver!Aprenda os comandos cruciais de SQL para manipular dados em bancos relacionais com exemplos práticos, dicas e boas práticas para livrarias..
Consultas Personalizadas🔗
public List<Appointment> BuscarPorCliente(string nomeCliente)
{
return context.Agendamentos
.Where(a => a.Cliente.Contains(nomeCliente, StringComparison.OrdinalIgnoreCase))
.AsNoTracking() // Melhora performance em consultas somente leitura
.ToList();
}
⚡ Traduz para SQL:
SELECT * FROM Agendamentos
WHERE LOWER(Cliente) LIKE '%maria%'
Validações e Boas Práticas🔗
Antes de salvar:
public void ValidarAgendamento(Agendamento agendamento)
{
if (agendamento.DataHora < DateTime.Now)
throw new Exception("Data não pode ser no passado!");
if (string.IsNullOrEmpty(agendamento.Cliente))
throw new Exception("Cliente é obrigatório!");
// Verifica conflitos de horário
var existeConflito = context.Agendamentos
.Any(a => a.DataHora == agendamento.DataHora);
if (existeConflito)
throw new Exception("Já existe agendamento neste horário!");
}
🔒 Checklist de segurança:
1. Sempre valide dados antes do SaveChanges()
2. Use transações para🔄 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! operações críticas
3. Considere logging📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável. de operações sensíveis
Dicas de Uso no Mundo Real🔗
- Verificar Conflitos
🤝 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 Horários: Antes de salvar um novo agendamento, você pode verificar se existe algum agendamento que se sobrepõe às datas informadas. Exemplo:
bool ExisteConflito(DateTime inicio, DateTime fim)
{
using var context = new AgendaContext();
return context.Appointments.Any(a =>
(inicio < a.DataFim) && (fim > a.DataInicio));
}
- Eficiência
⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!Descubra como medir, diagnosticar e otimizar performance em aplicações .NET com dicas práticas e ferramentas essenciais para devs.: Armazenar dados localmente em SQLite pode ser muito útil para aplicações pequenas ou uso offline. Se a aplicação crescer, você pode migrar para um banco de dados de maior porte facilmente, pois o EF Core
🌍 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. permite trocar o provedor de banco de dados sem mudar a maior parte do código.
- Validação: Valide dados como DataFim sempre maior que DataInicio, e
📊 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. Titulo não vazio. Em aplicações reais, essas regras devem ser bem estritas para
🔄 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! evitar registros inválidos.
Desafio Prático🔗
Aprimore o sistema:
1. Adicione campo Status
(enum🧩 Enumerações: Dê Significado a Números com 'enum'!Descubra como as enumerações em C# eliminam números mágicos, melhoram a legibilidade e facilitam a manutenção do código, com exemplos claros e práticos.: Confirmado, Cancelado, Pendente)
2. Implemente soft delete📡 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. (não apagar registros, apenas marcar como excluído)
3. Crie relatório de horários mais populares por período
Dica de ouro:
// Exemplo de enum para status
public enum StatusAgendamento
{
Pendente,
Confirmado,
Cancelado
}
🎯 Meta profissional: Sistemas de agendamento são requisitados em diversas áreas - domine este padrão para aumentar seu portfólio!
Conclusão🔗
Com EF Core🌍 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. e SQLite, você constrói um sistema de agendamento de maneira simples e rápida. A estrutura de dados, as migrations e as operações CRUD
🌍 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. formam a base de um projeto sólido. Você pode evoluir essa aplicação para incluir regras de negócio mais complexas, validações robustas e até sincronização com outros serviços, tudo aproveitando os recursos que o ORM do .NET oferece para facilitar a manutenção e expansão do seu projeto.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/