Session de mentorat TOSA : POO - tests - api
Session du 28 novembre 2024 à 21h00
TOSA & Certifications
Qualité & Architecture
Librairie Standard & Modules
Programmation Orientée Objet (POO)
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Session de mentorat TOSA : POO - tests - api
Une session où l'on va créer une liste de course POO avec uniquement des EANS.
On aura une méthode capable de récupérer les informations sur le produit via une API. Pour ce faire, on va utiliser la "composition".
Nous allons mettre en place des tests basiques avec Unittest (librairie standard), et un mock pour l'appel l'api.
00:00:12 :J'avoue que non.Jamais ?Personnellement, non.Je ne sais pas comment ça marche pour l'instant, donc du coup...Que des noms ?J'ai tenté le TDD suite à la démonstration de Rachid, c'était le 19 et 26 septembre de TED, du coup il y a un exercice du TOSA que j'ai fait, je ne sais plus lequel, je me suis dit, je crois que c'est la liste de course de TED,
00:01:04 :Ok.Alors après, professionnellement, pas plus que ça, mais ça m'intéresse, je t'avouerai même que j'ai acheté un bouquin sur le TDD avec du Django, c'est un bouquin en anglais, il va falloir que je m'y colle, mais ouais, moi ça m'intéresse très fortement.
00:01:27 :Alors le TDD, c'est pas une religion pour tout le monde.Je sais bien, mais le fait d'avoir des tests, ça m'intéresse, pour avoir suivi une conversation de Thierry il y a quelques temps, qui expliquait qu'il y avait quelqu'un qui l'avait suivi, qui devait faire une migration Django, et qu'en fait il n'y avait aucun test dans le Django d'origine,
00:03:13 :Je déclenche mes tests avec ça. J'ai pas compris, vous déclenchez avec quoi ?Action, je tape action.Ah d'accord, oui, d'accord.D'accord.Que ça soit unitest ou pytest, peu importe, c'est la façon de faire. Je sais que pytest est à la mode, mais j'ai commencé avec unitest, et ça me suffisait très bien.
00:03:42 :Est-ce que ça a bien accepté ?Je sais pas si c'est bien réaliste ou pas encore.Ça a l'ai eu.Du coup je disais, là on va parler un peu de tests, de plusieurs choses, mais j'ai l'affinité de faire des tests, du coup je vais peut-être commencer.
00:04:12 :Là le but c'est pas de faire des tests de malade, c'est vraiment l'initiation au test, vous voyez à quoi ça ressemble de manière basique.On va partir sur une liste de courses. Est-ce que vous voyez bien mon écran ?
00:04:33 :Oui, c'est bon.Ok.Oui, parfait.On va partir sur une liste de courses assez basique, un peu comme on a pu voir sur les corrections, sur l'exercice d'offspring.
00:04:54 :Donc, si je pars, parce qu'on va parler en même temps, on va évoquer la composition en même temps.Accepté.Est-ce que celui-là il arrive à rejoindre ? Je ne le vois pas encore.
00:05:10 :Celui-là, je pense qu'il va arriver.Pourtant j'ai accepté, bizarre.Bon, je pense qu'il va rendre des connexions.Je vais continuer, c'est pas grave.Du coup, je disais, on va partir sur une liste assez simple.
00:05:32 :On va hériter de liste, un peu comme vous avez pu le faire sur l'exercice d'offspring pour ceux qui l'ont déjà fait.Donc, cette liste, elle aura comme attribut name, on va lui donner un nom, et on va bien sûr appeler, vous m'arrêtez un note super.
00:05:53 :Note super de init, et c'est parti.Donc, on va avoir le self, un name qui va être égal au name.Donc, on nous attribue un name pour avoir un nom à notre liste de course.
00:06:08 :Et maintenant, c'est parti, on va partir sur quelques méthodes.On est une petite classe pour au moins mettre en place quelques tests.Donc là, on va faire un add product, tout simplement.
00:06:22 :Et dans ce projet là, on ne va pas ajouter directement une pomme, une toile, un machin, on va ajouter des EAN.Donc, on n'aura que des EAN.
00:06:34 :Il faut savoir qu'à la fin, il faut que notre classe soit capable, en fonction de l'EAN, de nous dire ce que c'est.Est-ce que ça vous va ou pas ?
00:06:46 :L'EAN, c'est les code bars.Oui, oui, excusez-moi.Des formations fonctionnelles, tout le monde.C'est ce que j'allais dire, je sens une certaine inspiration.C'est ça, j'ai fait toute ma vie dans le commerce.
00:07:00 :J'ai commencé des bas des rayons jusqu'à contrôler l'objection.J'en ai juste travaillé en fait.Donc, EAN, c'est le code bar.Et avec ça, on va être capable de dire c'est tel produit.
00:07:14 :Mais on va rester quand même assez simple.Le but, c'est de faire une petite classe avec des tests à la fin.Même qui reste basique, mais juste pour voir à quoi ça ressemble les tests.
00:07:24 :Donc, on va rejeter un autre produit.Si l'EAN, il est déjà dans notre liste.On va le voir qu'une fois.On va lever une erreur.
00:07:35 :Je fais exprès de lever une erreur parce qu'on va tester l'erreur aussi.Et là, on va dire que l'EAN est déjà dans la liste.Et sinon, on ajoute l'EAN.
00:08:00 :Tout bête, vous m'arrêtez si vous avez un doute.Puisque si vous voyez que c'est une connerie, vous m'inquiétez aussi.Ça arrive.Ensuite, on va avoir une autre méthode où on va faire un remove de l'EAN.
00:08:17 :Donc c'est pareil.Et donc là, c'est si j'ai eu l'EAN qui est dans ma liste.On va tout simplement le supprimer.Et sinon, on va faire pareil.
00:08:38 :On va lever une erreur et on va mettre...EAN n'est pas dans la liste, simplement.Ça me paraît pas mal.N'est pas dans la liste.
00:08:57 :Voilà.Il y a une façon de faire pour afficher la liste.Moi, je trouvais ça original.Après, on peut très bien avoir une méthode particulière.
00:09:13 :Mais pour représenter l'objet en chaînes de caractère,ce que j'aime bien, c'est passer par la méthode Spring directement.Voilà.On va faire un retour.On va faire un petit join.
00:09:31 :On va faire un join.Les backtraces sont maximum.C'est ça.Baptiste, excuse-moi.Petite question sur ton self.remove dans Remove Products.Ça équivaut à un return ?
00:09:54 :Non, du tout.Ça va juste supprimer...Dis-moi.La question, c'est que si tu mets pas de return ou pas de caution de retour,ton raise sera toujours trigger ?
00:10:07 :Parce que j'ai oublié le else.D'accord.Voilà.Je savais pas si le remove faisait office de return pour ça.Non, du tout.Bien vu.Dans ta fonction du haut, pareil ?
00:10:24 :Oui, dans Reload Products, effectivement.Je me suis demandé si le raise faisait l'équivalent d'un break.De toute façon, si tu lèves une erreur, on aura pas le happen qui va se faire.
00:10:40 :Ça va s'arrêter là-bas.D'accord.Merci.Là, oui, j'ai pas de condition ici.C'est juste que si on arrive là, boum, c'est fini.Du coup, on va afficher notre liste de courses.
00:10:59 :Pour ça, on va faire un join de self.Si on a quelque chose dedans.Sinon, on va mettre liste.Voilà.En mode ternaire.Comme ça, on condense ça sur une seule ligne.
00:11:18 :C'est déjà pas mal.Et maintenant, j'aimerais bien pouvoir récupérer les infos des EAN.Je vous ai mis un lien.Je vous laisse regarder.Je sais pas si vous avez vu dans le chat.
00:11:32 :Il y a un lien que j'ai mis.Vous l'avez tous ou pas ?Un GitHub ?Dites-moi.OK.Et donc, en fait, je vais utiliser cette API-làpour aller chercher le produit pour savoir ce que c'est.
00:11:52 :C'est là qu'on va utiliser la compositionparce que le but, c'est de séparer les responsabilités.Ici, on a notre liste de courses.Mais on va créer une autre classequi va être responsable d'aller chercher les informations sur l'EAN.
00:12:13 :La liste en soi-même et l'API qui va aller chercher les informations.Donc, si je continue,on va repartir sur notre classe.On va l'appeler OpenFoodAPI.
00:12:32 :On va se faire un unique, pareil, avec Self.Et puis, on va se faire, tout simplement, Self.API.Ça va être égal.Donc là, il faut que j'importe.
00:12:47 :Maintenant.J'importe.C'est OpenFoodFacts.Donc ça, c'est le paquet que j'ai installé déjà avant.Je l'ai préparé avant.Je l'ai installé.Il n'est pas dans le librairie standard, bien sûr.
00:13:00 :Et ça me permet d'utiliser leur API pour récupérer les informations.Donc là, je vous les ai mis à doc.Le but, ce n'est pas de regarder la doc de ce API-là.
00:13:10 :Mais si vous voulez regarder, je vous ai mis la doc.Si ça vous intéresse.Donc, OpenFoodFacts.On va utiliser la classe API, ici.Et puis, on va mettre.
00:13:22 :Donc là, ils demandent d'avoir le user d'agent pour pouvoir l'utiliser.On va mettre Self qui est par défaut dans leur documentation.Donc, c'est ma SumUp.
00:13:32 :On ne m'embête pas.Hop.1.0.Et c'est parti.Donc, maintenant, on veut récupérer.On a l'API qui est prête.On va aller récupérer les informations.
00:13:45 :Donc là, on va se faire une méthode.GetProductDetails.Self.C'est une méthode d'instance.Et ici, on va envoyer l'EN.OK.Donc, pour avoir les détails,on va faire une variablequi va être égale à Self.API.
00:14:08 :Et dans l'API, en fait,il y a la méthode,c'est-à-dire la Product.Get.Et ici, on peut envoyer l'EN.Et on peut choisir les champs qu'on veut retourner.
00:14:23 :Donc, nous, on ne va pas trop s'embêter.On va juste récupérer le nom du produit.Tout ça, je ne sais pas.Je l'ai eu dans la doc.
00:14:33 :Je n'ai rien inventé.Et c'est IngredientsText.Et on va le mettre en anglais,comme c'est dans la doc.Et maintenant, on va retournerles informations,s'il y en a.
00:14:54 :Sinon, on va se mettre à trouver.Donc, voilà.Donc là, on a notre classequi nous permet de récupérer, du coup,les informations par rapport à un EN.
00:15:05 :Sauf que, du coup, ce qu'on va faire,c'est qu'on va faire une petite méthode dedans,dans notre liste directement,qui nous permet de récupérerles informations par rapport à un EN.
00:15:19 :Donc, GetProductDetails.Et ici, on va avoir Self.EN.Donc, c'est une chaîne de caractères.Et c'est là que ça va devenir intéressant.On va faire un return.
00:15:39 :Pour ça, il faut qu'on initialise,en fait, en attribut d'instance,notre API.Et là, je vais vous expliquer ce qu'on va faire.Food, on va l'appeler FoodFacts,est égal à OpenFoodAPI.
00:15:54 :Donc, je vais clairement retourneret je vous explique.Self.FoodFacts.Et on avait d'autres méthodes qui s'appelaientGetProductDetails, ici..GetProductDetails.Et on envoyait l'EN.Voilà.Donc, en gros, on sépare la responsabilité.
00:16:14 :On a la liste qui est ici.On a notre API qui est là.Et on ne fait pas tout dans la même classe,parce que sinon, on aurait une très très grosse classe.
00:16:25 :Et comme ça, en fait,ça ne nous oblige pas à toucher.Il y a l'API qui change,qu'on veut récupérer des informations différentes.On touche juste à l'API.
00:16:37 :On ne touche pas à cette classe-là.Donc là, c'est vraiment,on sépare les choses,les responsabilités.Donc là, ce que j'ai fait,c'est ce qu'on appelle de la composition.
00:16:51 :Est-ce que tout le monde connaît ou pas ?Non.Non, c'est du pattern design, ça.Non, on ne connaît pas.OK.Si on veut un peu de pattern,je ne sais pas si un weave,un petit peu quand même.
00:17:07 :Excuse-moi, Stéphane.En gros, ici, on a une relation forteentre nos deux classes.Ça veut dire que l'instance de cette classe-là,elle est créée en même temps que cette classe-là.
00:17:24 :Elle est créée dedans.On pourra très bien la créer plus tard dans une méthode.Mais on va rester simple.Donc en fait,l'instance de cette classe-là,elle n'existe pas sur cette classe-là.
00:17:36 :Donc là, on a de la composition.Si on supprime une instance,donc si on crée une instance de shopping list,ici, il y en a une instance qui va être créée,l'Open Food API.
00:17:45 :Si on supprime l'instance de shopping list,elle va être détruite aussi.OK ?Là, c'est de la composition.Est-ce que ça va ou pas ?
00:17:53 :Vous me dites.OK.Je vais justevous donner un exemple,vraiment plus simple.J'ai ici, par exemple, un composant.On va avoir un hit basique.
00:18:16 :On va faire ça.Ça va être très court.Un name ici.Hop.7.name est égal à name.Hop.Et ensuite, on aura la classe composite.
00:18:29 :OK.Et dedans, on va avoir, pareil,une unité.Hop là.Bon, je l'ai fait un peu là bas vite.Et ici, on va faire 7.composant
00:18:42 :est égal au composant.Et le nom, je ne sais pas, on va mettre...Peut-être qu'on s'en fout.Donc là, on a bienune composition, puisquesi je fais compositeest égal à composite.
00:19:04 :Ici, je crée en même tempsune instance de composants.Initialisé.Donc, je peux très bien faire maintenantune composite7.composantet j'ai mis un name.
00:19:26 :Donc là, il n'y a pas de problème.Donc là, je suis dans la composition.C'est créé en même temps.Après, si je supprime ici mon instance,c'est fini.
00:19:40 :Le composant n'existe plus.Ensuite, juste, je vais en parler,parce que ça existe aussi.Vous avez l'agrégation.Alors, l'agrégation, ça va être un peu différent.
00:19:50 :On va faire un exemple d'agrégation.On ne va pas modifier grand-chose.Ici, on va passercomposantet on va fairecomposant, sauf que le composant ici,on va le quitter si vous voulez,pour que ce soit plus clair.
00:20:08 :Et donc là, par exemple,vous allez avoir votre composantcomposant, je ne fais pas de fautes,qui va être égal à votre composant,composant, le name.
00:20:22 :Et quand vous allez créer votre composite,quand il y a injection de dépendance,c'est quand tu injectes des objets d'autre classedans une autre classe.
00:20:36 :Par exemple, on pourrait très bien avoir une listedans composite et ajouter des...Ouais, OK, ouais.Effectivement, on pourrait très bien avoirune liste en attribut de compositeet vouloir une entreprise,ajouter des instances de salariés, par exemple.
00:20:56 :Et donc là, c'est exactement ça.Ici, on ajouterait notre composant.Et donc, il suffirait qu'on supprime...Si on supprime le composite,le composant n'existe pas.
00:21:10 :Donc, agrégation, les deux peuvent exister,ils peuvent survivre individuellement.Quand on était dans le cas de la composition,le composant est créé en même temps que le composite.
00:21:21 :Est-ce que c'est bon pour vous, ou pas ?Ouais.S'il y a la question comme ça au Toza,là, vous marquez la blinde de points.
00:21:32 :Parce que ce ne sont pas des choses qu'on saitforcément tout de suite,ou qu'on n'aborde pas comme ça,sans savoir, je trouve.Je ne sais plus du coup où j'en étais.
00:21:42 :On va tester un peu notre classe,si elle fonctionne.Je vais l'appeler...J'aime bien avoir une ligne.GabList.Ça va être égal à ShoppingList.On va l'appeler comme ça.
00:21:59 :On va l'avoir là.Et on va se faire un GabList.J'ai préparé un EN que je vais noter.C'est 3, 6, 6, 4, 3,4, 3, 4, 6, 3,40, non, 40,489.
00:22:22 :1, 2, 3, 4, 5, 6,1, 2, 3, 4, 5, 6, 7, 8, 9,13. Ouais, c'est ça, il y en a 13.Et ensuite, on va se faire un...
00:22:34 :Et là, si ça ne marche pas, c'est que j'ai un bug.Donc là, on va utiliser le GetProductDetailsde notre classe qui est ici.Et franchement, on ne va pas s'embêter.
00:22:47 :On ne va pas s'embêter.Je vais passer bêtement le premier élémentde ma liste. J'en ai qu'un.Je n'ai pas créé de méthode exprès.Et donc là, on a envoyé l'ENdans notre liste.
00:23:02 :J'ai fait une erreur.Non, c'est bon.Donc là, vous voyez, on voit que c'estdu chocolat en poudre.Les ingrédients, j'ai dû faire une faute, peut-être,si je ne les avais pas.
00:23:17 :Ouais, pourtant...Où il les a pas trouvés, là, on ne sait rien.Parce qu'ils ne sont pas sur celui-là, je ne sais pas.On semblait que j'avais gagné.
00:23:28 :Vous pouvez peut-être demander les trucs en anglais.En anglais, vu que le nom est en français.Ouais, il me semblait que ça marchait.Je ne sais plus si...
00:23:37 :Ça existe au moins l'UFR, je ne pense pas.Ouais, si, c'est bon.C'est bon.Donc là, est-ce qu'il m'a bien mis, par contre,le chocolat en poudre ?
00:23:49 :Ingrédients de texte.OK. Product Name, chocolat en poudre.Ouais, c'est bon.Donc là, on a envoyé toutes les informationssur le produit.Bien sûr, la classe n'est pas très élaboréeparce que, du coup, je récupère le premier élémentcomme ça, un peu à l'arrache,mais c'était juste pour avoir l'idée
00:24:05 :et l'histoire d'avoir une petite API qui tournepour passer à la suite.Et maintenant, on va se mettre, du coup,les petits tests.Donc, quand vous faites des tests avec Unitest,vous pensez à renommer votre fichier.
00:24:22 :Il commencera par test.Et puis après, vous mettez ce que vous voulez,mais vous commencez par test.Sachant que quand vous faites ça avec PyTest,vous faites configurer.
00:24:30 :Enfin, il faut que ça soit configuré, c'est sûr.Mais avec Unitest, je ne sais pas, je n'utilise pas.Peut-être aussi, mais là, j'utilise PyTestde manière assez basiquepour vous initier à ça.
00:24:43 :Et donc là, je vais avoir mes testsde ma shopping list.Alors, on va commencer parimporter Unitest.Il fait partie de la librairie standard de Python.
00:24:57 :Du coup, c'est un petit clin d'œil pour Toza.S'il fait ça aussi, c'est parce queje crois que Toza l'a eu.Mais ils ont dû m'en parler, ça me dit quelque chose.
00:25:06 :Et c'est parti.Là, on va commencer à faire nos tests.Donc, on va avoir besoin, par contre,de nos tests.De notre classe...Shopping list.
00:25:22 :Et c'est parti.Donc, comment ça se passe ?On va commencer par créer une classe.On va l'appeler Test.C'est pareil, la classe commence par Test aussi.
00:25:34 :Donc, TestShoppingList.OK.Et on va utiliser...Je ne sais pas sur quoi j'ai cliqué.On va utiliser Unitest.TestCase.Il y a différentes classes dans Unitest.
00:25:47 :Mais même avec Django...Par défaut, pour ceux qui veulent faire Django,avec Django, c'est du Unitest.C'est du TestCase.Donc, voilà.On ne peut pas utiliser PyTest avec Django.
00:26:00 :Moi, j'utilise PyTest.Mais avec Django, par défaut, c'est du Unitest.Mais effectivement, il y a des librairiesqui s'appellent en plus PyTestDjango.Donc, j'utilisais Unitest au début,mais j'ai vu que ça change.
00:26:15 :Donc, là, c'est parti.On va vouloir, par exemple, tester.On va écrire nos tests dans des méthodes.Donc, là, on va bien nommer nos méthodes de test,qui commencent par test.
00:26:26 :Donc, DevTest.On avait la méthode Add,où on ajoutait un article.Un EN.Donc, c'est parti.Il faut qu'on initialise une liste pour la tester.
00:26:42 :Donc, vous allez voir,je fais exprès de faire un truc chiant,mais après, on va pouvoir simplifier tout ça.Une liste qu'on va appeler ShoppingList.
00:26:50 :Et puis, c'est parti.On va l'appeler Gabriel.Et c'est ça, ShoppingList.Et puis, on va se faire un GabList.AddProduct.Hop là.Alors, attendez, je vais me copier.
00:27:05 :Il n'y a pas un EN que je peux piquer ?Je vais enregistrer et copier par ici.Voilà.Je vais peut-être même me le mettre en...
00:27:15 :Voilà.Hop.Donc là, j'ai ajouté mon produit.Et maintenant, en fait,les tests se passent avec des asserts.Donc, on va faire un Self.Assert.Et ici, on va vérifier AssertIn.
00:27:31 :AssertIn, ça veut dire qu'on va vérifierque mon code barre,il est bien dans ma liste.OK ?Donc, pour lancer mes tests,on va lancer tous les tests.
00:27:44 :On va lancer mon terminal.Je ne pense pas que j'ai fait une erreur.On va voir.J'ai oublié un truc.Python.Donc, il y a le module Unitest.
00:27:52 :Et si on fait Entrée...Hop là.Donc là, c'est bon.Là, j'ai lancé mes tests.On voit que j'ai lancé un testet que ça fonctionne.
00:28:03 :Je vais me couper,si je vais trop vite.Sauf que, bien sûr...Alors, attendez,est-ce que j'ai adopté tous les us ?Oui.Le print qu'on voit sur ton test,il est automatique avec...
00:28:16 :le fait que tu fasses Unitestou c'est autre chose ?Parce qu'en fait,dans le code que tu as mis,je ne vois pas de printet je vois que tu l'as affiché quand mêmeà l'ingrédient ProductName.
00:28:26 :Oui, mais...Pourtant, je ne fais pas print dans ma classe.Avec Unitest, il me sembleque le print...Attends.Non, là, je n'ai pas de printdans les méthodes.
00:28:38 :C'est bon, je vérifie.Non, oui, avec Unitest,est-ce que c'est le dernier testqui te print ?Puisque je l'ai dans ma liste.Je ne sais plus...
00:28:50 :Pourquoi ?Enfin, je ne sais plusà quel moment il le print.De toute façon,je vais mettre d'autres testsen place.On va voir.
00:28:59 :Après, en plus,tu peux passerdans tes sous-commandesquand tu fais ton Unitestpour tout simplementdonner encore plusieurs bœufs.Enfin, tu peux afficherdifférentes choses,plus ou moins de choses,en fait, en plus.
00:29:13 :Mais je sais que...Je crois qu'avec MyTest,je ne les affiche pas,les éléments ici.Je peux compter une erreur.Et ce que j'allais dire,justement, par rapport à ça,c'est qu'en fait,il est possible...
00:29:29 :On va faire un clair.Parce que là,si j'avais, par exemple,10 tests,il en serait tous mes testsen même temps.Il est possiblede cibler ces tests.
00:29:38 :Si vous faites, par exemple,ici, un Unitest,test,c'est Shopping,un peu mieux,Shopping list.Voilà, on pourrait faire comme ça.Et ça ne ciblerait, en fait,que ce fichier de test là.
00:29:52 :Parce qu'en général,dans les projets Python,j'ai des paquetsavec plusieurs fichiers de test.Et on pourrait encorealler plus loinen allant ciblerla classe test Shopping,et ainsi de suite.
00:30:03 :Et après,encore cibler un test spécial.Voilà, ainsi de suite.On peut descendredans l'algorithme comme ça.C'est parti.Maintenant,on va envoyeret on va tester notre méthode.
00:30:18 :Là, vous allez voir le problème.Test.On avait quoi ?On va faire la RemoveMethod,par exemple.On ne va pas en mettretrop non plus des tests.
00:30:28 :Méthode.Et ici,c'est un peu chiant.Parce que, sur principe,il faudra que je créeencore une fois ma liste,donc GableList,ainsi de suite.
00:30:38 :Je n'ai pas envie.On va pouvoir faire çade manière plus dynamique.On va supprimerma liste qui est créée là.Et,je n'aurai pas le tempsde vous parler,parce qu'on voit le tempsqui passe.
00:30:53 :Il y a une méthode spécialequi s'appelleDef Setup.Ici,avecUnitest,qui est très pratique.Et ce qu'on peut faireavec ce Setup,on va initier un attribut,ici,qu'on va appeler GableList,et qui va être égalà notre ShoppingList,qu'on va rappelerGableL.
00:31:20 :Je vais refaire un petit coupde terminal.Et là, vous allez voirque ça marche quand même.J'ai oublié un truc.Qu'est-ce que j'ai fait ?
00:31:36 :Ah oui.Hop là.Et là,on va voirqu'est-ce que j'ai fait.Et là,on va voirqu'est-ce que j'ai fait.Hop là.On va laisser en français.
00:31:52 :C'est sûr,on va prendre Fouillard.Et normalement,c'est bon.Et si je ne regarde pas,ça ne va pas le faire.Hop.M-U-N-I-T-E-S-T.Donc là,j'ai lancé deux tests.
00:32:06 :Il y en a un.Il est vide.Mais tous mes tests,ils passent.Vous voyez que maintenant,ce qui va être super pratique,c'est quand on va vérifiernotre émoule,on va pouvoirne pas avoir besoinde redéfinir notre listeà chaque foispuisqu'à chaque début de méthode,en fait,
00:32:22 :on va avoir le setupqui va être appeléà chaque début de méthode.Ce n'est pas une seule foispour toutes les méthodes.C'est à chaque début de testqui va se lancer,on va avoir le setupqui va être fait.
00:32:31 :Donc là,on va faire un Add Product.Ensuite,on va faireunHop là.Et là,on va faireici,c'était,on avait prévu en juinque c'était Remove.
00:32:50 :Remove Product.C'est ça.Et ensuite,on peut faire unpour voir si notre liste,elle est vide.On peut faire unAssert False.Alors,vous voyez quec'est çaque je voulais vous montrer.
00:33:03 :En fait,il n'y a rien de compliquédans les testsparce qu'il y a tout ce qu'il faut.Regardez un petit peudu regex,noteIn,noteEqual,noteInInstance,des logs,listEqual,listEqual,isIn,enfin,il y a vraiment de tout.
00:33:18 :Donc,voilà.Donc là,on va faire un Assert Falseparce que notre liste,elle va être évaluéeà Falsepuisqu'elle est videsi on a raison.
00:33:31 :Et c'est parti.J'ai besoin que j'apprennele raccourci pour faire ça.Puis tonMiniTest.Hop là.Donc là,c'est bon.OK.On a bien le Removequi s'est faitet le Removeet le Addqui sont passés.
00:33:53 :Maintenant,si vous vous souvenez bien,on veut tester le casoùon a une Value Errorpar exemple.Et donc,c'est tout à fait possible.
00:34:03 :On peut tout tester.Vous allez voir,c'est super bien.Alors,l'importance de faire des testsaussi,c'est qu'il était largedans la vue de fait.
00:34:11 :C'est bon.Par exemple,au tout début,le premier projet,je n'en faisais pas forcément beaucoup.Et puis,j'ai décidé de le mettre en placeune fois sur l'application.
00:34:22 :Donc, c'était les projets en local.Je lance tous mes testset en fait,c'est de làque vous allez détecterla blinde de problèmesselon les cas.
00:34:32 :Vous testez tous les cas.Et là,j'ai tellement testé le casque je n'y avais pas penséet je me suis diten fait,les tests,c'est super pratique.
00:34:40 :Et donc ici,on va testersi l'erreur se laisse bien.Donc,il faut qu'on soit bien explicitedans le nom des méthodes.Si on fait unwith duplicate,on ne peut pas avoirdeux fois le même EAN.
00:34:52 :Et donc,on va se faire un...Hop là.Ça,on va se faire copier.Hop là.Tac.Et vous allez voirque pour ceux qui font du pytest,ça se fait aussi avec des asserts.
00:35:08 :Vous n'allez pas être perdu.Si vous commencez un E-testet que vous passez sur pytest,vous ne serez pas trop perdu.Il y a juste quand mêmedes façons de faireavec des fixturesqui sont différentes,mais ça devrait aller.
00:35:18 :Et donc,pour vérifier si on a bienici,une erreur qui est levée,on peut utiliserun context manager.On va faire un assertraise.
00:35:30 :Ça existe de quoi avec pytest ?C'est ça.Et ici,on avait dit que ça devaitune value error.Tac.Etje vais rappeler,du coup,je vais refaireun rappelà la méthode addProductavec les mêmes E&N.
00:35:47 :Donc, c'est parti.Et on va voirsi j'ai une erreur ou pas.Les trois tests y passent.Les trois tests y passent.Moi qu'à chaque fois,tu tapes directementdans le terminalpython-unitest.
00:36:04 :Oui.Alors,il y a une façon de faireavec unitestet tu le trouvesdans un ifun m égalemême,je ne sais plus comment ils font.
00:36:13 :Ouais,tu peux lancer,en fait,unitest.Oui,justement,dans un script directement,c'est pas moyen que ça marche.Si, si, si.Je ne fais jamais comme ça,mais ça se fait.
00:36:24 :Tu fais toujours çadans le terminal.Ouais,j'avoue.Mais sinon,oui,ça se fait dans le script.Tu fais un,je ne sais plus,je crois que c'est unitest.
00:36:34 :Ouais,c'est ça,tu lances comme ça.Donc là,vous avez vu qu'on peut tester,donc ici,si c'est bien,du coup,c'est value à false.
00:36:43 :Si c'est bien dedans,si on a bien levé l'erreur,on teste les erreurs.Donc,voilà.Et,alors,il y a une chosequi est assez importanteavec les API,c'est quequand vous testez l'API,vous ne pouvez pas forcémentvous permettre,parce que là,du coup,elle va aller chercher
00:37:00 :sur Internet l'API ici.Vous ne pouvez pas vous permettre,en fait,dans vos tests,de tester l'API.Donc,vous ne pouvez pas,en fait,dans vos tests,d'aller tout le tempschercher sur Internet.
00:37:11 :C'est sur ces trucsqui sont longs,sur ces trucs qui sont coûteux,parce que,par exemple,l'API Google,c'est payant.Donc,si vous déclenchez vos testsassez souvent,ben,ça peut vous coûter cher.
00:37:23 :Ça peut être long.Si il y a des problèmesde réseau,ben,ça peut être galère aussi.Donc là,il y a ce qu'on appellele mock.
00:37:31 :Le mock,en fait,c'est,on va remplacer,on va refondre le comportementd'un objetde manière contrôlée,en fait.Vous allez voir,en fait,on ne veut pas dépendrede l'API quand on teste.
00:37:43 :On ne veut pas testerl'API elle-mêmeparce que ce n'est pasnotre responsabilité à nous.On veut tester différents casde manière rapide.Bon,là,on va en faire qu'unparce qu'on n'a pas trop le temps.
00:37:53 :Mais le but,c'est de tester l'API,ses différentes réactionsde l'API.Dans le cas,on va en faire une,le cas où on voit bienquelque chose.
00:38:01 :Après,vous allez me dire,ouais,si l'API change,on peut se mettre au courantde ce qui peut se fairedans le cas des changements.
00:38:08 :Je sais qu'il y ades tests de régression,des tests de monitoringqui se fontpour voir si l'API a changéet tout.Mais vraiment,dans vos tests,vous ne testez pasl'API elle-même.
00:38:19 :Donc,j'ai un freeze,c'est bon,ça revient,OK.Pour tester l'API,ici,comment je vais le faire ?On va faire çaavec un mocket patch,ouais.
00:38:31 :Hop,on va faire autrement,du coup,on va fairechrome unitestmock,comment ça s'appelleun mock ?On va importerla classe mocket la classe patch.
00:38:43 :La classe mock,on verra si ça s'en sert.Peut-être pas le temps,je vais tester ici.Donc,des mocks,vous pouvez en faireà la main.
00:38:51 :Vous pouvez très bien diresi vous...Vous pouvez très bien,par exemple,si il y a un exempleque Thierry avait faitil n'y a pas très longtempset qu'il n'y avait pasd'API,que Thierry avait faitil n'y a pas très longtempset qui est très explicite,vous pouvez très bien
00:39:04 :vous dire,je ne vais pas vraiment le faire,mais si vous importezrandom,si c'est random.random,vous pouvez très bien vous direqu'elle va être égale à...
00:39:11 :Vous pouvez sauvegarderl'état de random,par exemple,je ne sais pas,donc ça,ça va être égalàaurielrandom.Donc là,c'est l'inverse,je ne sais pas ce que je fous.
00:39:23 :Random,c'est l'étatde random.Donc,si vous importezrandom.random,en fait,vous allez,par exemple,pouvoir icisauvegarderen mémoirevraimentrandom ici.Ensuite,vous allez pouvoirvous écrire,je ne sais pas,une fonctionqui retournetout le temps1.
00:39:45 :Voilà,si vous avez envie.Et puis,vous allez pouvoiraffecter,en fait,à randomla fonctionqui retournetout le temps1.Voilà,si vous avez envie.
00:39:58 :La fonctionqui retourne1.Et comme ça,dans votre test,vous avez toujours une fonctionqui retourne 1.Et puis,après,à la finde ce que vous voulez faire,vous pouvezréattribuerà randomla vraie fonctionrandom.
00:40:14 :Est-ce que ça vaou pas ?Ou ça va trop vite ?Vous me dites.OK.Mais ça,il y a un mentoratqui fait très,très bien.
00:40:29 :Donc,il fait ça avec random.On peut sauvegarder random.On lui attribueune autre fonction.Et après,on remetle vrai random.Mais,je vous rassure,c'est très rapidede faire çaen réalitéavec ce qu'on appelleun mock.
00:40:45 :Donc ici,par exemple,je vais créerEn vrai,j'aurais pu créerun test à part.C'est pas bien.Je vais fairedans une fonction iciune méthodedu même test.
00:41:03 :Mais honnêtement,je pense quec'est même sûrque je feraiune phase de test à part.On va simplifier à vie.Donc là,on peut utiliserle décorateur patch.
00:41:12 :On vaavoir du coupOui,c'est bien ça.On va appelerdans notre moduleMain.OpenFoodAPIDonc Main.OpenFoodAPIOn va aller chercherGetProductDetailsDonc là,on a fait notre patch.
00:41:49 :Et ensuite,on va testerGetProductDetailsEt puis,on peut se rajouterun petit API ici.Bien que ça,comme je l'ai dit,je l'aurais faitdans une classe à part.
00:42:04 :Et voilà.Donc on a notre self.Et ici,on va avoir notre mock.GetProductDetailsDonc là,on prépare notre mock.Ce qui va se passer,en fait,le décorateur gère tout.
00:42:23 :Il va aller chercher,il va bien aller cherchernotre méthode qui est là.Et on va joueravec notre paramètrequi est ici.On va pouvoir faireun return value.
00:42:35 :Et ici,on va aller fairel'API retentesous forme d'un dictionnaire.Ça c'est une liste.Génial.Voilà.Sous forme d'un dictionnaire.On avait quoi tout à l'heureen valeur ?
00:42:48 :Je ne sais plus.On va garderque le ProductName.On ne va pas tropse salauder la tâche là.Pour l'exemple.Ici,on va copier ça,par exemple.
00:43:01 :Commencer.Et voilà.Et en fait,on dit quereturn value.Voilà.Que notre API,elle nous retourne çadans le mock.Et maintenant,si je fais unself.assert
00:43:22 :equalet je vais faire un self.Il faut faire çaavec la tête de testparce qu'on va utiliserma liste.Gablist.getProductDetailsC'est le même code barreque j'avais pris.
00:43:40 :Si je mets mon code barre iciet ça va être égal ànotre dictionnairequi est ici.On copie.On ne va pas s'embêter.Normalement,je pense que je n'ai pasfait de bêtises.
00:44:04 :On peut relancer le test.Le terminal,il est où ?Je ne sais pas.Je pense que j'ai fait une erreur.Même pas.Ici,vous n'avez pas de risquede surcoût sur une API payante.
00:44:22 :Risque de lenteurparce que vous avez moquéla vraie APIqui va sur Internet ici.Je le répète.main.openfootapi.getProductDetailsIci,on lui a fait retournerla valeur qu'on voulaitque ça retourne.
00:44:42 :Là, ça part un peu débileparce qu'on est sûrque c'est un test.Mais imaginezque vous voulez testerpar exemple quevotre API peut retournerdifférentes choses,des erreurs, des machins.
00:44:54 :Donc là,vous amusez à lui faireun retour de valuedes erreurset après de voircomment votre objetva réagirdans des scénariosplus complexes.
00:45:04 :Mais là,le but,c'était vraimentde vous montrerdes tests très basiques.En fait,il n'y a pas besoinde faire des tests de fou.
00:45:12 :Il y a déjà pleindans les asserts,pas mal de chosesqui sont disponiblescomme vous pouvez le voir.Et ça permetde mettre des petits testsen place.
00:45:22 :Je n'aurai pas le tempsde vous montrerles tests que j'ai missur un projet Djangopar exemple,qui sont quand mêmeplus complexesparce que j'ai vérifiés'il y a des mailsqui sont envoyéset ainsi de suite.
00:45:33 :Mais déjà,sur des méthodesqui font des modificationspar exemplede base de données,en cinq ou six lignes,c'est fait.Et c'est le même principeque ça.
00:45:42 :Et donc,j'ai fait un mockque je voulais vous montrerqui est une chosequi fait un peu peur aux gens.Mais là,vous avez vu qu'honnêtement,on a utiliséune test.mock.
00:45:51 :Je n'ai pas fait un mockdirect d'ailleursqui n'était pas très conseillé.J'ai utilisé le patchen décorateur.J'envoie ce que je veuxaller mocker.
00:45:58 :J'utilise iciun paramètreet puis je metsla valeur que je veuxet puis après,je fais mon test.Voilà.Est-ce que ça vapour vous ou pas ?
00:46:07 :Ou j'ai un peu abusé ?C'était un peu troppour vous.Donc,j'ai utiliséun paramètreet puis j'ai faitun test.mock.C'était un peu tropcondensépour le temps qu'on avaitou ça va ?
00:46:19 :Non, ça va.OK.L'avantage,c'est qu'il y a le replaydonc c'est parfait.Oui.En plus,j'ai fait viteparce que j'ai un rendez-vouslà à 22 heures.
00:46:29 :C'est pour çaque j'ai faitde condenser un petit peumaisje pense que ça devrait aller.OK.Ça vous a plu ?Est-ce que les tests,du coup,ça vous les a un peudémystifiéspour ceuxqui ne connaissent pasl'API ?
00:46:43 :Juste une toute petitequestion rapide.Je pense avoir la réponsemais je vais être sûr.Tu nous as ditpour le testProduct Details API,normalement,tu aurais fait çadans une autre classe.
00:46:53 :Oui.Parce que l'API,c'est une autre classeou c'est justeune question de pratique ?Non.En fait,j'ai réfléchiun peu tout haut.Là,comme ça,en fait,je ne sais pasparce que d'un côté,d'un côté,ici,je teste ma listeavec l'API.
00:47:11 :Donc,je ne sais pas,en fait.Pour un petit scriptcomme ça,non,pour moi,ça suffiraitde la mettre ici.Ce n'est pasune règle spécifique.
00:47:22 :Non,non,non.C'est toiqui organisecomme tu veuxet en plus,c'est vraimentde la compositionutiliséedans la mêmeclasse de test.Pourquoi pas ?
00:47:35 :En fait,c'est pas si con que ça.Bon,puis là,ici,en fait,pour chaque méthode,on a un test unitairequasiment.Ok.Il est quelle heure ?
00:47:46 :Est-ce que j'ai temps ?Je ne sais passi j'ai un projetavec des tests.Je n'en ai pasvraiment.Parce que moi,j'ai testé,par exemple,que ma partie,la partie sensiblede mon projet.
00:47:58 :J'avais une partie sensiblede mon projet.Test,ici.Donc,là,j'ai une partie sensiblede mon projet.Donc,là,ici,en fait,alors,ça,c'est avec PyTest.
00:48:13 :Et j'utilise mêmed'autres choses que PyTest.J'utilise les factorieset ainsi de suite.Ici,en fait,je me créece qu'on appelledes fixtures.Donc,c'est des objetsque je peux réutiliser.
00:48:25 :C'est des classes,des instancesque je peux réutiliserdans mes tests.Et en fait,les tests,bon,là,ils sont très basiques.Ici,j'utilise les Angots.
00:48:36 :Et en fait,il faut que mes facturesse mettent un jours'ils changent les services,s'ils suppriment des servicesd'une facture,ainsi de suite.Il y a quand mêmebeaucoup de logique.
00:48:45 :Et donc,du coup,tout ce qui estpartie logique,en fait,j'ai mis des testssur tout.Voilà.Et là,encore,enfin,là,il n'y a rien sur un projetoù il n'y a pas beaucoup de testsparce qu'il n'y a pas énormémentde logique.
00:49:01 :C'est mon site perso,donc ça va encore.Mais voilà,c'est con que je n'ai pasun...Ah ouais,celui-là.Celui-là,c'était mon projetde fin d'étudeentre guillemetsoù Thibaut,il l'avait adoréparce qu'il avait essayéde me le craquer,il n'avait pas réussi.
00:49:17 :Il avait faimde me faire bugger.Il avait réussià trouver un bug,je crois.Et celui-là,j'avais carrémentmais complètementété dans l'abussur les tests,je crois.
00:49:28 :Ouais.Bon,voilà.Là,il y a quand mêmeplus de tests.Et encore,donc là,vous voyez,c'est le truc basique.Il y avait un panier,un panier...
00:49:40 :L'utilisateur avait un panier,il voulait acheter quelque chose.Eh bien,je faisais justeun insert égalesi quand je comptaisle nombre d'élémentsqu'il y avait dedans,c'était bien égalà 1,par exemple.
00:49:51 :Voilà.Et donc,j'ai mis des testsun petit peu comme çapartout.Je ne sais plusce que j'aicomme application.Account,qui est là.
00:50:01 :Le shop,c'est là.Le shop.Ça,c'était projet.Ouais,j'ai le store ici.Est-ce que le store,j'avais des tests dedans ?Est-ce que c'estça que j'ai mis ?
00:50:12 :Test view.Bon,voilà.Il y a pas mal de...Il y a pas malde choses ici,vous voyez.Mais au final,il n'y a pasautant de lignesque ça,au final.
00:50:24 :Mais ça,c'était vraimentdes chosesoù je débutais,où c'était mes premiers tests.Mais déjà,en tenez-vousà faire des testset après,vous allez mettre ça en placeet puis ça vase faire fonctionner,franchement.
00:50:38 :Donc,voilà.Si je vous montrais les testssur mes derniers projets,là,ça serait autre chose,pas ?Oui ?Non,c'est moi,mais c'étaitle mauvais bouton.
00:50:50 :Désolé.Il n'y a pas de souci.Il n'y a pas de souci.Je vais juste arrêterla présentation.Il est...Quelqu'un,à l'heure,s'il vous plaît ?
00:50:59 :Il est à 54.OK,désolé,j'étais un peu bavardsur la fin.Je n'ai pas...Mais vous voyez,en fait,c'est un coup à prendre.
00:51:08 :Et tout le mondea cette sensationde je ne teste pas,je ne sais pas trop faireet puis,certains,ça ne sert pasà grand-chose,mais faites-leparce que moi,ça m'a sauvé la misequand mêmepas mal de fois.
00:51:21 :J'ai évitéles petites erreurs.Donc,voilà.Ça vous a plu ?Oui,génial.Bien.OK,merci beaucoup,Gabriel.Merci à vous.Merci à vous.Merci,Gabriel.
00:51:36 :C'était vraiment intéressant,alors.OK,génial.Ben,c'est le MOC,je voulais vous en parler aussi.C'est des chosesqui sont des plus avancéesdans le testing.
00:51:46 :Ça,c'est des chosesoù des recruteurs,ils peuvent vous en parler.Est-ce que vous savezce que c'est un MOC ?Si vous savez le faire,c'est encore mieux,mais vous avez vu un exempleassez basiquede MOC.
00:51:57 :Donc,c'est un MOCquand même.Donc,le test est passéet on a bien moquél'API.Voilà.On a mis des petits testsen place.
00:52:07 :Donc,voilà,tout le monde,écoutez.Merci beaucoup.Plus de questionsque vous laissez.Merci,bonne soirée.Bonne soirée.Merci,bien.Au revoir.Sur ce,bonne soirée à tous.
00:52:22 :Si vous avez des remarques,envoyez-moi un message privé.Si vous avez des remarquesque des fois c'est trop long,il n'y a pas de souci,je peux adapter.
Aucune occurrence trouvée pour « ».
Bravo, tu es prêt à passer à la suite