Advertisement

BDD com Behat

by

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

framework PHP para BDD Behat permite que você teste suas aplicações PHP usando sentenças entedíveis por humanos para descrever os recursos e cenários sobre como suas aplicações deveria comportar-se, de modo que permita testar suas funcionalidades. Depois disso, podemos executar esses testes para ver se nossa aplicação se comporta como esperado. Passemos 15 minutos pelo processo de instalação do Behat e aprendamos como podemos testar o comportamento de nossas aplicações PHP usando o básico doframework.

Instalação

Para iniciarmos a testar nossas aplicações usando Behat, nós precisamos, primeiro, isntalá-lo localmente, em nossa máquina de desenvolvimento. Usarei o Composer, mas você pode dar uma olhada na documentação para outras maneiras.

Na sua aplicação (eu tenho uma app PHP em branco, chamadaphpbehat, que criei de antemão) crie um arquivo composer.json com o código a seguir para poder carregar o Behat:

{
"require": {
"behat/behat": "2.4.*@stable"
},
"minimim-stability": "dev",
"config": {
"bin-dir": "bin/"
}
}

Para finalizar a instalação, vá ao terminal e digite o seguinte comando:

composer update

Agora, deveremos ser capazes de rodar o comando bin/behat para trabalhar com a framework.

Criando Recursos

Nós sempre começamos criando um novo recurso. Um recurso é algo que podemos usar para descrever uma característica denossa aplicação para, então, implementá-la e fazer o teste passar.

Um recurso, de forma bem simples, consiste de:

  • Texto legível e entendível por humanos;
  • Usa a extensão .feature;
  • Contém o benefício, papel e o próprio recurso;
  • Pode conter uma lista de cenários.

É válido lembrar que não serei capaz de mostrar como testar todas as características de uma aplicação, uma vez que isso levaria muito tempo e tornaria o artigo gigantesco. Porém, o que posso fazer é mostrar a você como criar um recurso básico para, depois, você adaptá-lo de forma que ele funcione para a sua própria aplicação.

Testando a Classe Phpadder

Para não complicar o processo de aprendizado, criemos um simples arquivo Phpadder.php que conterá uma classe com alguns métodos que você poderá usar para somar dois números e mostrar o resultado.

class Phpadder {
 
private $a;
private $b;
private $sum;
 
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
 
public function add()
{
$this->sum = $this->a + $this->b;
}
 
public function display()
{
return $this->sum;
}
}

Esse código é o responsável pela criação da classe Phpadder. Nós temos algumas propriedades para guardar o primeiro ($a) e segundo ($b) números a serem adicionados, bem como a propriedade $sumpara guardar o resultado da soma.

Logo depois, nós temos o método construtor que inicializa nossas propriedades. Temos ainda um método add para somar os dois números. Finalmente, temos o método display para mostrar a soma dos dois números.

Recurso do Adder

Agora, vamos testar a classe Phpadder. Crie um novo arquivophpadder.feature e coloque o seguinte código:

# features/phpadder.feature Feature: adder In order to display the sum of two numbers As anybody I need to provide two numbers

Nós começamos dando o nome de adder ao nosso recurso. Depois, especificamos, em três linhas, o benefício, o papel e o recurso em si. Tudo deveria ser bem auto explicativo.

Agora que temos nosso recurso, comecemos a escrever nossos cenários.

Criando Cenários

Toda vez que criamos um recurso, podemos definir cenários que descrever como aquele recurso se comporta em determinadas condições. Os cenários seguem o mesmo layout básico do recurso, com um descrição, contexto, evento e resultado.

Vamos criar o cenário para testar nossa aplicação Phpadder:

Scenario: Mostre a soma dos dois números inseridos Given I have the number 50 and the number 25 When I add them together Then I should get 75

Nós começamos com a descrição do nosso cenários, depois listamos que devemos começar com dois números, 50 e 25, e que, quando somados, eles devem totalizar 75.

Você também pode ter vários contextos, eventos e retorno, bem como usar as seguintes palavras-chave: And e But (por isso o cenário e o recurso estão, em sua maior parte, em inglês, ainda). Aqui está uma versão modificado do cenário anterior, onde usamos a palavra-chaveAnd:

Scenario: Mostre a soma de dois números inseridos Given I have the number 50 and the number 25 And I have a third number of 25 When I add them together Then I should get 100

Criando Definições de Etapas

