Desenvolvimento

14 fev, 2019

Utilizando BDD com .NET

Publicidade

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.

Adicionando novos projetos
Projeto para testes
Projeto Startup

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’:

Instalando pacote 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:

Instalação do pacote SpecFlow

Após a instalação do pacote, vamos configurar o tipo de projeto de testes no arquivo App.config.

Configuração do tipo de projeto de testes

Agora, daremos início à escrita das funcionalidades a serem testadas. Para isso, devemos adicionar um novo arquivo .feature:

Adicionando novo item
Adicionando arquivo SpecFlow Feature File

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:

Código esperado pelo SpecFlow

Com isso, basta copiar o código e criar um novo item do tipo Steps:

Criando arquivo SpecFlow Step Definition

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.

Referências