Redação de Teste Spock -Estilo BDD
O Spock Framework é usado para Desenvolvimento Orientado a Comportamento ( BDD ). O BDD garante que os testes sejam legíveis por humanos, de modo que, sem necessariamente mergulhar no código, seja possível lê-los, escrevê-los e mantê-los facilmente. A redação adequada também garante a reutilização, pois é fácil saber quando uma parte do código de teste (ou código do aplicativo) pode ser reutilizada em outro lugar. Para garantir isso, os testes devem ser redigidos para formar sentenças naturais na forma de requisitos de software.
Uma regra simples para garantir que seu teste seja bem escrito é:
Leia em voz alta as frases nos blocos, com vírgulas após cada bloco. Se a frase soar gramaticalmente correta e soar como um requisito de software padrão, seu teste está correto.
Estudo de caso
Um teste para a função getUser() em um serviço de usuários. (observe as palavras-chave em negrito)
Nome do teste (requisito):
getUser deve retornar um usuário quando um usuário existir no banco de dados de usuários
Detalhes do teste (exigência de definição de frase natural mais longa)
dado que o repositório retornará um usuário e o serviço de detalhes retornará detalhes do usuário, quando getUser for invocado, ele deverá retornar um usuário válido.
Abaixo estão as seções que formam um teste Spock BDD:
Nome de teste
Os nomes dos testes devem ser escritos como requisitos.
palavra-chave: deveria
correto: ✅
def "getUser should return a user when a user exists in the users db"
def "when a user exists in the db, getUser should return a user"
def "getUser returns user" //this is not describing what should happen
def "getUser test"
def "when user exists in db, getUser returns user"
Os blocos fornecidos devem representar uma ação para configurar os dados necessários para o teste. Não use blocos fornecidos apenas para definir variáveis e não configurar nenhum dado. As variáveis, se não forem usadas nos blocos fornecidos, podem ser definidas no bloco when.
palavra-chave: vontade
correto: ✅
given: 'repository will return a user'
User user = User.builder().id(123).build()
1 * repository.findById(id) >> user
and: 'details service will return user details'
1 * detailsService.getUserDetails(id) >> userDetails
given: 'repository returns a user' //wrong tense
User user = User.builder().id(123).build()
given: 'user object' //this is not defining any data setup. this is simply a variable.
User user = User.builder().id(123).build()
Quando os blocos devem ter a ação sendo testada.
palavra-chave: é
correto: ✅
when: 'getUser is invoked'
when: 'call getUser'
palavra-chave: deveria
Em seguida, os blocos devem especificar o resultado esperado
correto: ✅
then: 'user should be returned'
then: 'reponse is correct'
then: 'user returned is correct'
then: 'assert reponse is correct'




































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)