Guias
Guia de boas práticas de levantamento de requisitos usando EPE
Versão do documento: 2.0, 21/09/2018
Introdução
Imagine uma empresa onde trabalhem pessoas de toda a parte do mundo. Para você se comunicar, provavelmente a empresa estabeleceu um idioma comum, por exemplo, o inglês. Parece fácil né? Mas se fosse, não haveria inúmeros problemas por causa da comunicação, principalmente em desenvolvimento de software, onde o cliente usa uma linguagem diferente do líder técnico, que por sua vez fala diferente dos analistas de testes. Há muito ruído na comunicação, mesmo todas essas pessoas falando o mesmo idioma.
É nesse momento que entra o BDD - Behavior Driven Development. É uma técnica de desenvolvimento, onde a comunicação é através de um vocabulário pequeno e comum, diminuindo a distância entre o negócio (cliente ou Product Owner) e a equipe de T.I. (Arquitetos, Programadores, Analistas de Testes). Nesta técnica as atividades de desenvolvimento se iniciam com os requisitos e a visão do cliente até o detalhamento dos artefatos de software (ciclo outside-in). = Foco no por que da criação do código e não em detalhes técnicos. Em BDD, um programador, ou profissional do setor de qualidade ou até mesmo o cliente podem escrever os testes que basicamente são compostos em duas partes, a definição da funcionalidade a ser implementada (User storie) e os cenários de uso que irão validar este requisito.
Quais os benefícios reais do BDD?
-
Evitam-se erros de compreensão e interpretação das histórias de usuário;
-
Os que antes eram requisitos funcionais e requisitos não funcionais, são transformados em comportamentos funcionais do software e critérios de aceitação;
-
Fornece uma forma de comunicação (vocabulários) comum a todos envolvidos, facilitando a compreensão por parte de todos;
-
A equipe fica ciente de que os comportamentos serão aceitos pelos usuários com antecedência;
-
A equipe entende como os comportamentos são relacionados, evitando confusão.
O que é cucumber?
É uma ferramenta para que possibilita a prática do BDD. Com ele, as funcionalidades do sistema são escritas em arquivos de texto e em uma linguagem de domínio específico chamada Gherkin, muito semelhante à linguagem natural, mas que contém algumas palavras chaves. Vale destacar que Gherkin aceita mais de 40 línguas.
A automação realizada com a utilização dos testes de BDD é composta, basicamente, por arquivos que especificam as funcionalidades (também denominada como “features”) e por arquivos de definição de passos (“steps”). Os arquivos com as funcionalidades são compostos por cenários, que exemplificam uma regra de negócio do sistema descrevendo o comportamento do sistema.
Linguagem Gherkin
Gherkin é uma linguagem criada especificamente para a descrição de comportamentos. Isto lhe dá a habilidade de remover detalhes lógicos dos testes de comportamento. O Gherkin serve como documentação do seu projeto, bem como para testes automatizados.
É uma linguagem orientada a espaços, ela usa indentação para definir a estrutura. Os fins de linha encerram as declarações (Passos) e espaços ou tabs também podem ser usados para indentação. Finalmente, todas as linhas em Gherkin iniciam com uma palavra chave especial:
Especificação por Exemplos
A Especificação por Exemplo é baseada nos conceitos trazidos pelo BDD, trata-se de uma nova abordagem para documentar requisitos onde estes são descritos baseados no comportamento e saídas geradas pelo sistema, utilizando uma linguagem simples que pode ser entendida por todos os envolvidos no projeto.
Bem como a especificação de caso de uso, a Especificação por Exemplos é baseada na visão do usuário, porém é conduzida para que seja possível reproduzir a realização os testes do sistema, simulando os comportamentos que devem ser gerados ao testá-lo, após a implementação.
Na especificação por exemplos são definidas algumas palavras-chave oriundas da sintaxe Gherkin, que permitem a conversão da especificação em scripts de teste e demais automatizações:
| Palavra-Chave | Função |
|---|---|
Funcionalidade |
Descreve o para quem, o porque e o para que serve a funcionalidade. |
Contexto |
Define as condições iniciais para a execução de uma funcionalidade. Dados que devem estar previamente cadastrados no banco de dados, itens que devem previamente terem sido acessados ou configurados. |
Cenário |
Permite descrever um fluxo que será executado e poderá retornar apenas uma resposta para o usuário. |
Esquema do Cenário |
Permite descrever um fluxo que será executado e poderá retornar respostas diferentes para o usuário de acordo com um estado ou condição no sistema. |
Exemplos |
Permite definir para um Esquema do Cenário os diversos valores a serem utilizados na repetição dos testes. |
Além disso, toda funcionalidade descrita deverá ter um ou mais cenários, que são exemplos de casos específicos de utilização da funcionalidade. Cada cenário consiste em um título e uma sequência de passos que representam as interações do usuário com o software.
Na língua portuguesa, considerando a sintaxe Gherkin, são utilizados os seguintes passos:
| Passo | Função |
|---|---|
Dado/Dados Dada/Dadas |
Especifica as pré-condições e/ou passos anteriores para que ocorra a ação de interesse do cenário. |
Quando |
Especifica o evento que deve ocorrer para que o cenário seja executado. Sempre é usado para representar uma ação do usuário. |
Então |
Especifica as pós-condições, expectativas a respeito dos resultados da execução dos eventos do cenário. Será utilizado sempre após a ultima ação do usuário e poderá ser seguido de um ou mais conectivos “E”. |
E |
Permite dar continuidade a qualquer dos seguintes passos:
|
É importante ressaltar, que segundo a documentação oficial do cucumber, é altamente recomendável que você tenha apenas um único passo Quando por cenário, sendo assim não é recomendável que haja um passo E após o passo Quando. Quando a especificação sugere que seja necessário mais que um passo Quando, geralmente é um sinal de que você deve dividir o cenário em dois ou mais cenários.
Na imagem a seguir, está sendo demostrado uma feature de Especificação por Exemplo.
Funcionalidade
Identifica um conjunto de comportamentos do sistema (como incluir ou alterar um cadastro).
Forma de utilização
-
Sempre no início da especificação, após o cabeçalho;
-
Declaração obrigatória;
-
Sempre iniciada com letra maiúscula seguida de dois pontos (:) ;
-
Após sua declaração, deve ser descrito (na mesma linha) qual funcionalidade, fluxo transacional ou ação, descrita no infinitivo (Incluir, Alterar, Excluir, Visualizar, Homologar, etc) será tratada.
Ex: Funcionalidade: Incluir Tipo de Assunto
-
Logo após a declaração da funcionalidade, deve-se fazer uma breve descrição de quem poderá ter acesso a ela, o que ela fará e qual a sua finalidade (para que):
-
Quem Ex: Como um usuário que tenha permissão
-
O que? Ex: Quero incluir uma empresa
-
Para que? Ex: Para utilização dos dados cadastrados
-
Obs: É aconselhável que na declaração da funcionalidade, sejam inseridas informações na qual seja possível entender o motivo da funcionalidade e para que ela serve, então, desde que se enquadre nestas três perguntas, o texto é livre para inserção de qualquer informação. image::requisitos-boas-praticas/image4.png[image,width=624,height=60]
Contexto
Utilizado para identificar as condições iniciais que devem ser atendidas para a execução da funcionalidade, como uma carga inicial no banco de dados, itens que devem previamente ter sido acessados ou configurados, etc.
Forma de utilização
-
Não é obrigatório declará-lo;
-
Utilizado após a declaração da “Funcionalidade” no caso de contextos gerais, onde haja informações que serão úteis a mais que um cenário;
-
Contextos úteis apenas para validação de cenários específicos, devem ser utilizados dentro do contexto do cenário facilitando a leitura da EPE. Sempre representado pela palavra-chave “Dado/Dada/Dados/Dadas”.
-
Utilizar o passo “Dado" (ou suas variações) somente uma vez em cada cenário, caso o contexto necessite de mais informações utilizar o conectivo “E”;
-
Permite a utilização de tabelas para representar conjunto de dados;
Abaixo um contexto geral de uma funcionalidade:
Cenário
Identifica um fluxo por meio do comportamento do sistema considerando qual a sua reação com as entradas que passamos a ele. (Entrada – Processamento – Saida)
Forma de utilização
-
Sempre utilizado após a declaração do “Contexto” quando este existir. Pode ser utilizado após outros cenários ou esquemas do cenário;
-
Sempre iniciado com letra maiúscula seguida de dois pontos (Ex: Cenário:) ;
-
A declaração do cenário, virá seguida de um nome que deverá ser dado a ele. Este nome deve ser o mais específico possível, como por exemplo:
Cenário: Validar Data Futura
-
Cenários diferentes podem abordar uma mesma regra, mas não pode haver cenários com nomes iguais no arquivo;
-
Geralmente utiliza os passos “*Dado*”, “*Quando*”, “*Então*” e o conectivo “*E*". Contudo o passo “Dado” pode ser suprimido, caso o contexto tenha sido informado;
-
Permite a utilização de tabelas para representar conjunto de dados, sendo necessário pelo menos um passo com conjunto de dados no cenário;
-
Não permite a utilização da palavra-chave “Exemplos”, pois é utilizada apenas no esquema de cenário;
-
Sempre os dados que forem ser manipulados em um cenário, seja por alteração, exclusão ou consulta, devem estar registrados no CONTEXTO.
Abaixo um cenário de exclusão:
Descrição dos cenários
-
Os cenários devem ser descritos de forma que se assemelhem a um teste da funcionalidade narrado pelo usuário;
-
Deve-se evitar a descrição do tipo de componente que será utilizado para a execução.:
| Certo | Errado |
|---|---|
Dado que existam os dados de: |
Dado que foram cadastrados no banco de dados do sistema os seguintes dados |
Quando o usuário solicita "Salvar" |
Quando o ator clica no botão “Salvar” |
Então o sistema apresenta os dados de "Usuários Bloqueados": |
Então o sistema mostra os usuários bloqueados em um fieldset |
E o sistema apresenta os dados, ordenando pelo campo "Data": |
E o sistema carrega uma grid, com ordenação pela data, com os resultados da consulta. |
-
Sempre devem ser declarados os passos “Quando” e “Então” sendo opcional a declaração do passo “Dado” ou conectivos "E";
-
Os passos (Dado/Quando/Então) não podem vir a ser repetidos dentro do cenário ou esquema do cenário: Dado, como pré-condição; Quando, como execução; e Então, como uma saída gerada.
-
Referências a campos e informações presentes em tela (Ações, Agrupamentos e Menus), é aconselhavel que estejam entre aspas:
Ex: Quando o usuário solicita "Salvar" ou E apresenta os dados de "Usuários Bloqueados"
-
Para passos que sejam seguidos de um conjunto de dados, são finalizados com dois pontos.
-
Para qualquer descrição informada no passo "Dado", ou se o conectivo "E" estiver antes do passo "Quando", é utilizado o tempo verbal no passado.
Ex: Dado que o usuário solicitou o menu "Empresa"
Regras de Negócio
-
Todas as regras de negócio devem da feature devem estar dentro da mesma feature. Mesmo que a mesma regra seja apresentada da mesma forma em arquivos features diferentes.
-
Todas as regras devem ser validadas em cenários ou esquemas de cenários, comprovando assim o comportamento do sistema perante à regra.
Esquema do Cenário
Para identificar um fluxo por meio do comportamento do sistema, O teste do Esquema do Cenário será realizado uma vez para cada linha da tabela de Exemplos.
O esquema de cenário também pode ser utilizado para representar cálculos:
Forma de utilização
-
A ideia do Esquema do Cenário, é repetir o mesmo cenário para cada linha da tabela de exemplos. Faz-se uma substituição das variáveis que estão dentro do cenário com os valores da tabela;
-
Sempre utilizado após a declaração do “Contexto”, quando este existir. Pode ser utilizado após outros cenários ou esquemas do cenário;
-
Sempre iniciado com letra maiúscula seguida de dois pontos (Ex: Cenário:) ;
-
A declaração do Esquema do Cenário, virá seguida de um nome que deverá ser dado a ele. Este nome deve ser o mais específico possível.
Ex: Esquema do Cenário: Calcular Valor Total
-
Cenários diferentes podem abordar uma mesma regra, mas não pode haver cenários com nomes iguais no arquivo;
-
Geralmente utiliza os passos “*Dado*”, “*Quando*”, “*Então*” e o conectivo “*E*". Contudo o passo “Dado” pode ser suprimido, caso o contexto tenha sido informado;
-
Permite a utilização de tabelas para representar conjunto de dados, sendo necessário pelo menos um passo com conjunto de dados no cenário;
-
Exige a utilização da palavra-chave “Exemplos”
-
Sempre os dados que forem ser manipulados em um esquema do cenário, seja por alteração, exclusão ou consulta, devem estar registrados no CONTEXTO.
Palavra chave “Exemplos”
-
Permite gerar uma massa de dados para testes de um Esquema do Cenário;
-
Somente será utilizado em Esquemas do Cenário;
-
A referência dos dados listados na tabela de exemplos deve ser feita utilizando < >. Os valores atribuídos a < > serão substituídos pelos valores da tabela;
-
Deve indicar mais de um exemplo, pois, cada linha acrescentada será um novo teste aplicado ao Esquema do Cenário;
-
Será declarado após o passo “Então” sempre em uma nova linha, iniciando com letra maiúscula, no plural e seguido de ( : ) ;
Preparando a Especificação por Exemplos
Criando o Arquivo feature
Para iniciar uma Especificação por Exemplos, será necessária a criação de uma pasta com o nome da funcionalidade. Nesta pasta deverá ser adicionada duas subpastas uma para “FEATURE” e outra para “HTML”. Na subpasta “FEATURE” será incluída as Features da Especificação por Exemplo, na subpasta “HTML”, será criado o arquivo onde será gerado a Especificação por Exemplo em HTML.
Criando a feature no Intellij IDEA
PASSO 2
Para criar uma nova feature, o Analista deverá clicar em “File”, abrindo a opção “Open”, selecionando pasta com nome da funcionalidade que foi criada, desta forma, será exibido o nome da funcionalidade na lista de projetos recenetes.
Lista de projetos recentes, abrindo a pasta feature só será exibido "FEATURE", dificultando no momento que o analista trabalhar com mais de uma funcionalidade:
PASSO 3
Clicando com o botão direito do mouse, selecionando a opção “New” e em seguida “File”, o analista deverá salvar a feature com a nomeclatura
PASSO 4
Colocar a extensão .feature ao final do nome do arquivo criado.
“SigladoContrato_NOME DO CONTRATO_EPE001_N°Crescente(01)_ Funcionalidade_Ação.feature”.
Exemplo: EB_SIMATEX_EPE001_02_5389_ManterPedidoDeMaterial_Incluir.feature
Obs: Todas as EPEs deverão ser salvas com a extensão .feature. Este é um exemplo, o padrão de nomenclatura para EPE está previsto no Guia de Gerência de Configuração.
Regras gerais da Especificação por Exemplo
Palavra chave “E”
-
Permite dar continuidade a qualquer dos passos (Dado, Dada, Dados, Dadas, Quando, Então) realizando a quebra de linha;
-
Deve ser utilizada sempre no início da próxima linha como letra maiúscula;
-
Não pode ser utilizada sem realizar a declaração que gere a continuidade do argumento da linha anterior;
-
A ação a ser realizada sempre será considerada a ação do passo anterior, como informar, solicitar, apresentar etc.
Comentar o Arquivo Feature
Como estamos lidando com uma linguagem técnica, assim como as demais linguagens de programação é possível inserir comentários que não irão ser apresentados no HTML gerado.
*Sendo assim, temos duas formas de comentários:*
| Caracteres | Forma |
|---|---|
# |
Inserindo uma cerquilha (ou Tag, HashTag) é possível comentar a linha inteira. |
""" Bloco de Texto Com Mais de uma linha ou não """ |
Inserindo um grupo de aspas duplas é possível comentar várias linhas da EPE. Desde que seja inserido um bloco de 3 aspas duplas no início e um bloco de 3 aspas duplas no final. |
Inserção de tabelas
-
As tabelas são representadas por | Exemplo |, onde cada par representa uma coluna;
-
Sempre a primeira linha de | Exemplo | representa o cabeçalho da tabela, onde é descrito o tipo de dado;
-
As linhas posteriores representam os valores atribuidos ao tipo de dado;
-
Não deve ser informado valor na tabela utilizando aspas (“ ”) ou (< >). A própria tabela já indica que o conteúdo informado é um valor.
Exemplo do Arquivo feature:
Exemplo da exibição da tabela no HTML:
Erros comuns
Existem ferramentas que interpretam o arquivo .feature, e fazem algumas verificações para gerar o HTML. No momento podem ser utilizadas as duas ferramentas abaixo:
Pickles Pirilampo
Para a geração dos arquivos com o Pickles é obrigatório que toda a sintaxe da especificação esteja correta. Erros aparentemente banais podem impossibilitar a geração de arquivos ou de scripts de teste.
Portanto é indispensável que NÃO se cometa os seguintes erros:
-
Escrever qualquer uma das palavras-chave ou passos com letra minúscula;
-
Escrever Esquema de Cenário ao invés de Esquema do Cenário;
-
Tabelas que não encerram com o | ;
-
Valores atribuidos nos Esquemas do Cenário não estarem na tabela de exemplos;
-
Esquemas do Cenário sem a declaração da tabela de exemplos;
-
Declarar tabela de exemplos dentro do contexto;
-
Declarar mais de uma vez na EPE o contexto ou funcionalidade;
Frases Padronizadas
Para a automatização do teste do sistema através da escrita da EPE, é indispensável que TODOS os analistas criem a EPE com frases padronizadas. Sendo assim, na definição dos passos, ou seja, o que eles representam mediante ao teste automatizado, é possível trabalhar sempre da mesma forma.
Sendo assim podemos listar as frases padronizadas para escrita da EPE, e todas foram adicionadas ao intelij para facilitar a inserção das mesmas:
| Ator | Frase Padronizada | Possíveis Variações |
|---|---|---|
Contexto |
Existam os dados de: |
Existam os dados de "+Identificação do Dado": |
Contexto |
os dados de: |
os dados de "+Identificação do Dado": |
Sistema |
apresenta os dados: |
apresenta os dados de: apresentou os dados apresentou os dados de: apresenta as ações |
Usuário |
Solicita o Menu "Nome do Menu" |
Solicitou o Menu "Nome do Menu" |
Usuário |
solicita "Nome da Ação" |
Solicitou "Nome da Ação" |
Sistema |
verifica +Descrição da Regra |
verificou +Descrição da Regra |
Usuário |
informa os dados de: |
informa os dados de "Nome do Agrupamento": informou os dados de: informou os dados de "Nome do Agrupamento": informa os dados de "Nome do Campo", +Descrição da Regra |
Sistema |
apresenta a mensagem "Descrição da Mensagem" |
apresentou a mensagem "+Descrição da Mensagem" |
Sistema |
efetua +Descrição da Regra |
efetuou +Descrição da Regra |
Sistema |
Verifica +Descrição da Regra |
verificou +Descrição da Regra |
Sistema |
atribui |
atribuiu atribuiu a "Cor" +Descrição da Cor atribuiu "+Descrição da Regra" |
Sistema |
apresenta o formulário "+Nome do Formulário" |
apresentou o formulário "+Nome do Formulário" |
Usuário |
Seleciona o registro: |
Selecionou o registro: Selecionou os registros: Seleciona os registros: Remove a seleção do registro: Remove a seleção os registros: Removeu a seleção do registro: Removeu a seleção os registros: |
Sistema |
remove os dados do campo: |
remove os dados dos campos: removeu os dados do campo: removeu os dados dos campos: |
Sistema |
Habilita o seguinte +Descrição da Regra: |
Habilitou o seguinte +Descrição da Regra: |
A descrição da regra é importante para o entendimento do passo no cenário, sendo assim, é um espaço livre para inserção da informação. Sendo separado por uma vírgula para atribuir uma informação a mais a este passo. É importante que este passo explique mas nunca exemplifique o que será representado no conjunto de dados abaixo. No exemplo abaixo é possível atribuir esta descrição para explicar o dado abaixo, que sem esta definição não é possível atingir o entendimento somente observando a regra:
Para descrição de campo ou um objeto atribuído, é importante que sempre estejam entre aspas, com isso torna a escrita parametrizável:
Histórico de Versões
Data |
Versão |
Autor |
Revisor |
Observação |
04/09/2018 |
1.0 |
Fabrício Villela Andrade |
Amanda de Oliveira Elias |
Atualização do Documento para o novo modelo de escrita de EPE. |
21/09/2018 |
2.0 |
Guilherme Peres |
Cédric Lamalle |
Conversão do documento para AsciiDoc. |