Redação de Teste Spock -Estilo BDD

Mar 19 2023
O Spock Framework é usado para o Behavioral Driven Development (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.

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'