Um "passo", nada mais é que uma função PHP que é feita de a partir de uma palavra-chave, uma expressãor egular e um função callback. Cada sentença em seu cenário equivalerá a um passo. Esses passos definem o que deveria acontecer quando uma de suas sentenças forem chamadas dentro do cenário. Você guarda todos os seus passos dentro de um arquivo features/bootstrap/FeatureContext.php.

O Passo "Given"

Em nosso arquivo FeatureContext.php (você talvez precise criá-lo), nós precisamos escrever um passo para cada uma de nossas sentenças, usando seu nome como o nome da função. Nós começaremos com a sentença Given I have the number:

# features/boostrap/FeaturesContext.php
 
require ("Phpadder.php");
 
use Behat\Behat\Context\BehatContext,
Behat\Behat\Exception\PendingException;
 
use Behat\Gherkin\Node\PuStringNode,
Behat\Gherking\Node\TableNode;
 
class FeatureContext extends BehatContext
{
private $Adder;
 
/**
* @Given /^I have the number (\d+) and the number (\d+)$/
*/
public function iHaveTheNumberAndTheNumber($a, $b)
{
$this->Adder = new Phpadder($a, $b);
}
}

Primeiro, nós criamos nosso novo arquivo PHP, fazemos a requisição do arquivo Phpadder.php (o arquivo que estamos testando), e, então, nós importamos algumas classes do Behat, a partir do uso das sentençasuse.

Depois, criamos nossa classe FeatureContext e a fazemos estender a classe BehatContext.

Nossa classe tem somente uma propriedade, $Adder, que guardará o objeto Phpadder.

Por fim, nós criamos nosso método para nosso primeiro passo, usando o mesmo nome do passo como nome do método. Nosso passo tem uma expressão regular, que fica nos comentários do método. Essa expressão regular é usada para comparar o passo atual com sentença do cenário correta. Dentro do método, nós só atribuímos o novo objeto Phpadder à nossa propriedade $this->Adder para que todos os outros métodos tenham acesso ao mesmo objeto Phpadder.

Você provavelmente percebey a palavra-chave @Given dentro dos comentários da função. Isso, na verdade, é uma anotação que permite que os diferentes tipos de passos sejam identificados. Você pode usar @Given@When e @Then.

Agora, só precisamos escrever os outros dois passos.

O Passo "When"

/**
* @When /^I add them together$/
*/
public function iAddThemTogether()
{
$this->Adder->add();
}

Esse passo, simplesmente, usa o método add do nosso objeto$this->Adder para somar dois números.

O Passo "Then"

/**
* @Then /^I should get (\d+)$/
*/
public function iShouldGet($sum)
{
if ($this->Adder->sum != $sum) {
throw new Exception("Valor da soma atual: " . $this->Adder->sum);
}
$this->Adder->display();
}

Esse passo começa verificando se o valor atual da soma (obetido usando a propriedade $sum do nosso objeto $this->Addernão é igual ao valor esperado da soma. Se essa condição for verdadeira, significa que precisamos mandar o Behat mostrar um erro. Para fazer isso, simplesmente lançamos uma nova exceção, juntamente da mensagem que mostra o valor atual da soma que queremos comparar. Por outro lado, se for falso, nós podemos chamar o método display.

Hora de executar os testes.

Executando os testes

Agora que temos nossos recursos, cenários e passos, todos criados, podemos executar os testes usando o seguinte comando:

bin/behat

Você deveria obter as seguintes telas de mensagem de sucesso em seu terminal:

Tela de execuo dos testes no terminal

Você pode garantir que seus testes estão rodando corretamente, simplesmente, mudando alguma coisa no seu arquivo Phpadder.phppara que ele não rode da forma que esperamos que ele execute. Por exemplo, se mudarmos o método add para usar a subtração ao invés da adição, desse jeito (linha 3):

public function add()
{
$this->sum = $this->a - $this->b;
}

E, então, re-executar nossos testes com bin/behat, você verá que, no terminal, nós teremos testes falhos, porque não temos mais um método que adiciona números, mas, sim, que os subtrai:

Tela execuo dos testes no terminal falhando

Conclusão

Resumidamente, você pode seguir o seguinte processo para testar suas apps PHP usando Behat:

  1. Defina um Recurso
  2. Defina um Cenário
  3. Defina os Passos
  4. Execute os testes usando bin/behat

Assim, com essa pouca quantidade de código, nós devemos ter um conhecimento básico sobre como trabalhar com o Behatpara testar nossas aplicações PHP. Para maiores informações sobre como usar o Behat, por favor, veja a documentação

Advertisement