Session du 05 décembre 2024 à 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
Tests Python avancés avec unittest et pytest
Exploration pratique des tests automatisés en Python avec unittest et une introduction à pytest, incluant setup, teardown et mocks d’API.
00:00:00 :Et voilà, je vais regarder mon écran.Bon je vais vous partager ça, vous allez me dire si ça vous va au niveau de la taille.
00:00:12 :Hop!Il faut faire plein de motifs à la con si vous venez de me dire.Hop là!C'est trop petit?Il faut que vous agrandisse ou pas?
00:00:24 :Un petit poil.Et là?Ouais c'est bon.C'est bon?Ouais c'est bon.Vous vous souvenez du coup de la fois dernière, on avait une liste.
00:00:41 :On va reprendre là dessus en fait, parce que du coup je n'ai pas totalement fini de parler de Païtès,parce qu'il y a quand même une chose importante que je voulais voir aussi.
00:00:50 :Unité, excusez-moi.Et du coup, ce qu'on testait en fait c'est une petite liste qu'on avait.Si vous vous souvenez, on pouvait ajouter un produit, un EAN, on pouvait le supprimer.
00:01:06 :Et on pouvait récupérer les détails d'un produit par rapport à son EAN.Par rapport à son EAN, parce qu'on avait une API ici, on avait des appels API.
00:01:17 :Donc on utilisait de la composition, on ouvrait de la composition.Ou du coup, on avait cette classe là qui nous permettait en fait de faire des appels API.
00:01:29 :Et qu'on utilisait dans une méthode ici, dans cette méthode là, de cette classe ShoppingList.Est-ce que pour l'instant ça va? C'est bon?Ouais.Ça va, merci.
00:01:43 :Ok. Et on s'était arrêté là.On avait mis les tests en place.Qu'on lançait avec la commande.Unitest.C'était ok.Et donc, ça marchait comme ça du coup.
00:02:10 :On avait nos tests, mais au lieu de recréer la liste à chaque fois, à chaque test.Parce que si on crée une liste dans le test, elle est valable que pour la méthode en question.
00:02:19 :Donc on avait utilisé la méthode Setup ici.Qui permettait en fait de réutiliser du coup la liste dans chaque test.Et on avait fait un mock de l'API en fait.
00:02:38 :Pour qu'elle nous retourne l'information qu'on voulait.Donc ça on avait déjà vu.Donc si vous vous souvenez.Donc le Setup, j'avais dit en gros.Et le Teardown, en fait le Setup.
00:02:51 :Le Teardown on n'avait pas vu.Le Setup du coup il permettait en fait de faire, comme ça on l'indique, un Setup avant chaque méthode de test.
00:02:59 :Pour ici par exemple initialiser une instance de notre ShoppingList.Et c'est appelé donc avant chaque méthode de test.Parce que si je fais le test, là j'ai fait un print.
00:03:13 :Donc si je relance.Je fais mon Python.unit.test.On voit que j'ai un Setup avant chaque test.Mais j'ai aussi un nettoyage après chaque test.En fait c'est le Teardown, ça on ne l'avait pas vu.
00:03:30 :Teardown permet de faire un nettoyage après chaque test.Pour l'instant on ne nettoie rien en soi.Parce que je n'ai pas forcément de choses à nettoyer.
00:03:40 :Mais il faut savoir qu'on peut avoir des opérations de nettoyage ici.On va le voir après avec PyTest un peu plus le nettoyage.Je ne sais pas si ça vous a choqué.
00:03:53 :Mais Setup et Teardown, la façon de les créer est un peu bizarre.On ne dirait pas du Python en fait.En fait unitest ça a été forké du framework JUnit.
00:04:12 :Si je ne dis pas de conneries, ça vient du Java.Ça date du coup et ils ont laissé ça.Ça fait très longtemps que c'est comme ça.
00:04:20 :Du coup on n'y a pas retouché depuis.Donc c'est resté comme ça.Est-ce que je...Ce que j'ai dit pour l'instant ça va, c'est bon ?
00:04:30 :Dites-moi si...Ok.Et qu'est-ce que je voulais faire en plus du coup ?J'ai oublié.Ouais, alors c'est bon.On va faire un truc.Pour vous montrer l'opération de nettoyage.
00:04:47 :Je vais créer ici un petit...Hop là.Un fichier.Je vais l'appeler 5.Paramètres fonctions dedans.Et je vais acheter un test.Donc par exemple, là clairement c'est inutile,mais c'est pour bien montrer comment ça fonctionne.
00:05:08 :On n'a pas l'utilité ici de le faire,mais c'est pour montrer vraiment l'utilité du setup et du teardown.On peut très bien...Donc moi ça m'est déjà arrivé sur des applicationsau début d'un test,de créer une image par exemple.
00:05:22 :Donc c'est parti.On va créer une image avec pile.Pile à où ?C'est la classe image comme ça.Et on va créer une fonctionqui va nous permettrede créer une image.
00:05:40 :Voilà.Donc on va faire ce qui est le plus basique.L'image ça va êtrel'image.newen RGB.Et ça va être du 600sur 600, on s'en fout un peu en fait au final.
00:05:56 :Et là on va faire un...Moi je prends Save.Et ça va être un PNG tout simplement.Hop !Donc là j'ai ma fonction pour l'image.
00:06:10 :Donc par exemple, si dans le setup,au niveau de chaque...Enfin au niveau de mon setup, je vais faire un...Alors ici déjà, on va peut-être l'importer.
00:06:20 :Et là vous allez voir,ici donc je vais faireun petit test.Et si je lance les tests,si je lance les tests,on va se faire un petit test.
00:06:41 :Et voilà, ici j'ai une super image créée.Donc chaque fois,là ce qu'il faut savoir c'est que c'est la...À chaque fois il me crée une image à chaque test en fait.
00:06:59 :Donc imaginez qu'avec Django ça pourrait être problématiquesi vous créez une image à...Comment dire ?Si vous le faites entre guillemets mal par exemple,vous l'envoyez dans le dossier média, ça pourrait créer plusieurs images.
00:07:13 :Bon là on a une image,on s'en fiche, on va la supprimer.Et vous allez voir...Tac, elle est là.Et...On va faire quelque chose, on va importer en plus...
00:07:26 :On va importer OS.Et vous allez voir que du coup ici par exemple,je peux très bien faire un OS.remove.Je crois que c'est remove direct il me semble.
00:07:38 :Je ne suis tellement pas d'habitude..pngEt là vous allez voir que ça va aller tellement vitequ'on ne va pas la voir à la limite se créer et supprimer.
00:07:51 :Unitest, hop, tac.Et là l'image on ne la voit même pas,mais en fait elle s'est créée plusieurs fois et elle s'est supprimée plusieurs fois.
00:08:00 :Ok, pour l'instant c'est bon ?Est-ce que tu l'as émis ?Si tu le fais, est-ce que tu peux mettre un skip ?Qu'on voie bien le truc ?
00:08:08 :Tu veux que je fasse quoi ?Mettre un time skip.Au niveau de mon...Au niveau de mon cardan.Comme ça on peut le voir le truc.
00:08:18 :Ouais, avant le remove à ce moment là ?Voilà, ouais.Attends, j'importe tout comme un bourrin,pas dans l'ordre.C'est time ou datetime ?Tac.
00:08:32 :Et avant le remove, on va faire un petittime.slipet 100 secondes par exemple.Ouais, c'est peut-être beaucoup, je ne sais pas.Bon allez, on va lancer ça comme ça.
00:08:42 :Hop.Unitest.Elle a bien supprimé.Voilà.Donc,bonne idée Stéphane.C'est time.slip.C'est souvent utilisé en plus.C'est souvent utilisé pour ça, pour ce genre de choses.
00:09:17 :Maintenant, il y a aussi unsouci, c'est que des foison n'aurait pas forcément besoin decréer l'image avant chaque testparce que du coup c'est un peu plus gourmand en ressources.
00:09:29 :Parce que des fois, si vous avez plein de choses,si vous faites un setup, vous vous appelez à chaque foisles choses et vous faites un teardownaprès chaque méthode de test,ça peut devenir assez viteinfernal.
00:09:41 :Du coup,du coup, du coup,on peut fairece qu'on appelle un setupde classe.Donc là,déjà pour commencer,c'est une classe méthode.On va faireun setup de classe.
00:10:01 :Ici,je vais faire unjuste pour vous montrer.C'est un setupde la classe.Ok.On ne va pas s'embêter avec tout ça.Et on va faire, sur le même principe,avant de passer au test, je voulais vous montrer ça.
00:10:21 :On va faire un teardownde classe.Je ne vais pas laisser le typage.Pour l'instant, on ne va pas s'embêter avec ça.Et je vais mettrenettoyage de laclasse. Ok.
00:10:37 :Et là, c'est parti.Tac.À chaque fois, je viens de passer au pay test.Fini test.Et là, si vous regardez mon print,si vous regardez mon print,j'ai bien le setupde la classe,mes setups, nettoyage de chaque fois,et le nettoyage de la classe.
00:10:59 :Vous n'êtes pas obligé de tout faireà chaque méthode. Il faut le faire une fois au début,une fois à la fin.Est-ce que pour ça, c'est bon ?
00:11:07 :Ok.Est-ce qu'on passe au pay test ou pas ?Est-ce que ça vous tente ?Oui.Maintenant que tu n'as pas la labre à boire,il faut la faire boire.
00:11:25 :Non mais du coup,l'initiation au test, pour vous, c'est bon.Vous vous souvenez un petit peu des asserts qu'on a fait ici ?Il n'y a pas de soucis ?
00:11:33 :Vous me dites, si jamaisça va trop vite.Ok. Je vais passer sursur pay test.À ce moment-là, on va gardernotre projet de liste.
00:11:47 :Je vais garder mon image.À ce moment-là.Et par contre,je vais garder mon patch.Je vais garder ma shopping list.Je vais peut-être le garder aussi.
00:12:01 :Time, on ne va pas le garder.On s'en fiche pour l'instant.Unitest, on ne va pas le garder toujours.Voilà.Et puis, on va effacercarrément.
00:12:13 :On va repartir de zéro.On va partir propre.Ainsi. Voilà.Et donc,le but maintenant, c'est qu'il fautdu coup,parce que là, on a vu Unitest qui a une librairiej'enregistre au fait la réunion.
00:12:31 :C'est une librairiestandard Unitest, mais on va utiliserdu coup une librairie tierceque j'aimebeaucouppay test.Ok.Il suffit de l'installer, pas de problème.
00:12:47 :Un petit peu install pay test.Et en fait, pourquoij'aime bien pay test ?A la base, moi j'étaisUnitest parce quej'avais appris comme ça.
00:12:59 :Et il faut savoir que Unitest, c'est le frameworkde...C'est ce qu'on utilisait en fait avec Django de base.Voilà. Quand vous allez dans vos fichiers de test,
00:13:07 :ce qui est intégré à Django, c'est Unitest.Ils ont un peu modifié le trucavec Django, mais c'est Unitest.Il faut savoir après, pour ceux qui s'intéressent,qu'il existe pay test Django.
00:13:17 :Donc, on m'a parléil y a un moment déjàque je passais dessus de pay testet on m'a clairement dit,pour rigoler, tu peux désapprendre Unitest.
00:13:27 :Et finalement,j'ai compris parce quej'étais carrément convaincu de pay testet je vais vous montrerpourquoi.Est-ce que je commence avec les fixtures ou pas ?
00:13:41 :Ouais, on a déjà vu ça tout à l'heure.Donc, on va créer un fichier iciqu'on va appelerun fichiercomptest.payVoilà.On va importer pay test.
00:14:01 :Et maintenant,on va faire ce qu'on appelleune simple fixture.Et vous allez comprendre ce que c'est.J'y viens.Une fixture.Et cette fixture, on vacomme tout à l'heure, vous vous souvenez,on avait dans notre setupune listequ'on initialisait et la liste,en fait, on l'a créée par chaque méthode.
00:14:29 :Là, en fait, ça va être pareil avecpay test.Un peu différent. Là, je vais créer ma liste.Donc, ça va êtreshoppinglist. Normalement,
00:14:43 :je peux l'importer, je crois queVS Code aussi, c'est comme Patreon.Ok, mais le sélectionne pas.Bon, c'est pas grave, c'est dansfrom mainmainimportshopping list. Voilà.
00:15:01 :Et on va l'appeler, du coup,voilà.Donc là,j'ai ma liste icidans ma fixture. Maintenant,je vais entrer sur le fichier test et vous allez voir,je vais écrire un test.
00:15:15 :Donc, je vais rester très basique.Ne faites pas attention aux imports, c'est un peu le bordel.Je pourraisvous montrer une petite technique pour lesfaire automatiquement, c'est la mise à jour des imports.
00:15:27 :Du coup,ici,je vais écrire un test. Et là, on avait un test qui s'appelaitadd method.Oui, pour rajouterun EAN dans la liste.
00:15:39 :Donc, add method, on va le refaire.Et ici, si vous vous souvenez bien,dans mon fichier conf test,j'ai créé iciune liste.Il faut que je la retourne, d'ailleurs.
00:15:53 :Voilà.Et ça, ça va nous servir de setup.Donc là, en fait,ce qu'on appelle une fixture, la liste quej'ai créée ici, on va pouvoir la réutiliserdans tous les tests qu'on veut.
00:16:05 :Alors, regardez.Là, par exemple, je l'avais appelé gablist.Je crois, je ne sais plus. La gablist.Il m'a trouvé direct, d'ailleurs, l'IDE.Et maintenant, je n'ai plus qu'àfaire un gablist.
00:16:17 :add product.Je m'étais laissé ça exprès.Un EAN valide, par exemple, c'est encore mieux.Et ici, j'ai bien rajouté monEAN dans la liste.Et j'ai créé un assert.
00:16:33 :Donc là, ce n'est pas comme avec...J'aurais dû laisser, d'ailleurs, ma liste.J'ai dû la sauvegarder.Je vais la récréer pour que l'on voit un petit peu la différence.
00:16:41 :Je l'ai appelémitestexemple.py.Je m'étaissauvegardé quelque chose, et je l'avais appelé comment,je ne sais plus, pour qu'on voit un peula différence. Il est là.
00:16:57 :Voilà, celui-ci, c'est bon, je l'ai retrouvé.Je l'avais enregistré.Voilà.Tout à l'heure, on avait notreassert, notre add methodqui est là, et on faisaitun self.assertTint pour vérifier.
00:17:15 :Moi, j'aime bienle principe avec mytest.C'est que c'est des asserts simples.Il n'y a pas de self.assertTint.On fait juste un assert, par exemple.
00:17:25 :Niveau visibilité, j'aime bien.On va reprendre notrenotre en.On va juste faire ça,in.Hop.Et maintenant,on peut faire un test.On peut lancerle pytest.
00:17:45 :Hop. Et donc là, j'ai bien un testqui est passé.Donc, le principe,c'est qu'on n'a pas...On ne fait pas de setup comme aveccomme avec unitest.
00:17:57 :J'ai mon dossier conftest, ici,où je vais créer des fixturesque, à chaque fois,je peux réutiliser autant de fois que je veuxdans mon application.
00:18:07 :Je vais vous montrer après un exemple un peu plus gros, si vous voulez.Mais on va continuer un petit peu là-dessus.Est-ce que, pour l'instant, ça va ?
00:18:13 :Ou pas ?Oui. Pour tout le monde, c'est bon ?Oui.OK.Bon.Je ne suis peut-être pas encore convaincu avec pytest,mais on va continuer.
00:18:27 :Donc là, c'est pareil.On va peut-être pas reprendre toutes lesremove method, ainsi de suite.On va refaire...Donc, par exemple, on avait tout à l'heure un exemple.
00:18:37 :Quand on dupliquait un...Enfin, quand on mettait un en,qui était déjà dans la liste,dans notre liste, ici, ça...C'est où, notre product ?
00:18:47 :On avait une valueerror, OK ?Et donc,comme on le disait tout à l'heure, avec Minitest,on pouvait faire un test, unassertRaiseValueError.On va reprendre cet exemple-là.
00:18:59 :Et on va l'appelertestAddmethodwithduplicate.Et là, c'est pareil. On va pouvoir utiliser la liste.La liste, ici. On n'est pas obligé de la créer
00:19:17 :à chaque fois, il y a une liste manuellement.On réutilise les fixtures qui sont dans contest.Donc là, je vais la réutiliser.Et...Je vais faire un gammeListe.addProduct.
00:19:27 :Et puis là, j'aurais pu me...Prendre ça, en fait.Hop.On va effacer ça.On va faireun addProduct.Et ici,on va fairewithbyTestRaises. Et ici, on peut envoyer
00:19:49 :ce qu'on chercheà tester. En fait, on veut que ça...On teste si ça renvoie bien ici une valueError.Et donc...Si je fais ça, normalement,je suis censé avoir une valueError. Donc là, on va relancer le test.
00:20:01 :Boom. Donc ça passe.Vous voyez, c'est pas si différent que ça. Quand on regardebien, ici,il y a quelques différences dans la façon de faire, maisça reste des tests, donc c'est pas extrêmement différent.
00:20:17 :Qu'est-ce que je voulais vous montrer ? Ah oui, aussi.Quand je fais des mocs, moi, avecavecbyTest, j'utilise ici leLimit. On pourrait reprendre ça.
00:20:35 :On pourrait reprendre ça.Tac.Alors...Tac, tac.Hop, hop.Et donc,ici, on va juste le modifier.On va refaire notre moc.Donc, on va moquer, du coup,la...
00:21:03 :la méthodede l'API, GetProductDataTest,comme on a vu la dernière fois.Parce qu'on n'a pas envie que ça aille chercher sur Internetpendant les tests. On veut retourner
00:21:13 :vraiment le résultat qu'on veut.Et donc, ici,on va repartir.Donc, on va enlever le self qu'on a sur une fonction.Bon, il est possible de faireaussi des tests byTest en classe,mais moi, perso, j'utilise les...
00:21:27 :j'aime bien utiliser des fonctions, en fait.Parce que dans tous les cas,pas besoin d'une classe, puisque toutes les pictures qu'on a,on peut les réutiliser dans toutes les fonctions qu'on veut.
00:21:35 :Du coup, je disais,on va recommencer notre...notre mock.Donc, ici,pas besoin de s'embêter,on avait donc...on va rajouter notregablist, tac.Notre mock,ici, on ne va pas y toucher.
00:21:55 :Il renvoie le productName et le chocolat en poudre.Et ici,on va faire un assert.Alors, du coup, ça va être un...Je vais le réécrire.
00:22:05 :AssertAssertTacGablistAlors, attendez.Non, j'aurais pu faire comme différemment, en fait.Hop.Hop.Euh...Tac.Si je modifie ça...Euh... attendez.Je vais me le recopier.
00:22:31 :On va partir sur un assert.Gablist.ProductDetails, c'est ça.Ici, je vais envoyermon E.N. dans l'API.C'est bien sélectionné.Dans l'API.Hop.Et je vérifieque le...
00:22:53 :Au niveau de l'assertion, je vérifie l'égalité.Et donc, par contre, je suis...Bon, en fait, je vais pouvoir reprendre ce qui m'avait retourné.Euh...C'est quoi ? ProductName et chocolat en poudre, je crois.
00:23:05 :C'était ça, tac. Hop.Normalement, c'est ça.Voilà.Normalement, c'est ça.J'ai dit normalement.Sauf que je ne sais plus si j'ai retouché à l'API.Si j'avais modifié les champs.
00:23:21 :On va voir s'il y a un bug, de toute façon.Non, c'est bon, les tests sont passés.Donc, vous avez vu, en fait, j'ai fait un mock en utilisant le patchde unitest.mock, ici.
00:23:29 :Et sinon, le reste,ça ne change pas beaucoup.Est-ce que...Je peux continuer ?Dites-moi si vous avez un doute.Euh...J'ai perdu personne.Non, c'est bon, je n'ai perdu personne pour l'instant.
00:23:45 :Euh...Écoutez, je vais continuer, du coup.Euh...Ah oui, un truc qui peut être sympa avec PyTest.Après, je vais vous montrerdes plus gros tests, mais pour l'instant,c'est vraiment juste le truc de base qu'on va faire.
00:23:59 :Ici, PyTest, on ne va pas s'embêter avec ça.L'os, non plus.Shopping list,on ne s'en sert pas non plus, puisqu'on s'en sert dans la fixture.
00:24:07 :Et donc, maintenant,on va se créerjuste pour montrer, en fait,un exemple. Donc, on se teste.On a vu tout à l'heurele setup et le teardown.
00:24:23 :Donc là, on a fait...C'est comme si on faisait un setup.C'est comme si on le réutilisaitdans nos... On peut le réutiliser, en gros,
00:24:31 :c'est mieux dit, on peut le réutiliser dans n'importe quelle fonctionde test qu'on peut.Mais, donc là, on retourne bien une liste.Maintenant, on va voir comment on fait pourvraiment faire, dans une fixture,un setup et un teardown.
00:24:43 :Donc, vraiment, la création et le nettoyage.On va faire un...On va...Réimporter notre image test, ici.Et c'est pareil,on va partir sur une fixture.
00:24:55 :Hop.Après, on va mettre les parenthèsesdans son setup, quoi qu'il en soit.En général, je les mets.On va faire une...On va l'appeler, ici, par exemple, module image.
00:25:07 :Ça me paraît pas mal.Et on va...On va créer une image,ici.Et, en fait,avec PyTest, ça fonctionne comme ça,avec les mots-clés YIELD.
00:25:23 :Donc, en fait,je vais créer l'image.Et juste après,on pourra très bien faire l'image.Hop, elle est là.On retourne, ici, l'image.Comme ça, on peut la réutiliser dans les tests.
00:25:37 :Là, si je vous montre, par exemple,ma shopping list, si j'avais besoin d'une image,hop,elle serait ici. Je pourrais l'utiliser sur n'importe quel test.
00:25:45 :Voilà.Là, ça te fait un générateur d'images, en fait.Ouais.Qu'est-ce que j'ai fait ?Voilà.On va l'essayer, parce qu'après, je vais montrer autre chose.
00:25:57 :J'ai mis au contest.Il est là. Ça, on n'a plus besoin, de toute façon.Donc, ça, il n'en s'en fiche.Et donc, oui, en fait, là, du coup, j'ai créé l'image.
00:26:05 :Et je peux l'utiliserdans mes tests.Mais après, on peut très bien le faire, du coup,pour faire un teardown.Je peux faire mon remove.
00:26:15 :Bon, de toute façon,je n'utilise pas l'image en soi, maisje peux faire mon remove ici.Et hop.Et supprimer l'image après.Donc là, en fait,j'ai bien icil'image que je crée.
00:26:33 :Je la rends disponible dans mes tests.Et à la findes tests,eh bien, je la supprime.Voilà.Donc,toutes mes fixtures qui sont ici,je peux les utiliser dans tous mes tests.
00:26:49 :En fait, par exemple, avec Django,j'ai un conftest souvent à la racine.Et toutes les fixturesque j'ai dans mon conftest,je peux les utiliser dans tous les tests qui sont en dessous.
00:26:59 :Et s'il y a des fixtures que je veux utiliserque dans certaines parties, je peux créerdes conftests, en fait,que dans certains dossiers,par exemple.
00:27:09 :Est-ce que, pour vous,ça va le principe, pour l'instant,defixtures et de testsavec PyTest?Est-ce que ça va?Dites-moi.Moi, je ne suis pasfamiliarisé avec ça.
00:27:27 :Donc, je suis.J'écoute attentivement.Est-ce que ça va?Est-ce que j'explique assez bien ou pas?Oui.Je pense que oui. Mais comme je ne suis pas
00:27:39 :familiarisé, je pense queles replays ont leur importance.Ça permet de revoir dans le détail,faire des pauses, etc.C'est ça. En fait, je me suis
00:27:49 :beaucoup rendu compte, et puis m'en prenais à l'époque,que les tests, en fait,on n'est pas familier avec les tests.Et il y a des gens qui font du Python depuislongtemps, ils vont dire non, c'est vrai que les tests,en fait, j'en fais pas vraiment ou j'en fais pas.
00:28:01 :Mais pour un entreprise,de toute façon, ils vont forcément demander des tests.Enfin, en général.Ils vous demandent de mettre des tests en place.Un peu, moi.
00:28:11 :Hein?Non, t'as raison, ça fait 4 ans que je fais du Pythonet j'ai quasiment jamais fait des tests.Ah ouais, non, sans parler de toi, Stéphane.
00:28:19 :Ouais, non, mais je me doute bien.C'est une charade, une boutade, maisça fait 4 ans que je fais du Pythonet les tests, j'ai jamais vraiment approché.
00:28:27 :Même, il y a des gens, des fois,qui étudient Python et qui, même au bout d'un an et demi, disentah non, j'en sais pas trop.
00:28:33 :Ça fait un peu peur, ça part un peu obscur.On se dit à quoi ça sert.Mais franchement, c'est utile parce qu'il n'y a pas longtemps,j'ai planté une application Djangosur une fonctionnalitéoù je n'avais pas mis de test.
00:28:45 :Je me suis dit, c'est bon, ça sert à rien de mettre un test ici.Putain, j'utilise, boum, un gros plantage.Et en fait, je me suis dit, putain, j'aurais dû mettre un test.
00:28:51 :Donc, très, très utile.Ça fait plusieurs fois comme ça où je me suis ditputain, j'aurais dû mettre un test ici, en fait.Et donc, là, on a faitles conf tests.
00:29:01 :Nos conf tests, les fixtures qu'on utilise.Du coup,ici, dans nostests.Et il faut savoir que là, votre fixture,par défaut, elle va êtreentre guillemets,là, l'image, elle va être crééeavantchaque testet détruite après chaque test.
00:29:23 :C'est un peu comme tout à l'heure, on faisait avecle setup.Dans le setup normal, c'étaitun setup avant chaque test, après chaque test.Et on avait le setup de classe pour la classe.
00:29:33 :Il faut savoir qu'avecPyTest, vous pouvez définir un scope.Par défaut, il est sur la fonction.Mais, là,par exemple, je peux très bien diremodule.
00:29:45 :Et donc, là,en fait,votre fixture va être utiliséepour tout le module. Elle ne va pas êtrecréée pour chaque test, en fait.Elle va être une fois pour le module.
00:29:57 :Donc, il y a module,par défaut,c'est en fonction.Il y a aussi, si vous avezclasse de test, vous pouvez définir classe, ainsi de suite.
00:30:07 :Voilà.Est-ce que...Ah oui, avant de partir sur l'autre chose.Toujours sur PyTest.Je voulais... Il est quelle heure ?Ah oui, putain.Je vais vous montrerquelque chose qui peut être sympa avec PyTest.
00:30:23 :Mais, si vous n'êtes pas habitué,ça va vous paraître un peuobscur au début. Je vais quand même le mettre,comme ça, vous pourrez le regarderpour une rediff.
00:30:33 :Il y a un truc qui est sympa avec PyTest.C'est un décorateur paramétrisé.Donc, là,on va faire un tructrès simple pour le montrer. J'ai préparé
00:30:43 :une liste d'E.N.Vous allez me dire, pourquoi c'est bizarre, tu metsune liste de tuples.A chaque fois, j'ai un E.N. et j'ai le nom à côté. Vous allez voir pourquoi.
00:30:51 :Ici, on va utiliser un décorateur.Donc, PyTest.C'est .mark.parameterize.Ici, je vais utiliserla chaîne de caractère. Je vais mettre E.N.Une virgule.Résultat.Qu'est-ce que j'ai fait ?
00:31:13 :Résultat. Vous allez voir, je vais avancer un peu.Comme ça, ça paraît un peu...Tous les E.N. que j'ai créés,ils sont ici.Je les passe ici.
00:31:23 :Maintenant,je vais faire test.Là, je vais mettreWISparams pour le fun.Et ici,on va utiliser notre texture.Texture Gablist qu'on a créé tout à l'heure.
00:31:39 :On va utiliserE.N. et on va utiliserrésultat.Ici, le E.N.ça va correspondre à notre paramètre qui est là.Et résultat qui est là.
00:31:51 :Il va être là.Là, je pars dans un truc un petit peuavancé, mais je voulais quand même vous le montrer.Ici, je préfèreGablist.
00:32:03 :AddProduct.Ici, je fais E.N.Je ne sais pas s'il y en a qui commencent à voir où je veux en venir.Mais je vais utiliserun seul assert.
00:32:13 :Résultat.Une Gablist.Là, en fait, on va utiliserle AddProductavec tous ces E.N. là.Là, j'ai bien1, 2,3,4 tests décrits.Mais si je lance5 tests,on va en faire 6.
00:32:37 :Je suis à 6 tests, exactement.Parce qu'ici, en fait,avec Parameterizequi est là,j'envoie...On va faire ça avec différents E.N.Donc là, oui, ça part un peu bidon pour le test,mais je reste sur des exemples très simples.
00:32:53 :Parce que je ne pars pas dans un truc de fouà ne pas y tester pour l'instant, puisquece n'est pas forcément évident au début.
00:32:59 :Surtout, si vous ne faites pas encore de tests,ce n'est pas forcément facile.Est-ce que pour l'instant,ça va ? Si vous voulez, en plus, j'avais
00:33:09 :promis à quelqu'un de montrerun petit peu les tests que je fais avec Django.Est-ce que vous avez encore peut-être 10 minutes ou pas ?
00:33:15 :Oui, oui.Pour l'instant, ça a été.Le Parameterize, il n'y a pas de soucis.Ça peut paraître un peu compliqué,mais il y aura la rediff.
00:33:29 :Tout à l'heure,j'étais sur mon application persoque j'ai misequi est là.Cette application,je vais peut-être vous...Comment je vais faire ?Attendez,je vais ouvrir un Chromesur mon autre compteque vous visualisezun petit peu à quoi ça va ressembler.
00:33:53 :Je crois que j'ai les 8Go de RAM qui commencentà fatiguer.Je vais lancermon serveur.Là, c'est test. Ce n'est pas le vrai site.
00:34:15 :Il est en ligne, mon site,mais ça, c'est les versions de test.Quand on regarde, c'est des trucs bidons.Vous voyez ?Ici, j'ai une partieback-officeque j'ai créée.
00:34:35 :Là, je vais plutôt allerlà.Ici,j'ai des clients bidons.Je peux ajouter un client.Pour l'instant, l'interface n'est pas encore en cours.C'est en ligne,mais je l'ai sorti un peu vite.
00:34:51 :Pour chaque client, je peux créer des projets.Quand je vais dans le client,je peux direque j'ai bossé aujourd'hui pour le client.Je mets la date,combien de temps je suis passé sur le projet,et ainsi de suite.
00:35:09 :Là, j'étais sur un service.Je ne sais plus lequel j'ai sélectionné.J'étais sur leheures diverses.Je peux très bien direque j'ai fait le 5,que j'ai fait 2 heures.
00:35:23 :Je sais que ce n'est pas encore facturé.J'ai fait 2 heures.Ensuite, sur le projet,j'ai accèsà mes factures. Je sais qu'elle n'est pas encore payée.
00:35:33 :Je peux la télécharger en PDF.Je peux créer une facture pourle client 2.Je vois que celle-là n'est pas encore payée.Je sélectionne.Ainsi de suite,je peux créer mes factures comme ça.
00:35:49 :Les calculs vont se fairetout seul. Ça va cumuler tous mes services que j'ai fait.On peut vitecréer des erreurscomme je l'ai fait.
00:36:01 :Sur ce projet-là,j'ai créé...Je n'ai pas su que j'ai le plus de tests,mais j'ai créé pas mal de tests.Je vais simplifier un peu tout ça.
00:36:11 :Là, vous voyez...J'en ai parlé tout à l'heure.Ici, j'ai mon...J'ai créé des fixtures.On peut faire des fixtures avec tout.Ici, par exemple,mes factures, j'ai besoin de direà quelle date j'ai facturé,dans combien de temps,quant à l'échéance.
00:36:41 :Ici, j'ai fait une fixture,je l'ai appelée Today,pour avoir la date du jourdans mes tests.J'ai créé une fixture.C'est un peu plus complexe.
00:36:53 :Ça, c'est un tuyau que j'ai eu de Thierry.J'en remercie beaucoup.Avant, je faisais autre chose, mais c'était un peu moins propre.Ici, j'ai une fixture pour redirigermon fichier de médias de Djangodans mes fichiers temporaires du PC.
00:37:05 :Comme ça, ça ne touche pas mon fichier de médias.Ça n'enregistre pas en permanencele PDF que j'utilise.Après, je remets bien...Ici, j'utilise une fixturepour avoir mon fichier de médiasdans mes fichiers temporaires.
00:37:21 :Et je les remets après bien comme il faut.Là, j'ai une fixture,un fichier PDF que j'ai créé.Je ne rentre pas dans le détail.
00:37:31 :Je vais juste vous montrer les tests.J'ai ici un utilisateur, un administrateur.Je vais appeler ma fixture admin.Après, comme je l'ai montré,je crée des factures pour des clients.
00:37:41 :J'ai une fixture client 1, client 2.J'ai un projet 1 qui va partir au client 1.On peut réutiliser des fixturesdans d'autres fixtures.Donc, je crée un projet 1qui va partir au client 1,un projet 2 qui va partir au client 1,un projet 3 au client 2.
00:37:57 :Je crée des services d'avance.Je me crée des données de tests,des factures qui sont déjà créées,et ainsi de suite.Et ensuite, dans mes tests,par exemple,je vais réutilisermes fixtures, une basique.
00:38:17 :Là, par exemple,j'utilise l'administrateuren fixture.Et ici, client.Pourquoi j'utilise client ?Parce qu'avec Django,dans le framework de tests de Django,dans frontdjango.test,
00:38:37 :j'importe le client de test.Et je l'utilise iciavec PyTest.C'est prévu pour, j'ai installé PyTest Django.Je l'ai typé comme ça,c'est plus pratique, j'ai l'autocompletion.
00:38:49 :Donc, je fais un force login de mon admin.Et ici,j'utilise une variable response.Et je fais un client, le client qui est là,.get, et je reverse.
00:38:59 :C'est pour aller sur mon URLque j'ai appelé CustomerDashboard.Et je vérifie bien icique j'ai une réponse de 100, par exemple.On va allersur quelque chose d'un peu plus complexe.
00:39:11 :C'est pour vous montrerqu'avec PyTest, on peut faire des trucsassez sympas.Pour voir concrètementdans quel cadre j'utilise les tests.Et on finira parles tests sur les comptes utilisateurs,par exemple.
00:39:27 :Et là, ici, par exemple,quand je crée une facture,je veux vérifier.Donc, je vais aller surla vue qui crée la facture.Une requête poste.
00:39:39 :Je prends requête get.Je vérifie bien que je suis redirigéavec une réponse 302.Et que la facture existe bien.Et que ici, je suis redirigéavec ce URL-là.
00:39:51 :Et donc, je prépare des datas.Et en fait, dans ma facture,pour créer une facture,j'ai un formulaireexprèspour les factures, ici, avec IssueDate,DueDate, TélévéréDate.
00:40:05 :Et j'ai d'autres champs aussiqui sont dans les modèles.Et je suis où.Et donc ici, je dis bienque le client, ça va être tel client.
00:40:15 :Je réutilise la structureclient 1, ici.Le nombre, je mets 1.Ici, j'envoie bien la structure Today.Donc, c'est la date de date.Et ici, je fais un type delta pour direque la date d'échéance, ça va être les 15 jours plus tard.
00:40:29 :Et ici, j'ajoute un service.Donc, c'est le service 1que je facture.Et ici, c'est le PDF que je upload.La facture au format PDF.
00:40:39 :Donc, vous voyez,il est possible de fairede tout testeravec MyTest. Je vais partir surles utilisateurs, vous allez voir.Je teste, par exemple, des vues de modification.
00:40:51 :Il n'y a pas de problème.Je ne rentre pas dans le détail iciparce que ce n'est pas mon Thora Django,mais j'accèdeà une vue où j'aiun formulaireavec, par exemple,un service qui existe déjà.
00:41:07 :Et donc ici, je vais le modifier.Je prépare les données pour le modifier.J'appelle mon service, ici.Je lui envoie les datas et je vérifiesi bien que les données sont modifiées.
00:41:17 :Petite astuce pour ceux qui disentdes fois, quand je modifie des choses,je suis dans la base donnéeset quand je fais mes asserts, ça ne passe pas.
00:41:25 :Il faut penser souvent à faire un refreshfrom DBde son instance pour la mettre à jour.Sinon, ce n'est pas mis à jour automatiquementet les tests ne passent jamais. On ne comprend pas pourquoi.
00:41:35 :Donc, voilà le genre de test qu'on peut avoir.Après, on peut faire des tests.Ici, je fais des tests unitaires.Là, je teste,par exemple,ici, j'utilisedes méthodes que j'aidans mes modèles.
00:41:55 :Vous voyez, dans mes modèles, j'ai plusieurs méthodes.Ici, par exemple,j'ai un update total.Il est où ?Je dois avoir un update total.Je ne sais plus où je le mets.
00:42:11 :Un service,je ne l'ai pas mis là.Non, elle est appelée automatiquement à la méthode.Peu importe. En général, dans mes services,par exemple, j'ai un remove.
00:42:23 :Alors, attendez, je regarde s'il y a une méthodeque je peux vous montrer.Clairement, j'utilisele remove.J'ai un save ici.Là, j'ai un service.
00:42:37 :Je ne teste pas directement.En gros,je vérifieà chaque fois sisur certaines actions,par exemple,j'ai mes services.Qu'est-ce que je faisais ici ?
00:42:53 :Ah oui, voilà.Je vérifiais si mes servicesétaient bien facturés.Par exemple, je les mettais dans une facture,et je vérifiaiss'ils étaient bien notés en facturé.
00:43:07 :Vous pouvez vérifier comme çaavec PyTest et Django,tout ce que vous avez besoin de tester.Là, j'ai mis quelques tests en placeoù je n'ai pas mal de logique.
00:43:17 :Par exemple, je vais ajouter un servicedans une facture,et je vérifie bien qu'elle estassez cochéeen facturépuisque,encore dans le détail,j'ai créé ce qu'on appelle dessignaux.
00:43:37 :Ici, par exemple,qui font que, par exemple,dans Django, pour certainesactions que je fais sur mes modèles,ça va automatiquement rappelerdes signaux qui vont allerrecalculer des champs ou remodifierles champs.
00:43:53 :Par exemple, ici,si j'ajoute un service,je vais le passer à Screw.Si je le retire, je vais le passer à Falsedans le modèle, ainsi de suite.
00:44:03 :Là, vous voyez, ça fait quand même pas mal de logique.C'est quand même assez important d'aller le tester.C'est pour ça que j'ai mispas mal de tests en placesur ces fonctionnalités-làet sur mes vuesparce que sur mes vues,j'utilise des classes,mais à chaque fois,j'utilise sur certaines
00:44:23 :desformulaires personnalisées.Vu que je modifie un peules choses,j'utilise un FormClassque j'ai créé moi-même dans mes formulaireset je préfère le tester pour être sûr qu'il n'y ait pas d'erreur.
00:44:37 :Je vais vous montrer un exempleavec Unitest.Si je lance bien mes tests,ils sont un peu longs.Ils sont passés.On prévoitun mentorat là-dessus,mais je pense que ce qui ralentit les choses,c'est que j'utilise des factories, à mon avis.
00:45:01 :Je voulais vous montrerquelque chose.Si je l'ai cloné,je vais vous le montrer vite faitsur un repo.Est-ce que vous avez encorecinq minutes ou pas ?
00:45:19 :Oui.Ça marche.Oui, ça va.OK.Là, je montre des trucs un peu...J'avoue que c'est un peu avancé,mais c'est juste pour vous montrerconcrètement les tests.
00:45:39 :Là, c'est mes premiers tests que j'ai mis en place.Mes tous premiers tests, je m'en souviens.Ici, j'utilisais...Ils ne sont pas forcément très beauxparce que c'est mes tous premiers.
00:45:51 :J'utilisais, comme je le disais,vous allez reconnaître,je vais grossir un peu peut-être,le framework de test de Djangoqui est basé sur Unitest.Et là, vous voyezqu'on a toujours le setup.
00:46:05 :Ici.Je n'ai pas de teardown dans celui-là, je crois.Non, je n'ai fait qu'un setup.Et donc, vous pouvez testerpareil avec Unitest.C'est comme vous préférez.
00:46:17 :Ça se fait toujours.Là, par exemple,ce qui peut être intéressantde montrer, voilà.Je vérifie, par exemple,une personne qui a un e-mail,elle peut s'inscrire.
00:46:31 :On ne peut pas avoir deux personnes avec le même e-mail.Donc là, j'envoie mon formulaired'inscription.Je fais un postsur mon URL. J'envoie les informations.
00:46:41 :Et là, je vérifiebien que...Je vérifie bien que...Que la personne, en fait,elle n'est pas inscrite.On vérifie bien quel'instance n'existe pas, en fait.
00:46:57 :Qu'est-ce queje peuxvous montrer ?Là, il y adifférentes choses avec Unitest.Mais si je peux vous montrer avec Unitest, vous voyezqu'on peut faire la même chose qu'avec Pytest.
00:47:11 :On peut tester un peu différemment.Il faut avoir des setupsqui peuvent vite devenir lourds.Je dois en avoir un qui est quand mêmebien plus lourd.
00:47:21 :Là, j'ai bien destierdowns. C'est pareil. Donc là, je fais des tests.Des tests unitaires assez basiques.J'ai pas un gros test.Je crois que c'est là.
00:47:45 :C'est un exemple de setup qui est énorme.Je vous laisse voir.Il est assez lourd.C'était mes premiers tests.Mais c'est là que je me suis dit, putain, c'est chiantd'avoir une méthodecomme ça qui est énorme. Et c'est après que j'ai découvert
00:48:01 :Pytest que je me suis dit, c'est cool d'avoir des petites fixturesque je peux utiliser un peu comme je veux.D'où ce que je voulais vous montrerpour finir.
00:48:11 :Sur l'application de gestion de stocks.Ici, par exemple,on va montrer dans leaccount.J'ai mis un dossier test express.Je sépare bienles tests à part.
00:48:27 :Là, c'est pareil. J'ai un dossier qu'on teste.J'ai l'utilisateur 1.J'ai une gestion de stocks.J'ai l'entreprise 1, l'entreprise 2, le produit 1,le fournisseur numéro 1,ainsi de suite.
00:48:39 :Et donc,on peut aller tester après.Je fais des testssur la compagnie 1,par exemple.Si je la crée,par exemple,je peux aller vérifier son numéro d'identification.
00:48:55 :S'il est bien à 2,parce que j'en ai déjà une qui existe ici.Si j'en crée une deuxième,automatiquement, elle doit avoir une identification à 2.
00:49:03 :Donc, vous voyez,on peut tester les permissions.J'utilise l'utilisateur 1.Ici,j'utilise, pareil,une fonction que j'ai créée.J'envoie l'utilisateur.Et je vérifie bien que la permission, en fait, il l'a.
00:49:19 :Voilà, tout simplement.Et pourfinir,si je fais un test d'intégration,voilà.Et pour ceuxqui s'intéressent,par exemple, si vous voulez testeravec Django,si l'utilisateur s'inscrit,vous allez envoyer...
00:49:43 :Il va s'inscrire et il va recevoir un mail.Et en fait, s'il veut activer son compte,il faut qu'il clique sur le mail pour valider son compte.
00:49:49 :Et vous allez voir que tout est prévu.Donc là, j'ai mon...Vous pouvez le faire aussi avec une e-test.J'ai mon PyTest Django qui est installé.
00:49:57 :Donc là, j'accède à la base de données.Ça, faites pas attention,c'est parce que j'utilise Celery.Mais en gros,j'utilise le client de Django,qui, entre guillemets,c'est pas une fixture que j'ai créée,mais qui est déjà prévue.
00:50:13 :Et en fait,ici,j'ai l'utilisateur qui va...J'envoie les informations à l'utilisateur.Je vérifie bien qu'il n'est pas actifpuisqu'en fait, il a reçu un mail pour s'activer,mais il n'est pas encore actif.
00:50:29 :Et je vérifie, mail outbox ici,on peut vérifier qu'il y a un mail qui est bien parti.Donc vous voyez, dans vos tests, vous pouvez vraiment tester tout.
00:50:35 :Sur ce client de Django, là,vous avez mail outbox qui permet de vérifierqu'il y a un mail qui est bien parti.Et puis après, vous pouvez repartir,vérifier si votre utilisateur est actif.
00:50:45 :S'il utilise un mail,vous vérifiez qu'il est bien actif.Je ne parle pas dans le détailparce que sinon, on va y passer la nuit.
00:50:53 :Mais c'est juste pour vous montrer des exemples concretsde tests qu'on peut mettre en place.Voilà.Je pense que j'ai largement dépassé.Merci.Est-ce que...
00:51:09 :Je sais que je suis parti dans le complexeun peu volontairement,mais on est resté de manière assezsimple sur unitestet pytestpour commencer.
00:51:23 :Et là, on a fini sur du complexe pour voir des cas concrets.Mais est-ce que du tout,ça vous a...Au moins la première partie avec unitest,la fin d'unitest et pytest, ça vous a plu ou pas ?
00:51:33 :Oui, oui.OK.Super.Merci.J'avais une petite question,Gabriel.Suite àune présentation de Rachid sur le TDD,j'avais utilisé pytestpour faire un mini-projet à Toza.
00:51:55 :Tu as dû le voir passer.Mais du coup,est-ce que,étant, je considère,étant débutant dans les testset dans le TDD,est-ce que c'est le bon choix,pytest,ou est-ce qu'il fautdéjà connaître aussiunitestpour apprécier pytest ?
00:52:19 :Alors franchement,les deuxpossèdent ressembler sur pas mal de points.Oui.Ça dépend.En fait, unitest,tu l'es bien à connaître quand même,parce que c'est le framework de base.
00:52:35 :Pour moi, ce n'est pas une questionde débutant ou de pro.C'est vraiment unitest.Je ne sais pas si tu bosses vraiment dans le codeà fond et quetu vas sur des projets,tu verras qu'il y en a encore plein qui utilisent unitest,même si la mode,elle est là de passer beaucoup à pytest.
00:52:53 :J'ai vu un gars sur un télégramme6 fois plus tard,il utilisait un framework, c'était un fork de Django.Lui, il était carrément sur un forkde Django.
00:53:03 :Et c'était commeun CMS,mais c'était un peu un prestagelopDjango, tu vois.Et les systèmes de tests qui étaient intégrés,c'était que du unitest.
00:53:15 :Il y avait déjà des tests de mis en place.En résumé, il faut connaître les deuxpour être bien.Tu vois mon unitest, j'ai fait un projetque maintenant je suis en parlais,je vais l'utiliser s'il y a besoin, j'arriverai à me débrouiller avec.
00:53:27 :Mais après,je suis vite parti sur pytest parce que j'aime bien,moi c'est le petit principe des fixtures, tu vois,comme j'ai montré.Avec unitest, tu vas créer ta classe,tu vas avoir tes setups,et tu vas réutiliserce que tu fais dans le setup,dans tes méthodes, mais moi j'aime bien avoir des fixtures
00:53:45 :avec différents testsà différents endroits dans mes moduleset réutiliser les fixtures un peu comme je veuxc'est ça que j'aime bien.D'accord.C'est un peu différent à manier,mais je pense que les deux sont bien.
00:53:59 :Au moins un unitest bien survoléet savoir quoi il parle.Ok, donc là j'en suisdans le programme, j'en suis à fairela liste de coursemais en PO.
00:54:11 :Je vais commencer prochainement.Du coup,si je comprends bien,ça serait bien que je me mette à unitestpour faire ce projet là.Ça me permettraitde le digérer,je veux dire,de l'utiliseret puis, ok, ça marche.
00:54:35 :T'es pas obligé de partir sur un unitest gris,fais un peu d'unitest pour au moinst'y mettre, et puis après tu feras dupailleté sur les autres si t'en veux, maisje pense que la partie unitestpeut être intéressante parce quec'est du standard dans tous les cas,donc c'est bien à voir.
00:54:51 :D'accord.Merci beaucoup Gabriel.Est-ce qu'il y a d'autres questions ou pas ?Sinon, je ne sais même pas qui il aurait pu être.Oh la vache.
00:55:03 :J'ai abusé, je suis désolé.Non, c'est bien.C'est bien encore.Non, je plaisante.On commence à fatiguer un peu.Allo ?Ah oui ?Ok.
00:55:19 :Je voulais savoir, avec les tests,je parle du Django,on fait les tests,il faut implémenter les tests sur toutes les fonctionnalitésou il faut peut-être changer les fonctionnalités ?
00:55:31 :C'est pas trop ?Les tests,il y en a qui vont te dire,en mode, peut-être des fois,en mettre partout.Après, chez Katibo,il y a une philosophie qui dit,ne t'embête pas forcément à faire du TDDet mets des tests en place que sur les parties très sensibles.
00:55:51 :Moi, je suis plus comme çaoù je mets des tests en placesur des partiesoù il y a de la logique en fait.Sur toutes les parties où il y a de la logique.
00:56:01 :Si par exemple,j'utilise dans Djangoou j'hérite de classe de Djangoque je surcharge très peu,je ne vais pas retester les fonctionnalités de Django.
00:56:11 :Donc, voilà.Je ne sais pas si j'ai répondu à ta question.Oui, d'accord, d'accord,j'ai compris, merci.Mais, pas tout forcément.Katibo, lui, par exemple,il est comme ça, ne pas tout tester forcément.
00:56:27 :C'est une philosophie.Allo, Gab ?Moi, je suis trop à coudreà une test,mais j'aimerais savoir si c'est possibled'utiliser les deux,unitest et pytest.
00:56:43 :Oui, oui, oui,tu peux lancer tes teststu peuxlancer tes testsunitest et pytestsi je ne dis pas de conneries, oui.Dans le même projet, en fait.
00:56:57 :Oui, oui,tu peux le faire.Après, moi, je n'aime pasutiliser les deux,mais oui, tu peux lancerunitest avec pytest.Ça, c'est possible.Pourquoi, t'as déjà un projet avec unitest,tu veux rajouter du pytest par-dessus ?
00:57:15 :Oui, oui.Moi, ce que je ferais,c'est que jeremplacerais tout,mais non, après, si t'as déjà tes tests unitest,ça n'a rien à les enlever, maistu peux, oui.
00:57:29 :D'accord, d'accord, je vais essayer.T'as dit quoi ?Je vais essayer de le faire, en fait.Ouais, tu peux.C'est la première fois, en fait,où c'était un pro,c'est un mec qui a vraiment beaucoup de métier,qui m'a dit, j'ai fait plein de tests avec unitest,il m'a dit, justement,
00:57:47 :dès j'apprends unitest, il rigolait un peu,mais il était anti-unitest,c'était pas son truc, il m'a ditutilise pytest, si tu fais dans tous les cas, tu peuxlancer tes tests avec pytest.
00:57:57 :J'avais pas essayé à l'époque,c'est un projet qui avait terminé, c'était un projet école,entre guillemets, maisil m'a dit que c'était possible, et j'avais déjà vu que c'était possible, oui.
00:58:05 :Donc voilà.Écoute, tu as dit s'il n'y a plus d'autres questions, je vais te faire...J'ai une question, maisqui est un peu hors sujet.
00:58:21 :Tout à l'heure, tu disais, c'est pasun mentorat Django, est-ce que ça veut direqu'il existe un mentorat Django ?Je vais...Faudrait que j'en parle avec Kibosi jamais on le remet en place ou pas.
00:58:35 :J'en ai fait un quand le balast dernier.Ça pourrait peut-êtrese faire, il faut aussi qu'il y ait de la demande, je pense.Faudrait que j'en parle avec Kibo.
00:58:45 :Je fais ma spécialité, après moiça ne me dérange pas d'en organiser.Ça ne me dérangerait pas.Ça serait intéressant.Ouais ?Ok.Il y en a peut-être d'autres qui seraient partants, doncoui, je peux en parler avec Kibo.
00:59:01 :Ok, ça marche.Et puis, on se fera un de temps en temps.Vu que je fais à 95%mais 90% de mon tempsc'est du Django, doncil n'y a pas de souci.
00:59:15 :D'accord.Ok, merci.Il n'y a pas de souci.Je vais peut-être vous libérer s'il n'y a plus de questions.En tout cas, merci beaucoup à vous.
00:59:27 :Je sais que j'ai complètement abusé.Je suis parti dans un truc un peu plus complexeavec Django et Paytest.C'était vraiment juste pour voir descas concrets, on va dire.
00:59:37 :Oui, c'est intéressantde voirle côté métier, comme tu nous as montrédans ton application.Ce n'est pas des cas d'école. Là, tu bossesvraiment sur ton appli, donc du coupça nous permet de voircomment tu t'en sers.
00:59:53 :Je fais pareil pour une cliente. Je fais du Django,je fais des tests en place et c'est exactement pareil.Là, c'est des tests sérieux,puisque l'application est en ligne.
Aucune occurrence trouvée pour « ».