Libellé du test Spock - Style BDD

Mar 19 2023
Le framework Spock est utilisé pour le Behavioral Driven Development (BDD). BDD garantit que les tests sont lisibles par l'homme, de sorte que sans nécessairement plonger dans le code, on peut facilement les lire, les écrire et les maintenir.

Le framework Spock est utilisé pour le Behavioral Driven Development ( BDD ). BDD garantit que les tests sont lisibles par l'homme, de sorte que sans nécessairement plonger dans le code, on peut facilement les lire, les écrire et les maintenir. Une formulation appropriée garantit également la réutilisabilité, car on peut facilement savoir quand un morceau de code de test (ou de code d'application) peut être réutilisé ailleurs. Pour garantir cela, les tests doivent être formulés pour former des phrases naturelles sous la forme d'exigences logicielles.

Une règle simple pour vous assurer que votre test est bien rédigé est la suivante :

Lisez à haute voix les phrases dans les blocs, avec des virgules après chaque bloc. Si la phrase semble grammaticalement correcte et ressemble à une exigence logicielle standard, alors votre test est correct.

Étude de cas

Un test pour la fonction getUser() dans un service utilisateurs. (notez les mots clés en gras)

Nom du test (exigence) :

getUser doit renvoyer un utilisateur lorsqu'un utilisateur existe dans la base de données des utilisateurs

Détails du test (exigence de définition d'une phrase naturelle plus longue)

étant donné que le référentiel renverra un utilisateur et que le service de détails renverra les détails de l'utilisateur, lorsque getUser est appelé, il doit alors renvoyer un utilisateur valide.

Voici les sections qui forment un test Spock BDD :

Nom du test

Les noms des tests doivent être écrits en tant qu'exigences.

mot-clé : devrait

correct : ✅

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"

Les blocs donnés doivent représenter une action pour configurer les données requises pour le test. N'utilisez pas de blocs donnés pour définir uniquement des variables et ne configurer aucune donnée. Les variables, si elles ne sont pas utilisées dans les blocs donnés, peuvent être définies dans le bloc when.

mot-clé: volonté

correct : ✅

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()

Quand les blocs doivent avoir l'action testée.

mot-clé : est

correct : ✅

when: 'getUser is invoked'

when: 'call getUser'

mot-clé : devrait

Ensuite, les blocs doivent spécifier le résultat attendu

correct : ✅

then: 'user should be returned'

then: 'reponse is correct'
then: 'user returned is correct'
then: 'assert reponse is correct'