O que é BDD?
Behaviour Driven Development é uma técnica de desenvolvimento ágil, que visa a colaboração entre desenvolvedores, QAs e analistas, onde o foco está na documentação do comportamento do software. Além disso, melhora a comunicação de toda a equipe.
Por que utilizar BDD?
BDD seria uma evolução do TDD, pois com ele você escreve os cenários de teste antes de desenvolver algum código. Sendo assim, serve para criar testes e integrar regras de negócios com a linguagem de programação. Seu foco é a linguagem e as interações utilizadas no processo de desenvolvimento de software.
Ele também permite que analistas e QAs escrevam testes e regras sem saber programar, contribuindo para os desenvolvedores, onde eles focam na criação de um código para atender ao cenário.
Objetivo
Criar uma documentação utilizando os princípios do BDD e integrá-lo a um projeto feito em .NET.
Criação do projeto
Para iniciar, abra o Visual Studio (de preferência o 2017) e vá em ‘Arquivo’ > ‘Novo’ > Projeto’. Selecione uma Solution em branco:
Com a Solution criada, adicione dois projetos: um Console Application e outro Unit Test.
Desenvolvimento do código
O intuito do projeto é calcular o quanto de horas extras uma pessoa ganhará. No projeto Console Application devemos criar uma classe chamada ‘CalculoHora’ – nela ficarão todas as regras de negócio do sistema.
Classe contendo regras de negócio do projeto:
public class CalculoHora
{
private double _salario;
public CalculoHora(double salario) =>
_salario = salario;
public CalculoHora() =>
_salario = 3000;
public double CalculaSalarioHora() =>
_salario / 220;
public double CalculaValorHoraExtraNormal() =>
CalculaSalarioHora() * 1.5;
public double CalculaValorHoraExtraRemunerada() =>
CalculaSalarioHora() * 2;
public double CalculaHoraExtraNormal(double quantidade) =>
CalculaValorHoraExtraNormal() * quantidade;
public double CalculaHoraExtraRemunerada(double quantidade) =>
CalculaValorHoraExtraRemunerada() * quantidade;
}
Após criação da classe, utilizamos a mesma na classe principal do projeto, que é ‘Program.cs’:
Classe principal do projeto:
static void Main(string[] args)
{
double salario = 0;
double quantidadeHorasExtra = 0;
double quantidadeHorasExtraRemunerada = 0;
Console.Write("Valor do salário: ");
salario = Convert.ToDouble(Console.ReadLine());
Console.Write("Horas extras trabalhadas em domingos e/ou feriados: ");
quantidadeHorasExtra = Convert.ToDouble(Console.ReadLine());
Console.Write("Horas extras trabalhadas em dias normais: ");
quantidadeHorasExtraRemunerada = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("-----------------------");
var calculoHoraExtra = new CalculoHora(salario);
Console.WriteLine($"Valor por hora: {calculoHoraExtra.CalculaSalarioHora().ToString("C2")}");
Console.WriteLine($"Valor por hora extra: {calculoHoraExtra.CalculaValorHoraExtraNormal().ToString("C2")}");
Console.WriteLine($"Valor por hora extra remunerada: {calculoHoraExtra.CalculaValorHoraExtraRemunerada().ToString("C2")}");
Console.WriteLine("-----------------------");
var horaExtraNormal = calculoHoraExtra.CalculaHoraExtraNormal(quantidadeHorasExtra);
var horaExtraRemunerada = calculoHoraExtra.CalculaHoraExtraRemunerada(quantidadeHorasExtraRemunerada);
Console.WriteLine($"Total de horas extras normais: {horaExtraNormal.ToString("C2")}");
Console.WriteLine($"Total de horas extras remuneradas: {horaExtraRemunerada.ToString("C2")}");
Console.WriteLine($"Total de horas extras: {(horaExtraNormal + horaExtraRemunerada).ToString("C2")}");
Console.ReadKey();
}
Implantação dos testes
Para realizar os testes com base no BDD vamos utilizar um framework chamado SpecFlow. Sendo assim, devemos instalar uma extensão do mesmo no Visual Studio (como o exemplo foi realizado no 2017, utiliza-se o pacote referente). Para isso, vá em ‘Ferramentas’ > ‘Extensões e Atualizações’, selecione a opção ‘Online’ e digite na barra de pesquisa ‘SpecFlow’:
Para instalar completamente, devemos fechar o Visual Studio (após aparecer uma tarja amarela no canto inferior).
Depois disso, precisamos instalar o pacote SpecFlow no projeto de testes:
Após a instalação do pacote, vamos configurar o tipo de projeto de testes no arquivo App.config.
Agora, daremos início à escrita das funcionalidades a serem testadas. Para isso, devemos adicionar um novo arquivo .feature:
No arquivo criado escreva o seguinte:
#language: pt-br
Funcionalidade: Cálculo de hora extra
Para quanto vou ganhar de horas extras
Enquanto funcionário
Eu gostaria de calcular o adicional de horas extras
Cenário: Quantidade de 5 horas extras normais
Dado que estou consumindo o método CalculaHoraExtraNormal
E preencho o campo 'quantidade' com o valor 5
Quando executo a aplicação
Então vejo '102,27'
- Observação: ao informar a linguagem do arquivo na primeira linha ‘pt-br’, o mesmo consegue ativar Intelisense e syntax highlighting para a linguagem referente e apresenta as opções existentes.
Terminado de escrever, executamos o teste: ‘Teste’, ‘Executar’ e ‘Todos os testes’
Após a execução, será gerado um arquivo .cs e apresentará um erro, e o próprio SpecFlow exibirá o código que o mesmo espera executar:
Com isso, basta copiar o código e criar um novo item do tipo Steps:
Criação da classe Steps:
[Binding]
public class StepDefinitions
{
private CalculoHora calculoHora;
private double quantidade;
private Decimal valor;
[Given(@"que estou consumindo o método CalculaHoraExtraNormal")]
public void DadoQueEstouConsumindoOMetodoCalculaHoraExtraNormal()
{
calculoHora = new CalculoHora();
}
[Given(@"preencho o campo '(.*)' com o valor (.*)")]
public void DadoPreenchoOCampoComOValor(string quantidade0, int p1)
{
quantidade = p1;
}
[When(@"executo a aplicação")]
public void QuandoExecutoAAplicacao()
{
valor = (Decimal)calculoHora.CalculaHoraExtraNormal(quantidade);
}
[Then(@"vejo '(.*)'")]
public void EntaoVejo(Decimal p0)
{
Assert.AreEqual(p0.ToString("N2"), valor.ToString("N2"));
}
}
O projeto pode ser encontrado no repositório do GitHub:
Conclusão
Nota-se que, com pouco conteúdo podemos gerar uma documentação útil para o QA, Analistas e, inclusive, para o desenvolvedor – não necessitando, em momento algum, o entendimento de alguma linguagem de programação – o que infere na escrita pura do BDD.
Além disso, elimina a utilização de demais arquivos como word e pdf, mantendo tudo dentro de um projeto e, garantindo estar sempre atualizado.