Tecnologia

Introdução ao BDD

Por: , janeiro 23, 2014

Por: Guilherme de Oliveira Vicente

1 – Introdução

Desenvolvimento Guiado por Comportamento, do inglês Behavior Driven Development, comumente conhecido pela sigla BDD é uma metodologia de desenvolvimento ágil que estimula a participação de todos os membros da equipe, desenvolvedores, analistas e gestores do projeto.

Utilizando o conceito de linguagem ubíqua onde o foco é o fluxo em que o código deve ser escrito, não gerando a necessidade de conhecimentos técnicos, permitindo então que qualquer pessoa com conhecimento técnico ou não possa montar os cenários de teste.

Existem alguns frameworks que auxiliam no desenvolvimento de testes com BDD (uma lista dos principais será disponibilizada no final deste post), entretanto iniciativas recentes encorajam seu desenvolvimento utilizando somente a linguagem de programação pura, veja mais neste link.

Dentre as praticas de BDD temos:

  1. Estimular a participação de todas as partes no processo.

  2. Desenvolvimento de fora para dentro, para mais informações acesse esse link.

  3. Para desenvolver uma funcionalidade, utiliza-se exemplos de seu comportamento.

  4. Automatização dos exemplos e das estórias de usuário.

 

2 – Princípio e metodologia

No BDD há um princípio, uma metodologia:

  • Dado que (Given)

  • Quando (When)

  • Então (Then)

Essa metodologia não é obrigatória, mas é largamente utilizada pelos desenvolvedores do mundo todo que adotam o BDD.

É baseado nesses três princípios que os cenários são desenvolvidos. Assim como citado no inicio do post, adotarei aqui também uma dinâmica utilizando o Junit para validar as ações e o Selenium para automatizar o browser, acredito que utilizando algum framework de BDD poderemos perder o foco do artigo (em um post futuro podemos dissecar melhor algum framework, então não deixe de comentar dando uma sugestão). Abaixo temos um exemplo escrito em Java de um cenário básico:

package story;
import org.junit.Test;
public class LoginStory extends StoryBase {
	@Test
	public void authentication() {
		this.given.accessToTheLoginPage();
		this.when.toAuthenticate("guilherme", "g7h8i9q1w2e3");
		this.then.myNameAppearOnTheScreen("Guilherme");
	}
}

No exemplo acima nos colocamos como premissa que o sistema está no ar, bem como todos os serviços e o banco estão operantes.

Neste caso estamos implementando o cenário de login de um usuário, primeiramente estabelecemos uma situação, “Dado que” (Given), acessamos a página de login (accessTheLoginPage):

 

package step;
import org.openqa.selenium.WebDriver;
public class GivenSteps extends StepBase {
	public GivenSteps() {
	}
	public GivenSteps(WebDriver driver) {
		super(driver);
	}
	public void accessTheLoginPage() {
		navegateTo("http://localhost:8080/sys/login.html");
	}
}

 

Estabelecemos então uma ação, “Quando” (When), autenticamos com o usuário (toAuthenticate) “guilherme” e a senha “g7h8i9q1w2e3”:

 

package step;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class WhenSteps extends StepBase {
	public WhenSteps() {
	}
	public WhenSteps(WebDriver driver) {
		super(driver);
	}
	public void toAuthenticate(String userName, String passWord) {
		getDriver().findElement(By.id("nome")).clear();
		getDriver().findElement(By.id("nome")).sendKeys(userName);
		getDriver().findElement(By.id("senha")).clear();
		getDriver().findElement(By.id("senha")).sendKeys(passWord);
		getDriver().findElement(By.id("enviar")).click();
	}
}

 

E verificamos por fim, “Então” (Then) se o nome de usuário aparece na tela principal (myNameAppearOnTheScreen), indicando que a autenticação de usuário foi feita com sucesso:

package step;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class ThenSteps extends StepBase {
	public ThenSteps() {
	}
	public ThenSteps(WebDriver driver) {
		super(driver);
	}
	public void myNameAppearOnTheScreen(String nomeUsuario) {
		Assert.assertEquals(nomeUsuario, getDriver().
				findElement(By.id("usuarioNome")).getText());
	}
}

Para aqueles que não estão familiarizados com o framework Selenium, utilizado para realizar o controle e automatização das ações em paginas web acesse esse link para mais informações.

No desenvolvimento baseado em BDD há um outro princípio largamente utilizado dentre os desenvolvedores do mundo todo, a maioria adota a implementação da interface de usuário primeiro, pois é baseado na interface que as funcionalidades são contadas e pontuadas, dessa forma os fluxos descritos no desenvolvimento podem ser acompanhados pelas interfaces.


Em BDD outra prática fortemente recomendada é a geração de uma documentação baseada no comportamento dos testes, auxiliando os desenvolvedores, analistas e gestores na organização dos requisitos e correção dos defeitos gerados ao longo do desenvolvimento.

No caso do Java podemos criar mecanismos de escrita em arquivo, facilitando a geração dos relatórios.

3 – Vantagens da documentação

 

Similar ao TDD segue-se um fluxo:

  • Escrita do teste.

  • Execução dos testes perante falha.

  • Implementação da funcionalidade.

  • Execução ou execuções até o(s) teste(s) passarem.

  • Refatoração.

O que muda é que a documentação gerada pode auxiliar na identificação dos erros e serve no final do desenvolvimento como uma documentação das funcionalidades implementadas, dessa forma não é necessário estar sempre atualizando os documentos de requisitos, estórias de usuário e etc… no final do projeto, já que todas se mantiveram atualizadas ao longo de seu desenvolvimento.

 

4 – Lista de alguns frameworks dentre as as linguagens mais comuns

 

5 – Referências

 

6 – Ambiente de desenvolvimento

Para a confecção do exemplo montei um ambiente com um projeto Java EE no Apache Maven, utilizei a IDE Eclipse Juno juntamente com os frameworks Junit e Selenium. Os exemplos foram desenvolvidos em Java e para simular um cenário real criei dois scripts em html sem validação alguma, meu intuito é somente exemplificar o cenário, juntamente utilizei o Apache TomCat para o acesso.

Para obter os códigos acesse os links:

Não se esqueça de deixar um comentário caso tenha alguma dúvida ou sugestão para este post ou posts futuros. Até a próxima e bons estudos!

 

  • Receba nosso conteúdo em primeira mão.