Session du 10 décembre 2025 à 21h00
TOSA & Certifications
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Session de mentorat Pytest et Mock
On va apprendre à Mocker une fonction
00:00:00 :Je vais lancer. Hop, nickel.Votre côté, ça va, vous êtes prêt là, c'est bon ?Ou vous attendez une minute ?OK.Eric, c'est bon ?
00:00:25 :Allons-y.Allons-y, tac. Allez, c'est parti.Du coup, ce soir, je voulais voir, comment dire ?Comment... Vous avez déjà fait du mock, déjà, ou pas ?
00:00:43 :Du mocking.Non.Non, OK. Bon, tant mieux alors. Cool.Alors, imaginons...J'ai pris un truc complètement débile, je ne sais pas pourquoi.J'ai pris une API, ici.
00:01:03 :Une API où...Je l'ai juste enlevé dessus comme ça, je...Je crois que je regarde à quel intérêt ça... C'est bizarre.Vous mettez un prénom et ça vous retourne un âge.
00:01:18 :Donc voilà, ça vous donne l'âge en fonction des prénoms de la personne.Par exemple, je ne sais pas, Eric, tu te réestimes à quel âge ?
00:01:24 :60 ans.Non, 56.Thomas, 61 ans. Bon, OK.Bon, alors, le but, ce n'est pas d'avoir une super API.Le but, c'est d'avoir un truc... Enfin, d'utiliser une API.
00:01:41 :C'est juste le principe d'une API que je voulais.Et du coup, voilà comment ça fonctionne.Le URL de l'API, elle est là, hop, elle attend un paramètre, name, et puis on met le name.
00:01:52 :Voilà, c'est vraiment le truc le plus basique que je pouvais trouver.Et ça me convient très très bien.Donc...Je vais créer juste mon bureau nom virtuel.
00:02:02 :Hop.Touch.Une fois.Pareil.Merci.Alors...Le but, le but, c'est d'utiliser du coup l'API, forcément,et de voir comment on peut l'utiliser dans la test, parce que j'ai eu le cas il n'y a pas longtemps,où, par exemple, dans les tests, je ne sais pas, je pensais que j'allais bien moquer.
00:02:35 :Alors, en fait, j'avais mal fait un truc, il y avait une subtilité,j'espère que j'arrive à la recréer, parce que c'est assez bizarre,où, en fait, chaque test allait appeler des API d'IA.
00:02:44 :Alors, du coup, on se trouvait avec des tests qui duraient hyper longtemps,et genre, je me suis retrouvé avec, je ne sais pas, en 5 minutes,avec 427 appels API sur une IA, ce qui peut coûter cher à force.
00:02:57 :Et j'ai dit, génial, j'ai mal fait mon moque.Donc, en fait, le moque, on va voir, c'est vraiment pour simuler les appels de l'API.En gros, ce qu'on va faire.
00:03:07 :On va se prendre...On va déjà...C'est bizarre qu'il me le...Il ne source pas directement.Il n'a pas eu le sourcement d'environnement actuel, pourquoi ?
00:03:25 :J'ai bien créé mon V1, ouais.Hop.Hum.Là, je suis dans le V1, ouais.Non, je suis dans mon Python.C'est bizarre, là, il ne me le source pas.
00:03:43 :J'ai un truc bizarre, là, mec.Voilà, là, il me le source, OK.Moi, j'aime bien quand ça me fait tout seul automatiquement, j'ai un flamme.
00:03:50 :Doctrine, mentorat, moque, OK.Nickel, donc c'est 3.13 que j'ai ici.Et, normalement, il est propre.OK.Je vais juste aller vérifier un truc avec mon...
00:04:03 :OK.OK, c'est bon.Il faut vérifier un truc.Alors.Du coup, on va installer ici.On va faire des requêtes.Je ne sais pas si vous l'utilisez, mais moi, j'ai ajouté une request ici.
00:04:24 :Hop.Donc, ça, c'est pour faire des requêtes.Vous pouvez utiliser, si vous voulez,il y a URL libre, si vous voulez.Comme ça, il n'y a rien à installer.
00:04:37 :Mais c'est moins pratique que request.Tous les deux, c'est request ou sans plus ?Oui, je connais moins.Vous connaissez moins, OK.Avec Django, on l'utilise pas mal.
00:04:54 :Alors.Pas le request, entre parenthèses, pour faire les tests et tout ça.Moi, je l'utilise pas mal.D'accord, tu utilises le request pour faire les tests, OK.
00:05:05 :OK, OK.Du coup.Quand tu dis, pour faire des tests, c'est que c'est dans tes tests Django ou...C'est dans le fichier test.py pour effectuer les tests,
00:05:21 :pour voir si tout fonctionne correctement.Et je fais l'import request,parce qu'il y a le request de Django,puis il y a l'import request,et moi, je l'utilise avec l'import request Django.
00:05:39 :Donc, c'est dans le fichier test.py,et moi, je l'utilise avec l'import request.Exactement, je ne pouvais pas te redire là comme ça,parce que je n'ai pas l'exemple.
00:05:49 :Ouais, ouais.OK.Non, mais il n'y a pas de problème.Il n'y a pas de problème.Je l'utilise un peu, je l'ai découvert,il n'y a pas si longtemps que ça,et je l'utilise un peu, ouais.
00:05:58 :OK.OK, OK.Il n'y a pas de problème.Du coup.Oui, moi, j'utilise le request pour faire mes requêtes.Alors.On va faire une fonction toute bête, ici.
00:06:08 :On va l'appeler predict.Merde.Predict.Age.Voilà.On va envoyer un aim, ici.Et qu'est-ce qu'on va faire, ici ?On va se préparer.Donc, l'URL, on va la préparer d'avance.
00:06:22 :J'ai mis où ?L'URL de base, elle est là.Tac.OK.Et on va l'utiliser pour ça, du coup,en params.On va avoir un petit dictionnaire, ici.
00:06:41 :On va avoir name.Ça va être le name que l'on attend du paramètre, ici.Parce que, du coup,request, ici,a besoind'avoir l'URLetles paramètres.
00:07:01 :Vous le verrez souvent, en général,c'est utilisé comme ça.Ici, on le passe en argument nommé, en général.OK.Maintenant, qu'est-ce qu'on peut faire ?
00:07:11 :On peut très bien se dire,très basiquement, se dire sion a un status code, ici,de 200.Donc, ici, la requête, elle est OK.
00:07:22 :On récupère, ici,la réponse et on transforme en JSON.Hop.Tout à l'heure, je parlais du URL libre qui est natif à Python.En fait, on ne peut pas faire comme ça.
00:07:35 :Il faut passer par une transformation.Il faut utiliser, d'abord,l'URL libre et, en plus, importer JSONavec request, en fait, et tout ce qu'il complique dedans.
00:07:41 :C'est pas mal.Et là, on va se faire un petit printdes datas eton va compter,aller, pour vérifier, le status code, ici.Voilà.
00:07:54 :Et qu'est-ce qu'on va retourner à la fonction ?Vu que l'API, elle sert à retourner un âge,je ne sais pas pourquoi,on va récupérer l'âge.
00:08:03 :Hop.On récupère l'âge dans les datas.Puisque, quand on a vu tout à l'heure,ça se donne un petit dictionnaire, ici, comme ça,et nous, ce qu'on voit, c'est ça, l'âge.
00:08:12 :On récupère cette clé-là.OK.Et maintenant, on se dit,si on n'a pas destatut de sang,si il y a un problème,on peut se faire, ici, untac.
00:08:25 :Error, basiquement.Hop.Et on vaaller, on va imprimer leon va printer le status code qui va être envoyé.Hop.On peut se faire un petit reste, ici.
00:08:41 :Print.Edit age, ici.Eric.Et il m'embête.Voilà.Il charge, c'est bon.Donc, là, il m'a bien pris un tac.Il fait mon print data avec le status code.
00:08:59 :Donc, j'ai bien mes dataset mon status code de 200.Etj'aurais pu faire un pprint, ici,pour être plus propre.Et on va se le faire, hop.
00:09:08 :Vous l'utilisez, déjà, pprint, ou pas ?Oui.Ouais, tac.En fait, je viens de retrouverpourquoi je l'utilisais, request.C'était pour faire unjournal des erreurs.
00:09:21 :Comme ça, ça me retournait mes status codeset ça pouvait me, voilà, c'était exactement ça.OK, d'accord.Oh, pardon.Euh, qu'est-ce qu'il fait ?Print data.
00:09:33 :Ça ne marche pas, direct,quand on fait sur un dictionnaire comme ça ?Ah, je pensais qu'on pouvait directement,il me semblait qu'on pouvait l'utiliserdirectement comme ça.
00:09:41 :Euh, bon, ce n'est pas grave.En même temps, il y a tellement de tempsque je ne l'ai pas utilisé.Ça me paraît bizarre.OK.
00:09:49 :On va rester sur un print data.Ce n'est pas grave.Et on avait dit, bon,5 signes de réponse 200, de toute façon,donc ce n'est pas très méchant.
00:09:54 :Donc, ça va bien aller nous faireune recapture,une recaptation,ça va bien aller nous faireune recapture Internetet nous renvoyer une réponse.Alors,ce que je dis bien ici, c'estquand vous allez écrire les tests.
00:10:09 :C'est pour ça que je dis que c'est vraiqu'en général, c'est le sujet quirepousse un peu les gens etc'est les tests, voilà,mais c'est important de le faire.
00:10:22 :J'ai pris du risque en le faisant.Et,en fait,comment dire, c'eston va faire en sorte de ne faireaucun appel API pendant les tests.
00:10:36 :Alors, pour ça, du coup,on va déjà s'installerparce que je ne teste qu'avec ça, moi,perso,PyTest.Tac.OK.On va installer PyTestet on va,c'est bon, en fait, pour la fonctionqui va chercher les lages.
00:10:54 :Il n'y a pas de problème, ça, à ce niveau-là ?Oui.Nickel.Dites-moi,coupez-moi s'il faut,il n'y a pas de problème.J'ai dit quoi, du coup ?
00:11:06 :Je ne sais plus.On va déjà importer, du coup.Merde.Crédit.OK.On va importer çaetdéjà, on va faire une fonctiontest fou.
00:11:19 :Hop.Je regarde aussi mon PyTests'il se lance bien.OK.Nickel.Il m'a bien trouvé un test.C'est le super testpas compliqué du tout.
00:11:34 :C'est mon test-test,on va dire.On va voir icitout est bien configuré,entre guillemets.Du coup,on va commenceravec notre fonction,mais on va avoir besoin de deux choses.
00:11:45 :On va utiliser, ici,une équation.Unitest,parce que Unitest,c'est la librairie standardde Python.Ils fournissent, ici,patchet ils fournissent, ici,un objet mock.
00:11:58 :Ça, hyper importantet vous allez voir,hyper pratiqueparce que, du coup,on va pouvoir simulerplein de trucs.C'est vraiment l'idéal pour simuler.On pourrait même rajouterune petite couche d'abstraction.
00:12:10 :C'estPyTestMock, d'ailleurs.Je n'utilise pas, j'avoue,j'utilisePyTestMock.Voilà, il y a ça,PyTestMock.Et, en fait,je ne sais pas s'ils le mettent, ici,dans un premier reporting.
00:12:28 :Il y avait accès au GitHub,ou pas, ici ?Je vais vérifier si il y aquelque chose ici,PyTestMock.C'est l'officiel, ça.Je vais même le mettre en star,quand même,parce que, quand j'aime bien,je le nettoie, quand même.
00:12:43 :Je voulais vérifier quelque chose,source PyTestMock,OK.Ah, quelque chose.Voilà, initest.mock.Donc, voilà,c'est ce que je voulais vérifier.En arrière-plan, en fait,PyTestMock utilise bieninitest.
00:12:59 :Donc, bon.Qu'est-ce qu'il vous a installé,en fait ?En fait, c'est,comment dire,une surcouche,c'est une surcouchepour éviter de fairedes petites choses en plus.
00:13:10 :Je n'utilise pas, j'avoue,mais, ouais,ça simplifie peut-être un peula syntaxe.Ça leur a un peu plusPyTest style,on va dire.Mais bon,on va faire sans.
00:13:21 :Voilà.Après, si vous savez faire ça,PyTestMock,voilà,c'est juste un petit truc en plusque vous pouvez rajouter, quoi.OK.On va avoir un test,par exemple.
00:13:32 :Un test.On va commencer par un trucbasique.Un cas de succès.Allez.Un cas de succès.Et je vais commencer à l'expliqueren écrivant le premier test.
00:13:42 :Parce queje préfère le voirpour vous le montrerqueon va faire quelque choseparce que sinonça va pas être très parlant.Donc,ici on va avoirune vue,un testde succès, du coup.
00:13:57 :Le but,c'est assez gros,c'est bon,on le voit assez bien.Le but ici,c'est qu'on vatester notre fonctionnalitétester notre fonction,mais que notre fonction,elle utilise bien,ici,un request.
00:14:18 :Sauf queon ne peut pas se permettreà chaque fois dedès qu'on lance les tests,imaginons que dans votre test,je ne sais pas,il y a 50 testset vous allez faire 50 appels à payerà chaque fois.
00:14:33 :À force,vous allez se faire bouffer tous vos crédits,vous vous faire jeter par l'API,ils vont dire stop làet vous êtes en train de les spammercomme pas possible.
00:14:39 :Donc, c'est pour ça que làon va utiliser un mock.On va vérifier icique la fonction va fonctionner correctementet que la payée,là, elle répond bien.
00:14:49 :Donc, pour ça,on va se créer,on va revenir là.C'est un simulateur WAPI en fait.Ouais,un simulateur de tout,on peut tout moquer avec ça,en fait,n'importe quelle fonction.
00:15:00 :Je ne sais pas,tu peux moquer random par exemple,faire en sorte que randomte renvoie toujours deux,voilà.Si tu as besoin de valeur fixe.
00:15:07 :Par exemple,ici on va dire,on va allermoquerrequest.getHop,on patch request.getJe réfléchis à un truc.Non,on va faire comme ça.
00:15:31 :Je réfléchis à un truc.Je vais savoir si je vous montrede...Je ne sais pas.Non,on va faire comme j'ai prévu.En fait,j'ai préparé un truc un peuà l'arrache dernière minute.
00:15:57 :On va faire comme ça.Ok.Ce n'est pas grave.Ok,donc request.get ici.Et quand vous faites votre patchcomme ça,vous dites en gros,c'est comme ça qu'on va les patcher.
00:16:12 :On va mettre ici,en premier paramètre,là comme ça,un argument,et on va diremoque get.Donc,on peut l'appeler comme on veut,mais il va être lié icià ce patch.
00:16:27 :Automatiquement,PyTest va faire le lienentre les deux.Ok.Donc,moque get ici,ça va être notre fauxrequest.getparce que,comment dire,Python,PyTestest assez intelligenticipour dire quepour voir qu'en faitil y a request.get
00:16:51 :qui est utilisé dans cette fonction-làqu'on a importée.Donc,il est assez intelligentd'aller chercher dans les modulespour savoir que c'est bienrequest.getqu'on patch en fait.
00:16:59 :Donc,ça c'est bien foutu.Donc,il va aller chercher en faitla méthode getde l'objet request.En gros,c'est ce qu'il fait en arrière-plan.
00:17:08 :Donc,voilà.C'est assez balèze.On varéfléchir un peu.Ouais,on vacommencer par le succèset on va tester plusieurs choses.On va tester peut-êtrele return valueet puis un résultat.
00:17:32 :On va faire un truc simple.Ok.Alors,c'est parti.Donc,ici,on a déjà du coupun objet effectifqui est mock.getqui correspondau request.get.
00:17:45 :On va maintenant créerici,on va l'appelerresponseet on val'instancier.Donc,ça va être une instance de mock.Donc,ici en gros,le mock.get,
00:17:59 :ça va êtrenotre,elle est là ici,notre request.getet le mock.responseva correspondreànotre,ce que va retourner,en fait,ce que va retourner,en fait,notre fonction,ici,notre méthode.
00:18:17 :Donc,en gros,c'estdata.getque tu as misen return,en fait.En gros,il y arequest.getici.Ok,ça va êtrenotre mock.get
00:18:33 :et ensuite,ça va nous retournernotre mock.responsecomme çaetnotre mock.response,en fait,oui,c'est la réponsequ'on va,par exemple,lui donner,à faire commela,comment dire,commece que renvoie,en fait,voilà,ce que nous retourne la fonction.
00:18:58 :Donc,on va configurer,on va mettre,par exemple,ici,un statut,voilà,comment l'expliquer,en gros.Et du coup,je réfléchis,parce que ce n'est pas évidentd'expliquer en soi un mockcomme ça,c'est un peu abstrait.
00:19:14 :Et en fait,du coup,un mock,le but,c'est qu'on peut lui attribuerce qu'on veut.Donc là,par exemple,ici,on va se diremock.response,
00:19:25 :on va lui mettreun statuscode,ici,comme nous renvoienotre request.getà 200,voilà,et on peut lui dire,ici,mock.response,.json,et on peut lui direque le .json va retourner
00:19:39 :ici,faire un returnup value,ici,tac,et on va mettrename,je ne sais pas,on va pouvoir mettremarc,tac,on va mettreeric,par exemple,il va retourner iciun âge,tac,et on vamettreun nom,on va mettreeric,par exemple,ici,tac,on va mettre
00:20:05 :32,et il a envoyé quoien clé ?Je ne sais plus,il est où ?Un counten premier,il envoie un counten premier,donc c'est le countqui est en premier,ici,tac,donc ce n'est pas graveça,en fait,au final,mais on va garder
00:20:23 :la structurepraxologique,tac,et il envoie à chaque foisun nombre,peu importe,hop,ok,donc c'est un nombrequi va envoyerun certain status code,et ici,json,c'est une méthodequi va vous renvoyerquelque chose,donc une valeur de retour,et donc ici,on va lui attribuer
00:20:42 :cette valeur,donc là,en fait,on amockGet ici,qui va être quoice point Get,et on lui fait retournericice qu'on veut,on va faire ici,du coup,mockGet,on va faire un petitespace pour se faireles choses,mockGet,qu'est-ce qu'on va dire ?
00:21:00 :C'est retourneValue,je crois,sur mockGet,donc on va faireun retourneValue ici,et on va lui dire,c'est la mockResponse,hop,et en gros,maintenant,c'est comme sion avait un request.get,
00:21:15 :on sait d'avancequi va retourner ça,voilà.C'est pratique,parce que le but,c'est pas detester ce que nousretourne l'API,c'est de tester comment,si notre coderéagit bienen fonctiondes valeurs retournées.
00:21:29 :On va définirles valeurs d'avance.Donc,en gros ici,qu'est-ce qu'on va se dire ?On va faire iciunpredictAge,on va mettre,on va mettreen numérique,ok,et maintenant,qu'est-ce qu'on fait ?
00:21:49 :On fait un assert,un résulte,ici,à 32.Alors,du coup,là,on va utiliser notre mockau lieu de l'API,on va vérifier que toutse passe comme prévu,normalement,on est censé retrouver 32,mais aussi,on va aller vérifierque request.get
00:22:06 :a été appelé qu'une seule foiset pas plusieurs fois,et avec les bons arguments.Donc,on pourrait très bien faire ici,on peut se dire que,bon, ok,cet assert-là,il est un peu bête à utiliser,mais on va le laisser.
00:22:16 :Mais,ce qui est intéressant,c'est qu'on peut se dire ici,vérifier le comportementde notre fonction.Donc,dans notre code,on va vérifierque ça a été appeléonce with,avec,on ne va pas s'embêter,l'URL ici.
00:22:29 :Hop,j'ai mis les doubles guillemets.On va vérifierqu'il y a çaen premier argument.On va vérifier aussiqu'il y a les paramètresici,qui sont,j'ai mis code name,Eric,Eric,hop là.
00:22:42 :Donc,on va vérifierqu'il y ales paramètresici,donc,on va vérifierqu'il y ales paramètresici,on va vérifierqu'il y ales paramètresici,hop là.
00:22:57 :Ok.Donc,déjà,normalement,on peut faireun test.On va voirs'il n'y a pasune erreur.Il y a une erreur.Qu'est-ce qu'il me fait ?
00:23:08 :Bref,les choses,ok.Qu'est-cequ'il embêteici ?C'est pasquet'as oubliéun A,c'est un request.Avec,par exemple.Ah,oui,merci.Je croyais que c'étaitdans mon truc.
00:23:26 :Merci bien.Je n'ai pas vu.Ok,nickel.Donc là,il m'a bienfait passer le test.Donc là,on ne teste pasl'API elle-même.Le but,ce n'est pasde tester l'API,c'est de testernotre fonction,si elle,comment dire,si notre codefonctionne biencomme on veut.
00:23:46 :Donc là,qu'est-ce qu'il se passe ?Bon,ok.Ici,ça va devenir 32,d'accord,puisqu'on l'a défini d'avance.Mais ce qui est important,ici,c'est qu'on voit bienquenotremock,ici,a été appeléune fois,pas deux fois,enfin pas trois fois,une seule fois,et qu'il y a bien
00:24:08 :ces paramètres-làqui sont dedans.Voilà.Donc ça,c'est les premiers testsqu'on peut passer.Moi,j'ai le cas,là,ça paraît un petit peudébile de tester ça,mais c'est vraimentun exemple simple.
00:24:21 :Déjà,vous allez les moqueravec l'aide de l'IAparce que c'est beaucoup plus simple,parce que Stripe,c'est tellement une galèreà moquerque je l'ai faitil y a deux ou trois joursavec l'IA.
00:24:32 :Sinon,c'est une horreur,c'est long,c'est très très long.Mais en gros,le principe reste le même.On va moquer les méthodesqu'il y a ici,créer des valeurs de retourgrâce à...
00:24:42 :On va paquer,je veux dire,les méthodes,ainsi de suite.On va moquer les valeursde retour,et puis voilà,quoi.C'est ce que ça comporteen fonction de ces valeurs.
00:24:52 :OK.On peut très bien aussi vérifier,pour voir un autre comportement,ici,que notre mock response,cette fois pas le get,notre response,on vérifieque jdona été appeléune fois,parce qu'on veut vérifierque ça soit bien appeléqu'une seule fois.
00:25:15 :Hop, OK,je la passe.Le but ici,c'est de bien vérifierque jdonest appelé une fois,pas plusieurs fois, quoi.OK.Maintenant,ça va pour l'instant ou pas ?
00:25:32 :Ou ça paraît trop abstrait ?Ça va.Ça va ?Eric, il y a de...Je vais attendre 30 secondes,s'il veut.Mais sinon, ça va, toi ?
00:25:44 :C'est pas trop abstrait,ça va encore ?Non, parce qu'en fait,j'arrive à comprendre,c'est en gros,au lieu de passer directementpar l'API,en fait,ça met les valeurs de l'APIdirectement à la place.
00:25:55 :Ouais.Ouais,le but,c'est vraiment de pas testerl'API,parce que là,tu vas payer cher,alors que sinon,ça va te revenir cher.Surtout avec des IAou des choses comme ça.
00:26:06 :Ouais.Eric, ça va, du coup ?Ouais, ça va.C'est pas trop abstrait ?C'est un peu...C'est un peu...Je vais regarder la vidéo,parce queil faut que j'en travaille ça.
00:26:24 :Ouais, OK,y'a pas de problème.Mais tu verras que,au final,quand t'auras le déclic du truc,en fait,tu verras que le but,c'est que tu testes iciton request.get,
00:26:34 :pour ce cas-là,et ici,et après,tu lui configuresune valeur de retourtoute faite,tout préconfigurée.En fait,le moc,c'est ce que tu veux,tu peux créer les attributsqui sont vraiment retournéspar request.get,
00:26:47 :ici.Et je vais vérifier bienle comportementderrière de ma fonction,que tout est appelé correctement,avec les bons paramètres,que ça n'est appelé qu'une seule fois,et ainsi de suite.
00:27:00 :On va en faire un deuxième.Le moc.response,c'est vraiment,en fait,ce qu'on doit renvoyer le site,et c'est nous qui le renvoyonsnous-mêmes, en fait.
00:27:09 :On doit renvoyer le site,en fait.C'est ce qu'on renvoie,c'est ça,c'est ce qui est récupérédans ton retour,dans ton request.get.Donc,elle doit être,donc l'API te renvoieun status code,mais aussi tu renvoies,du coup,juste en JSON,tu renvoies une valeur de retour,quoi.
00:27:25 :Et donc ça,on les moque.Je pense qu'on va faireun copier-collerde mon...On va vérifier un truc.Si je vais ici,que j'actualise,et si je mets n'importe quoi,par exemple,en paramètres,en paramètres bidon,Error Missing Name Parameter,pas de problème.
00:27:52 :Et si je fais un testdans le programme,on va se mettre un names,par exemple.Boum !J'ai une erreur, 422.Donc je n'ai pas une 200,la requête,elle n'est pas OK.
00:28:05 :J'affiche bien ici l'erreur,le status code de l'erreur,qui va être 422.OK.Donc là,on va tester le cas inverse.Donc on va...Je vais m'amuser du copier quoi.
00:28:19 :Du coup, on va aller,on va copier ça,et on va modifier les noms.Hop !Et on va mettre...On va l'appelerTestPredictAge Error,tout simplement.
00:28:32 :Donc,même principe.Ici,on a notre mockGet,notre mockResponse.Et qu'est-ce qu'on va dire ?MockResponse,on va lui donner,ici,le status code.On va le mettre à422.
00:28:46 :Voilà.Donc,une erreur.Et qu'est-ce qu'on va faire ?On va lui dire que notremockGet,ici,ça va nous faire unreturn ici,value,ça va être mockResponse.
00:29:02 :Bien,mockResponse.Pourquoi,uniquement,ça et pas de JSON ?Puisque quand on a uneerreur 422,comme ça,ici,nous,on ne va pas tester leJSON parce que,de toute façon,il n'est pas appelé.
00:29:17 :On pourrait même le créer.Donc,tous les cas,on ne l'appelle pas.Bon,on aura pu le créer.Je réfléchis un peu.Ouais,ça nous enregistre l'erreur,en fait.
00:29:35 :Donc,on va rester en ce cas-làet on va bien vérifier.Je ne sais pas,on va faire,par exemple,on va se faire unpredictAge.
00:29:45 :On va se faire,quand même,un résulte ici.On va se faire unpredictAge.Comme ça,on va mettreun valide,peu importe,en paramètre.
00:29:56 :Donc,qu'est-ce qu'on va faire ?On va faire un assert.Résulte,ici.Hop,ça va être quoi ?Et,que je ne fasse pas d'erreur.
00:30:06 :J'ai fait quoi tout à l'heure ?C'est 422,l'erreur que j'avais.Hop là.OK,donc là,normalement,si je lance le test,on va vérifier qu'il n'y a pasd'erreur.
00:30:20 :J'ai une erreur,j'ai fait une erreur.Où ça ?Mon erreur message,ici.OK,pas de problème.Qu'est-ce qu'il a ?Ah,oui,OK.Hop là.
00:30:34 :C'est correct,c'est ça.Donc,si je repasse là,hop là,ça passe.Donc,pourquoi ?Parce que là,on veut tester dans le casoù le status code est de 422,comme l'API nous renvoie,et on veut bien vérifierque notre fonction retournel'erreur 422.
00:30:52 :Parce que,imaginons,par exemple,on est là,un jour,dans le programme,on modifie notre code,on envoie autre chose ici,peu importe.Hop,et puis,on lance les tests.
00:31:04 :Tac.Et mince,une erreur.En fait,on voit qu'on ne gère plusdu tout de la même façon.Bon là,l'exemple est très simplifié,on va dire.
00:31:13 :Mais on voit qu'on ne gèreplus du tout de la même façonnotre fonction,notre retour de fonction.Du coup,au moins,on sait très bienque les tests ne passent plus.
00:31:21 :On sait qu'à la base,on faisait comme ça,mais qu'on a changé.Donc,potentiellement,on pourrait avoirdes comportements inattendussi on retourne autre choseque ce qu'on avait à la base.
00:31:30 :Donc,on teste iciHop.Vous voyez qu'on créeun moque.On crée un moque,mais quand même,la fonction nous renvoie bienles bons éléments.
00:31:43 :Si on lui dit,ici,T1-200,il va bien nous renvoyerle,comment dire,notre JSON.Il va dériver notre JSON,puisqu'on lui demande l'âge.Donc,il nous renvoie l'âge.
00:31:58 :Excusez-moi,plutôt.Et si,on a un casoù on a autre chosequ'une 200,il nous renvoie bien.Erreur.Tac.Sauf que du coup,là,on arrive à se passer totalementdans l'appel API.
00:32:11 :On le fait juste avec des moques.Donc,on n'a pas testé l'API.On renvoie ce qu'elle nous renvoiehabituellement,mais on teste le comportementici de notre fonction,du fonctionnementde notre code à nous.
00:32:20 :Notre code à nous,pas celui de l'API.J'insiste là-dessus,parce que le but,ce n'est pas de testerl'API elle-même.Eux,ils le font de leur côté.
00:32:29 :Voilà,on pourrait...Est-ce que je...Là,il faut connaîtreles codes,les statuts de codepar cœur,savoir à quoi correspond422,et tout ça.
00:32:40 :Dans mon cas,oui,en général,il fallait connaîtresouvent la même chose,ce qu'il renvoie.Mais là,j'ai vérifié avant,oui,et je l'ai mis comme çapour l'exemple.
00:32:51 :Après,on va voir commenttu testes l'API.Donc,on va voir commenttu testes l'API.Donc,après,on va voir commenttu testerais.Je pourrais ressortirune foismon projetoù je teste avec des mocsmon Stripe.
00:33:06 :Bon,c'est autre chose.C'est un vrai...C'est assez lourd,quoi.Mais là,c'est vraiment,basiquement,je sais que c'est une 422,donc,voilà.Là,je sais que du coup,je lui mets un statut de code422,donc,c'est ce résultat-là.
00:33:23 :Après,tout dépendde comment est faiteta fonction et tout.Mais après,tu vas vouloir peut-êtretester des cas spécifiquesoù tu as un statut de codede 500,un statut de code 400,voilà,ainsi de suite.
00:33:36 :Là,j'ai une 422parce que c'est celuiqui est renvoyé.Il y a possibilitéde marquer...Là,tu marques spécifiquementle numéro du statut de code,mais marquer,par exemple,tester toutsauf le 200.
00:33:49 :Attends,je n'ai pas compris.Pour voir,en fait,à part avoirun statut de codeégal 422,c'est qu'il soit,en fait,en gros,égal à toutsauf le 200.
00:34:03 :Il y a possibilitéde faire çaou pas du tout ?Attends,peut-être que c'est le casde s'il est,donc,s'il està tout.
00:34:12 :Ouais,s'il est,en fait,en gros,c'est s'il est différentde 200,par exemple.Ah,ben,en fait,tu pourrais,donc,par exemple,le faire dans les tests.
00:34:27 :OK,dans les tests.Dans les tests,vérifier comment ça réagitquand c'est différent de 200.Peu importe,en gros,peu importe le code,juste quand c'est différentde 200.
00:34:37 :Ben,tu pourrais,ici,faire un,soit avec une boucle,tu pourrais faire bouclersur une liste d'erreurs,par exemple.Tu pourrais aussi,ben,après,tu pourrais avoir,bien sûr,le truc le plus,comment dire,différent de 200,tu pourrais faire un trucdans le genre.
00:34:57 :Pourquoi pas ?Au moins,tu exclus 200et tu as tout le reste.Mais,après,je ne sais passi c'est làoù tu voudrais en venir,mais,je vais te montrerquelque chose.
00:35:09 :Parce que,oui,on peut tout tester,il n'y a pas de problème.Si on veut fairedifférent de 200,tu as tout le reste,tu peux choisirque telle in,voilà,faire ce que tu veux.
00:35:22 :Mais,comme ça a testé 200,ben,en fait,on sait que ça réagit comme ça,si c'est 422,par exemple,mais si c'est 500,si on n'a pas marqué le test,on ne sait pas comment il réagit.
00:35:33 :Oui,alors,oui,c'est un peu dans ce sens-làque je me disais,avoir une fonctionqui permet de testerplus ou moinstous les autres codes d'erreurque le 200.
00:35:43 :Ok,ben,je vais te montrer autre chosepour que tu comprennes un peu mieux.C'est où ?Alors,c'est là-dedansque je fais un paramétrize.
00:35:55 :Ok,c'est bien ce qui me semblait,c'est là-dedans,hop là.Donc,ce n'est pas vraimentde rapport,entre guillemets,ici,mais,par exemple,là,c'est un peu lié à ce que tu disaissans être vraiment lié directement.
00:36:10 :Ici,alors là,on est sur un autre truc,c'est un peu plus chaud,entre guillemets,j'ai un seul test,mais qui va me testerun,deux,trois,trois cas différents.
00:36:21 :Mon,comment dire,ici,j'ai une scène de caractère,mode de paiement,j'aidifférents modes de paiement,et ici,j'aimon paramètre,mode de paiement.Et en fait,mode de paiement,ici,ça va me récupérer le testqui va se lancerune,deux,trois fois,mais avec,à chaque fois,
00:36:45 :le mode de paiement différent.En fait,je teste le comportement que j'aià chaque fois avec mes différentsmodes de paiement,en fait,j'ai fait un paie-test,pour un paramétriser,ça,c'est assez balèze.
00:36:55 :Donc,ça m'évite de faire trois tests différents,ou de mettre des conditions,alors,si c'est ce test-là,il y a ça,si c'est ce test-là,il y a ça,si c'est ça,enfin,si c'est ça,il y a ça,c'est non,je fais un paramétrage,et boum,je teste ça comme ça.
00:37:11 :Donc,c'est un peu lié à ce que tu disais,sans être directement,mais du coup,j'avais envie de le montrer,parce que ça me faisaitfortement penser à ça,et là,ça permet de tester,par exemple,4, 5, 10,20 paramètres différents,qu'on note dans le truc,mais,ouais,
00:37:26 :c'est vraiment tester tout,enfin,tester tout,sauf,ben,ce paramètre,ou ces paramètres-là,que,ça,après,il faudrait faire un petit if,ou un petit for.
00:37:38 :Ouais,et après,ce que tu me disais,c'est le truc,ouais,qu'est-ce que ça fait,si j'ai du 500,si j'ai du machin,là,mais tout le reste,on sait pas ce que ça fait,enfin,si,on sait,ça va me renvoyer erreur,et ça va me renvoyerle statut de code,
00:37:55 :c'est tout.Ouais,et c'était vraiment,par exemple,pour voir la réaction,parce que,là,il est simple,mais des fois,on peut avoir un codeun peu plus compliquéqui va retourner 200sous tel truc,500 sous tel truc,et ça,ça permet de voir,aussi,tous les résultats
00:38:13 :qu'il peut y avoiren fonction des codes.Alors,là,on aura l'occasionde refairedu pytest,à la limite.Ok,on va faire un truc,on va aller modifierlégèrement notre fonction,ici,parce que,bon,tu pourrais vérifier,du coup,selon le,pour ton code,à la base,pour le tester,
00:38:34 :il faut que tu aiesun code de baseà tester,on va dire,il faudrait que là,j'ai if,et l'if 500,et l'if machin,ok.
00:38:43 :Et là,ici,on va dire,if else basic.Un truc qui pourrait,vu ta question,qui pourrait peut-êtret'intéresser,tac,tu peux faireun try,ici,on va prendrenotre,notre bloc,voilà,on va faire un try,faire une requête,oui,d'accord,hop là,et ici,qu'est-ce qu'on va faire,
00:39:06 :on va se dire,exactement,c'est ce que je vais faire,merci,merci beaucoup,c'est,oui,je le répète,c'est,oui,je l'aurais presque dit comme ça,allez,on va se mettre un truc plus simple,on va se dire,erreur,hop là,voilà.
00:39:23 :En gros,là,c'est très générique,j'essaye de faire ça,et si j'ai une erreuravec requête,boum,ça,comment dire,je retourne mon erreur,ici,voilà,je retourne l'erreur,et c'est tout,on s'arrête là.
00:39:38 :Tu pourrais avoirdes cas,ici,où,tu pourrais avoirdes cas,ici,voilà.Donc,comment il s'appelle déjà,on va garder celle-là,on va la commenter,merci.
00:39:51 :Il y a des histoires aussi,qu'on peut,dans les trois Excel,qu'on peut mettre des ifset des else aussi dedans.C'est là,merci.Alors,là,j'ai ton truc écrit,justement,c'est point,je ne sais plus,c'est point timeout,ici,là-dedans,voilà,timeout,ici,ok,tu pourrais tester aussi,
00:40:12 :tu as quoi,tu as request,point,exception,et point,qu'est-ce qu'il y a avectimeout,voilà,en fait,quand tu regardes,ici,il y a différentes,différentes erreursqu'on peut avoir,et bien,tu pourrais dire,en fait,faire plusieurs excepts,faire des choses différentes,ici,et après,dans ton code,
00:40:34 :elle est testée dès qu'après,ici,aussi.D'accord.On pourrait voir ça.Bon,là,ok,on va prendre un truc,très générique,hop,voilà,ok,on reste générique.
00:40:48 :Donc,par exemple,ce qui peut être intéressant,on va se faire un dernier petit test,ce n'est pas si vite,je ne reviens pas,en même temps,je ne vais pas trop vite,parce que c'est assez spécial,comme,comme,comme mentorat sur les mocs.
00:41:00 :Ok,on va,maintenant,on va,on va,on va,on va,on va,on va,on va,ok,on va,maintenant,donc on a fait notre try except dans le code,et là,on va vérifier,en fait,on va lui donner en fait,ce qu'on appelle à notre moc,
00:41:19 :ce qu'on appelle un side effect.Donc là,toujours pareil,on va faire un patch ici,on va,request.get,ah,il est trop fort,il est trop fort,parce que du coup,il a,attends,je regarde bien ce qu'il me fait,ok,euh,donc,reste,on va voir,on va,
00:41:39 :euh,donc,reste,je regarde,ouais,c'est pas mal,il me fait un moc.get,moc.get,pour un side effect,du coup,il m'envoie ma,mon exception timeout,ouais,pourquoi pas,on pourrait envoyer une connexion erreur,peu importe,ici,on va faire quand même notre résulte,ici,résulte,credit age,ici,
00:42:01 :on va mettre,je ne sais pas,on va mettre,on va mettre,on va mettre,on va mettre,on va mettre,on va mettre mais on s'en fout,hop,on va mettre un vrai prénom,comme ça fait bizarre,euh,et ensuite,on pourrait très bien dire,euh,faire un assert,
00:42:17 :mince,un assert ici,et je sais pas,on pourrait,ouais,voilà,un résulte.starsourceerror,par exemple,en le lance,ça doit fonctionner,c'est plus que j'ai mis,d'ailleurs,dans mon except,donc,ça passe,puisque dans mon excel,j'ai mis quoi,voilà,erreur de petits points,donc effectivement,donc là,en fait,
00:42:39 :on peut donner un side effectà notre,euh,à notre mock get,pour directement lui dire,eh ben,tu me lâches une exception,comme si t'avais une exception,ok ?
00:42:48 :Donc,on pourrait avoir un message,hein,dedans,tac,ça fonctionne aussi,hein,y'a pas de problème,tac,euh,et c'est pour ça,du coup,ici,tu pourrais tester plein de cas,faire un autre test,ou,euh,est-ce qu'on pourrait avoirune exception,erreur,ainsi de suite ?
00:43:09 :Voilà.Euh,est-ce que ça a été ou pas ?Ou beaucoup trop abstrait,le mock,pour l'instant ?Pour moi,ça a été.Ça a été ?
00:43:18 :Ouais,ben,pour moi,c'est pas si abstrait que ça,après,je sais que pour beaucoup,ça peut être plus abstrait,mais après,pour moi,ouais,c'est pas si abstrait que ça,en fait.
00:43:30 :Ben si,c'est bien maîtrisé,euh,t'en as jamais fait,tant mieux,et là,le voir une fois,déjà,c'est une chose,c'est pas mal,euh,faut se dire,bon,ok,on moque quelque chose,on,après,on,on falsifie,entre guillemets,euh,on falsifie,ouais,on la,on la statifie,
00:43:55 :peut-être,je sais pas comment dire,la,on arrange,enfin,on...Les valeurs pour l'API,hein ?Voilà,donc,ma fonction est faite comme ça,donc,que je teste un code 500,400,ce que je veux,en tous les cas,si c'est autre chose que 200,ça ira toujours ici,
00:44:13 :mais,euh,ça peut être intéressant,si,à la base,en fonction,on gère différents cas de statut code,on gère différents cas d'erreurs,ben là,après,dans des tests,voir comment tu,si tu fais plusieurs tests,euh,voir si tu veux gérerque du paramétrize,enfin,voilà,il y a plein de cas possibles
00:44:32 :avec Bytest.Ouais,pour répondre,ouais,moi,je connaissais pas,je connaissais pas le MoC,euh,puis j'avoue que Bytest,je l'utilise pas non plus,enfin,j'en ai entendu parler,mais,euh,voilà,donc,euh,moi,pour moi,un test,c'était pas ça,mais,euh,je sais pas,j'ai mieux compris.
00:44:57 :Ok,ouais,cool.Il y a des tests...Ouais,il y a des tests,il y a une bourse,un test,et,en fait,euh,en fait,il faut donner la réponsepour être sûr que ça correspond,c'est ça ?
00:45:12 :Bah,là,dans les MoC,oui,tu testes,il faut que tu aies déjàdes choses prédéfiniesdans tes valeurspour tester ton codeà toi,quoi,entre guillemets,voilà,et après,les tests,après,c'est différent,t'as plein de tests,comme tu dis,ça,c'est un vrai bordel,mais par exemple,
00:45:34 :pour finir,pour finir sur,allez,tac,euh.Après,après,je sais pas si t'as vue,Eric,mais sur,sur DocStream,t'as un trucsur les tests interpitonqui est,où ça explique bienavec,avec Unitestet PyTest,et ça,ça peut bien aidervis-à-vis des,des testsà bien comprendre
00:45:57 :à quoi ils serventet,et,et comment s'en servirau niveau du codeet tout ça.Non,ben,j'avais pas vu,ben,justement,je,je,je vais regarder.
00:46:11 :OK,ben,euh,tu verras,il y a une petite formationlà-dessus,et juste,ben,je donne ma façon de faire.En fait,moi,je fais mes premiers testset après,l'IA,du coup,je vais faire comme moi,je fais,genre,un test à nouveauavec une ancienne base de données.
00:46:31 :Du coup,j'ai dit,ben,je vais refaire en françaisparce que toujours passer en anglais,la migration est un peu galère.Donc,pour être cohérent,j'ai gardé mes noms de,de fonctions ici,de tests en français.
00:46:42 :Donc là,parce que la personnequi va regarder le codeest,enfin,voilà,elle est françaiseet je pense que ça risquede l'arranger.Euh,du coup,je fais toujours un scénario,moi,dans mes tests.
00:46:56 :Euh,ça c'est ce qu'on appelleça,c'est du Gertin,c'est un espèce de,c'est comme un langage,en fait,une façon de faireoù j'écris un scénario.
00:47:05 :Donc,c'est given,donc,si j'ai un utilisateur connecté,quand,s'il accède à ça,alors,eh ben,ça me fait ça,entre guillemets.Donc,comme ça,j'écris mon scénarioet après,j'ai plus qu'à tester.
00:47:20 :Et donc là,tu vois,Eric,euh,là,par exemple,je teste,donc,le scénario qui aille sur cette URLqui n'est pas connecté,donc,et je veux bien vérifier que,euh,je veux bien vérifier,entre guillemets,que j'ai un status code 200,c'est que,OK,il n'y a pas de problème,
00:47:39 :j'accède.Et par contre,je veux bien vérifier que dansce qui est renvoyé,c'est que le panier est vide,par exemple.Voilà,parce que là,son panier est vide.
00:47:48 :Et je fais plusieurs tests comme ça.Voilà,je fais,donc,connecté,euh,ici,je vais travailler avec des objetset,ici,je vais vérifier,par exemple,euh,là,là,j'ai un peu de mathématiquesen même temps à la fois,dans le sens oùje vais faire un login de quelqu'un,
00:48:07 :donc,là,j'ai bien écrit mon scénario,quelqu'un va se loguer,je récupère la quantité initialed'une capsule,je fais une vueoù je j'ajoute cette capsuledans le panier,voilà,donc,après,je fais ma poste,boum,je vérifie que j'ai bien une 200et,là,je vais aller vérifier que la quantité
00:48:25 :est bien,puis que j'en ajoute une seuleen,comment dire,en panier,voilà,il y a plein de choses à testerdifférentes,en fait,si,tu peux avoir les vues,comme ça,tu peux avoir,euh,tu peux avoir tout simplement,je ne sais pas,j'ai un système de promotion,
00:48:42 :par exemple,où là,je ne vais pas tester les vues,mais je vais tester vraiment,alors,si,là,il y a des vues,je teste les vues,euh,par exemple,les pures tests de,je vais les tester ici,euh,puisque je n'ai pas le droit d'avoir,euh,une cote négative,
00:49:00 :donc,je vais les tester,ici,si,j'ai bien une erreur qui est élevéeen cas d'une cote négativequi attribue une capsule,par exemple,voilà,donc,voilà,plein de choses à tester,plein,plein de choses à tester,donc,même des erreurs,voilà,on peut tester directement si il y a des erreurs,
00:49:18 :si l'erreur est élevée,dans certains cas,euh,donc,voilà,je vais vous montrer sur un projetqui n'est pas encore terminé,alors,sur ce projet,c'est assez marrant,c'est peut-être la configuration,je ne sais pas si ça peut jouer,alors,euh,ouais,c'est bizarre,quand je lance mes tests,
00:49:35 :j'ai toujours un petit,euh,un petit laptop,après,tout part d'un coup,boum,voilà,donc,là,j'ai 284 tests déjà,de,de fait,donc,voilà,moi,je teste tout à chaque fois,quasiment,donc,voilà,enfin,pour le petit exemple,je voulais montrer un peu,que ça évite les erreurs,
00:49:59 :de faire des tests aussi,ouais,ouais,on sait faire une décorrégée rapidement,en fait,ouais,exactement,moi,j'ai,ça m'a sauvé la vie plein de fois,ça m'a permis de ne pas attendreet d'avoir les trucs,les problèmes au dernier moment,ça,c'est pratique.
00:50:14 :Des fois,ça permet aussi de pouvoir,euh,quand on travaille à plusieurs dessus,qu'il y en a un qui a modifié le code,euh,sans le vouloir,il y a une version précédente du code.
00:50:22 :Euh,après,moi,je ne sais pas si vous le faites,mais,j'ai,euh,en général,sur mes projets,moi,euh,par exemple,celui-là en particulier,donc,je peux le montrer,allez,je ne vous montre pas tout le code,mais en général,ah,là,j'ai un problème,par exemple,euh,
00:50:45 :quand je fais des pushes,des pulls,non,des pushes,via GitHub,voilà.Donc,là,donc,là,je suis sur une branche,euh,je suis sur une branche,donc,je ne teste pas quand je suis sur ma branche,puisque,sur ma branche,je teste manuellement,je teste juste quand je marche sur la branche main,
00:51:04 :en général.On ne voit plus ton écran,là,Gab.Ah,mince,c'est fermé.Euh,ok.C'est bon,là ?Ouais,là,c'est bon.Ouais,donc,là,je vais faire un petit test,ce qu'on appelle un action,ici,tac.
00:51:25 :Dès que je fais des pushes de mon code,tous mes tests,les tests,ils vont se déclencher,et sur GitHub.Euh,là,il faut que je regarde pourquoi,je n'ai pas fait gaffe,le dernier ne s'est pas déclenché,alors,à quelques minutes d'intervalle,euh,ouais,donc,j'ai dû oublier,
00:51:41 :oublier d'ajouter,voilà,une considération dans mon,je viens de savoir,dans mes settings,ici.Mes tests ne se déclenchent pas sur mes branches,sur une branche,sur ma branche main,et bien,ça va me déclencher un test.
00:51:52 :On va aller voir un qui a fonctionné,par exemple.On voit ici,que ça va me tester sur différentes versions de Python.Qu'est-ce qui va se passer ?
00:51:59 :En fait,ce qui se passe,c'est que,ici,ça me lance ce qu'on appelle un linter,donc,ça va aller me vérifier que mon,que mon code,entre guillemets,n'est pas dégueulasse.
00:52:09 :Genre,est-ce que je n'ai pas des imports inutilisés ?Est-ce que je n'ai pas des imports locaux ?Est-ce que je n'ai pas de variables inutilisées ?
00:52:14 :Euh,ici,vous voyez,il va me lancer que,je vais me vérifier que tous mes tests se passent bien,quoi.Voilà.Donc,voilà,quand ça se passe,moi,j'ai tout ça automatique,comme ça,je sais quand j'ai des problèmes,et que,mes tests s'installent tout seuls,en fait.
00:52:34 :D'accord.Donc,voilà.Bah,écoutez,je ne vais pas vous en retenir plus longtemps.Bon,j'espère que ça vous a plu,quand même,les mocs,même si ce n'est pas le sujet le plus passionnant du monde en Python.
00:52:45 :Je suis d'accord.Loin de là,c'est bien à faire.C'est intéressant,parce que,quand on réfléchit,on a pas mal de choses auxquelles ça peut s'appliquer,et ça permet de,ça permet d'éviter,par exemple,comme tu disais,que ça coûte cher quand tu utilises une intelligence artificielle,des choses comme ça.
Aucune occurrence trouvée pour « ».