Extrait de l'interview de Kent Beck dans un récent numéro de Java Magazine:
Binstock: Parlons des microservices. Il me semble que le test d'abord sur les microservices se compliquerait en ce sens que certains services, pour fonctionner, auront besoin de la présence de tout un tas d'autres services. Êtes-vous d'accord?
Beck: Il semble que le même ensemble de compromis sur le fait d'avoir une grande classe ou beaucoup de petites classes.
Binstock: D'accord, sauf je suppose, ici, vous devez utiliser énormément de simulacres pour pouvoir mettre en place un système par lequel vous pouvez tester un service donné.
Beck: Je ne suis pas d'accord. Si c'est dans un style impératif, vous devez utiliser beaucoup de simulacres. Dans un style fonctionnel où les dépendances externes sont collectées en haut de la chaîne d'appels, je ne pense pas que ce soit nécessaire. Je pense que vous pouvez obtenir beaucoup de couverture grâce aux tests unitaires.
Que veut-il dire? Comment le style fonctionnel peut-il vous libérer des moqueries des dépendances externes?
Réponses:
Une fonction pure est celle qui:
Supposons que nous écrivons du code pour gérer la connexion utilisateur, où nous voulons vérifier que le nom d'utilisateur et le mot de passe fournis sont corrects et empêcher l'utilisateur de se connecter s'il y a trop de tentatives infructueuses. Dans un style impératif, notre code pourrait ressembler à ceci:
C'est assez clair que ce n'est pas une fonction pure:
username
etpassword
combinaison que le résultat dépend également de l'enregistrement de l' utilisateur stocké dans la base de données.Notez également que pour tester unitaire cette fonction, nous devons simuler deux appels de base de données,
FindUser
etRecordFailedLoginAttempt
.Si nous devions refactoriser ce code dans un style plus fonctionnel, nous pourrions nous retrouver avec quelque chose comme ceci:
Notez que bien que la
UserLogin
fonction ne soit toujours pas pure, laUserLoginPure
fonction est maintenant une fonction pure et, par conséquent, la logique d'authentification principale de l'utilisateur peut être testée unitaire sans avoir besoin de se moquer des dépendances externes. En effet, l'interaction avec la base de données est gérée plus haut dans la pile des appels.la source