Session du 08 mai 2025 à 21h00
Développement Web & Frameworks
Qualité & Architecture
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 Django
Dans cette session, nous allons aborder l'utilisation de pytest dans le cadre d'un projet Django.
00:00:00 :Bonsoir à ceux que je n'ai pas dit bonsoir, mais normalement je dis bonsoir à tout le monde.Ce soir, il y en a déjà qui font du Django, mais qui font des tests ou pas ?
00:00:15 :Ici ?J'ai jamais fait, jusqu'à présent.J'ai bossé sur des petits projets, donc je faisais juste des tests manuels, des tests unitaires.Est-ce qu'il y en a d'autres qui font des tests ou pas du tout ?
00:00:35 :Non, pas du tout.Bonsoir tout le monde.Salut.Moi, je travaille actuellement sur une application Django.Qu'est-ce que j'aime de e-commerce autant pour moi ?
00:00:51 :Je souhaite déployer l'application avant de faire les tests, parce qu'il y a une histoire directe.J'ai posé la question, c'est vrai que vous m'avez répondu, mais je n'ai pas encore testé Python Anywhere pour déployer l'application.
00:01:05 :Ah oui, c'est ça la question.C'est moi qui ai posé la question tout à l'heure.Oui, je t'ai répondu sur le Python Anywhere. Il n'y a pas longtemps, j'ai pris le Stinger, j'ai pris un VPS.
00:01:17 :Mais là, c'est plus avancé, parce que toi, tu as installé ton serveur et tout, c'est galère.Python Anywhere, c'est franchement facile.D'accord, d'accord.Il y a Arcelle qui l'a déjà essayé, Python Anywhere, qui pourra te le dire.
00:01:32 :Il est là, franchement, ce n'est pas très compliqué.Arcelle, je ne sais pas bien qui c'est.Arcelle qui est là, qui est dans le salon, qui est avec nous dans le Google Meet.
00:01:42 :Il a essayé Python Anywhere et il a réussi, il n'y a pas de problème.Je ne vois pas son profil, je ne vois pas d'Arcelle ici.
00:01:52 :Dans le chat, oui, Arcelle Bicard.Tout à fait.Pour les tests, par contre, il vaut mieux les faire au fur et à mesure,parce que si vous les faites à la fin, vous avez l'impression de refaire deux fois l'application, parce que c'est galère.
00:02:09 :Franchement, faire les tests, c'est assez chiant.On va peut-être pouvoir partager l'écran, du coup.Je vais grossir mon écran ici.Galère, j'ai un petit écran, ça va être chiant, ça.
00:02:26 :Bon, ce n'est pas grave.Hop, hop, allez.Entire screen.Entire screen.Ah, il s'est connecté, cool.Vous voyez mon écran ou pas ?Oui, nickel.
00:02:47 :Juste rapidement, pour Python Anywhere, on en parlait ensemble,je t'ai envoyé le lien, Thibault a fait une formation dessus.Franchement, tu la suis, il n'y a pas de raison qu'il ne t'arrive pas.
00:03:00 :Si tu le dis, c'est un problème, mais ça va aller.Du coup, excusez-moi, je vérifie, je n'ai pas de test forcément, c'est bon.Donc là, j'ai un projet Django, très basique.
00:03:13 :Il ne ressemble à rien, j'ai juste un modèle adresse, tout seul en fait,mais c'est suffisant pour...En fait, le but, ce n'est pas de faire la blinde de test,c'est vraiment juste de voir comment on peut se mettre à PyTest.
00:03:25 :J'ai une vue et un modèle, c'est tout.Voilà, et les settings.Donc, on va juste se faire deux, trois testset voir un peu aussi les contests, les fixtures, et ainsi de suite.
00:03:38 :Et vous allez voir que c'est vachement pratique.Donc, je disais, les tests, c'est important de le faire au fur et à mesure.J'ai fait un mentorat la semaine dernière,où quand je développe une fonctionnalité,je fais un campement sur GitHub, je l'ai montré la dernière fois,et en fait, pour chaque fonctionnalité, je fais une branche.
00:03:57 :Et à chaque branche, à chaque fois, je fais mes tests,et comme ça, en fait, j'avance assez sereinement.Pourquoi c'est important ? Parce qu'avant,quand j'ai commencé au tout début, je ne faisais pas trop de tests.
00:04:07 :Je commençais, on est étudiant, on ne fait pas trop.Voilà, on s'y voit à quoi ça sert.Et puis maintenant, j'en fais, heureusement,parce que là, je suis sur une grosse application,je dois avoir 111 tests déjà dessus.
00:04:18 :Et par exemple, la dernière fois,j'ai modifié juste quelque chose dans une méthode,et j'ai quatre tests compétés,ce qui veut dire que j'avais au moins quatre fonctionnalitésqui ne marchaient plus.
00:04:28 :Et si je n'avais pas de tests, pour retrouver le même erreur,ça aurait été vraiment très compliqué.Je vous montrerai après un peu la taille du truc.
00:04:36 :Donc voilà.Donc là, c'est un projet...Quelqu'un vient rejoindre...Voilà.Je ne sais pas si j'ai mis ça dans la chatte.Ouais.Donc là, c'est très très basique.
00:04:51 :J'ai un fichier de settings, j'ai rien installé spécial, normalement.Ici, voilà, j'ai deux applications.Qu'est-ce que j'ai en bas ?Et j'ai ici une settings.
00:05:01 :Voilà.Vous allez voir pourquoi c'est une constante.Pourquoi je fais ça.Niveau utilisateur, moi j'utilise le modèle de Django qui est intégré.Voilà.Donc, sur l'application, j'ai une vue de sign-up.
00:05:14 :Donc, on ne va pas ouvrir un navigateur web,on va tout faire vraiment que dans le code.Donc, j'ai une vue de sign-up.Quand l'utilisateur arrive, il a un formulaire.
00:05:21 :Il a un formulaire qui est là.Une vue de sign-up.Et donc, ça va lui demander son email, son username,et ses deux mots de passe.
00:05:32 :Voilà.Donc, il arrive sur la page, il veut s'inscrire.Donc, il envoie le formulaire.Donc, il est dans une méthode post.Et ce qui va se passer, c'est que du coup,ici, l'utilisateur, moi je ne veux pas qu'il soit actif tout de suite.
00:05:45 :Donc, ce que je fais, c'est que je fais un commit à false.Ça, très pratique.Donc, ceux qui sont proches de moi, par exemple,c'est sûr que vous allez utiliser un commit à false comme ça.
00:05:54 :Il y a certainement ce truc-là.En gros, c'est pour ne pas sauvegarder en base de données tout de suite l'objet,mais l'avoir juste en mémoire Python.
00:06:02 :Là, vous l'avez en mémoire Python.Et après, vous travaillez.Donc, qu'est-ce que je fais ?Au lieu qu'il soit passé à true, en actif,je le passe à false.
00:06:09 :Et après, je le sauvegarde en base de données.Voilà.Vous m'arrêtez à l'oral.Si jamais je vais trop vite ou vous ne me suivez pas,vous m'arrêtez à l'oral.
00:06:16 :Parce que je n'ai pas le chat sous les yeux.Vous ne vous gênez pas, ça ne me dérange pas.Donc, voilà.L'utilisateur s'enregistre, mais il n'est pas actif.
00:06:25 :Donc, on va faire un test sur une vue.Deux tests, je pense.Et ici, j'ai un modèle adresse.Adresse, en fait.Tout simple avec user, adresse line, et ainsi de suite.
00:06:42 :C'est une adresse par défaut.On va juste le dire parce que je suis dans les méthodes.Regardez.Ça, c'est juste la méthode.Donc, voilà.Quand je sauvegarde une adresse, qu'est-ce que je fais ?
00:06:53 :Si je fais ça, c'est parce qu'on va faire un test unitairesur le modèle, sur la méthode.Et on va faire un test sur une vue.
00:07:01 :Donc, ce que je fais, c'est que je récupère iciles adresses qui appartiennent à l'utilisateur.Je vais peut-être faire plus optimisé, mais bon.Quand je sauvegarde, je récupère toutes les adresses de l'utilisateur.
00:07:15 :Je fais un count pour compter combien il a d'adresses.Et si il est, par exemple, à settings.maxadresse.Donc, les settings, elles sont ici.Donc, les settings, en fait, vous pouvez les importer comme ça, ici.
00:07:29 :Voilà.Donc, j'importe mes settings et j'utilise ma constante maxadresse.Et donc, s'il a deux adresses, ce que je vais faire,c'est que je vais dire, en gros, un finish.
00:07:41 :Mon maximum adresse a été atteint.Et ici, j'utilise le self.stateadding.Est-ce que vous connaissez ou pas ça ?Non.Non.C'est peu connu.Il y en a qui font, je ne sais plus ce qu'ils font,note du self.pk ou ce genre de choses-là.
00:07:58 :En fait, self.stateadding, ça veut direque ce n'est pas encore en bas.C'est la création, en fait.Vous n'êtes pas dans la mise à jour,mais c'est vraiment la création de l'instance.
00:08:12 :Voilà.Donc là, on est dans la création de l'instance.En gros, ça, ça va être true.Quand vous allez mettre à jour, en fait, ça sera false.
00:08:24 :Donc, voilà.Parce que forcément, si on fait un update,je ne vais pas faire la vérification,je vais faire la vérification qu'à la création d'une adresse.
00:08:34 :Et donc, si l'utilisateur, il n'a pas d'adresse encore,c'est-à-dire que c'est sa première,on la passe en adresse par défaut.Donc, on va tester ça aussi.
00:08:45 :Donc, voilà.Est-ce que ça va pour tout le monde jusqu'à maintenant ?Vous me dites.Donc, on va tester que l'utilisateur est bien un falsequand il s'inscrit.
00:08:57 :On va tester que les adresses ici,tout ce qu'on a mis ici, la logique, elle fonctionne.Et donc, pourquoi c'est utile ?Parce que je ne sais pas, par exemple,si un jour je change ça ici,je change même plutôt quelque chose dans la méthode,ce qui est déjà arrivé, quand on revient sur les choses,
00:09:13 :ça peut impacter d'autres parties du code.Et c'est là que c'est le plus embêtant.J'ai eu le cas cette semaine.Et ce n'est pas cool.
00:09:21 :Donc, du coup,en gros, pas compliqué,vous installez PyTestDjango.Je l'ai déjà installé d'avance.Donc, voilà. En gros, PyTestDjango.On va voir pourquoi il y a la petite sirède Django.
00:09:36 :On va utiliser des PyTestDjango,des plus fournis de PyTest,dans le sens où il y a vraiment des choses spécifiques à Django.Alors, pour commencer,en fait,on va créer ce qu'on appelleun PyTest.ini, ici.
00:09:54 :Et ça, en fait, il est où ?Là.Et là, en fait, vous allezdéfinir...Je dois avoir un template.Il y a quelqu'un qui pose une question ?
00:10:09 :Non ?Non, pas moi.Pas de problème.Alors, du coup, je dois avoir un template tout fait,quelque part, sur un...Bon, après, c'est pas grave.
00:10:21 :En fait, ce que vous allez faire, c'est que vous allez dire Django.C'est les settingsmodules, ici.En fait, ça va être, du coup,le projet.settings. Donc, ça, vous indiquez
00:10:34 :à PyTest, Djangoproject.settings.Voilà. Donc, ça, on lui indique ça.C'est vraiment pour faire des petites configurationsinitiales. Ensuite, on va lui direpythonfiles, voilà, pour les tests.
00:10:48 :Et les tests, on va lui dire, ils vont commencertoujours par être préfixés par test.Je dirais du 8.Voilà. Et ça, c'est pour dire tout ce qui est après,
00:10:56 :on le prend en compte.Donc, voilà comment on configure, déjà,dans PyTest, Django.Donc, on a ce petit fichier .ini. Alors, il y a d'autres
00:11:04 :façons de le faire. Je ne sais plus si c'est avec du YAML ou...Mais, moi, je prends le .ini, je le fais comme ça et je ne change pas.
00:11:08 :Comme ça, à chaque fois, je prends mon petitbout de code et je le recolle.Parce que tous les projets,moi, je les nomme project, ici. Comme ça, je sais que c'est le dossier
00:11:16 :projet.Euh... J'ai rien oublié.Project.settings, Django...OK. Ça a l'air bon.Donc, voilà. Donc, premièrement, on fait ça.Alors, ensuite,quand on regarde...Ah, j'ai dû l'effacer. C'est dommage.
00:11:32 :En fait, quand vous créez une application... Je ne sais pas si je l'ai ici.Non. Voilà. Quand vous créez une application,il y a toujoursun fichier de test qui est déjà présent.
00:11:40 :Moi, ce que je fais, c'est que je le supprime.Parce que, un peu,dans l'architecture Django, de base,ils mettent les fichiers de test pour faire les testsdirectement dans les applications.
00:11:50 :Moi, je ne m'embête pas. Je ne fais pas ça.Ce que je fais, c'est que je fais un dossierque j'appelle test.Hop.Tac.Il va être là, du coup.
00:12:02 :Et, dans ce dossier test, ce que je fais,c'est que... Alors, déjà, pour que ça fonctionne,il faut qu'on crée un package.Un init.py.Voilà.
00:12:12 :Donc, ça, on laisse vide.Donc, on crée un package. Et, ici, je vais faire deux choses.Je vais me refaire un sous-dossier.Il y en a un que je vais appelerinit testpour mes tests unitaires.
00:12:24 :Et,je vais en faire un nouveauque j'appelle, en général,intégration.Intégration, c'est un gros mot.J'appelle les testsde vue.Et,ainsi de suite.
00:12:42 :Donc,j'ai bien mon fichier init.On va commencer par le test de la vue.Je pense qu'il me paraît pas mal.Ouais.On va faire ça.
00:12:54 :On va prendre le test de la vue.Du coup,alors, hop,on va faire un fichier et on va l'appeler,je sais pas, on va l'appeler testpour simplementsign up.
00:13:08 :Sign up.py.Hop, je vais enleverça qui me casse pas n'importe quoi.Voilà.Et, c'est parti. Donc, là, en fait,première chose, vous importezpas le test.
00:13:22 :Alors, attendez, je vais faire untest vite fait,dev test fou.Hop.Je regarde juste quelque chose.Si j'ai pas fait une erreur de configuration.
00:13:38 :Non, c'est bon, il passe le test.OK. Voilà.On peut continuer comme ça.Voilà. Donc,alors,ce que je fais quand je fais mes tests,quand je teste mes vues, surtout, ce que je vais faire,c'est que je vais, hop, hop là,je vais appelerreverse ici. Enfin, je vais l'importer
00:14:00 :plutôt.Reverse pour mes URL.Là, on est sur les utilisateurs, donc on vaappeler contango.contrib.C'est ça.Import. Alors, je sais pas s'il y en a qui
00:14:14 :le font, ça, getUserModel.En fait, moi, j'appellejamais le modèle directement, mais je passe par cette fonctionqui dynamiquement,en fait, va aller me chercher le modèleutilisateur du projet que j'ai réglé dans mes settings.
00:14:26 :Voilà. C'est un peu plus propre.Et voilà pour l'instant.Donc, comme ça, je me fais user.Je sais que mon modèle user, il est là.
00:14:34 :Hop. Là, ici, j'ai récupérémon modèle utilisateur, ici.Donc,excusez-moi. Hop là.Et donc,comme je vous disais, quand on fait unsign up,je vais essayer de vousmontrer ça.
00:14:52 :On a un serveur.Quoiqu'on n'ait pasvoulu regarder par le serveur, je pense,voilà, si on va voir le serveur, quand même.S'il a envie.
00:15:02 :Hop là. Est-ce que j'ai un sign up ici?Voilà. Alors, c'est un super formulairequi est moche, mais c'est parce que nous, c'est pas embêté.
00:15:08 :Hop là.Donc là, vous voyez,vous avez vos champs, ici.C'est peut-être un petit, mais il y a le nomemail, ici.Voilà. Vous avez ici le
00:15:20 :champ username.Et puis, ainsi de suite, vous descendez. Vous avez le champpassword1.Il y avait quoi dans les listes? Je ne sais plus.Et là, password2.
00:15:30 :Voilà. Donc, en fait,comme ça, vous pouvez inspecter le nomde vos champs. Ou sinon,après, le nom de vos champs, vous les avez dans les formulairesDjango.
00:15:40 :Donc, pourquoije dis ça? Parce que là, en fait, ce que je fais, par exemple,ici, pour ce genre de vue, je vaisme préparerdes données de sign up.
00:15:50 :Hop.Parce que des fois, je m'en sers plusieurs fois. Donc, je me lesprépare en constante.Donc, on a dit qu'on avait un champ email dans le sign up.
00:15:58 :Voilà.Donc, notre mail, on va l'appelerici, Airbaseemail.On se prépare un petit dictionnairecomme ça. Vous allez comprendrepar le suite. Username, on va
00:16:12 :l'appeler comment? On va l'appelerjc.Et on avait dit qu'on avait password1.Password1.On val'appeler comment? On va mettrepour que ça passe, mot2.
00:16:26 :Pass 123.Voilà.Je ne vais pas dire que ça ne fonctionnera pas. Et ça,je vais le recopier.Comme ça, on ne fait pas l'erreur.
00:16:36 :Et ce champ-là, ça s'appelle password2.C'est la confirmation.Donc là, on a des données de préparer pour notresign up. Et donc, pour commencer,on peut se faire un test très simple.
00:16:46 :Ici, on peut avoir quelques petites choses.On va se faire un pytest.On vafinir par ça plutôt. On va commencer un testavant. Test.
00:16:56 :Sign up, on va l'appelerview.Et on va se mettre enméthode get pour commencer.C'est la méthode get.On arrive dans la vue de sign up.
00:17:08 :On affiche les formulaires parce qu'on est en méthode get.Et dès qu'on envoie le formulaire, on sera en méthode post.Voilà. Tout simplement.Et en fait, ce qui se passe, c'est quepytest.jango
00:17:18 :vous fournit une fixture.Vous allez l'appeler ici.Et voilà. Elle est là.On appelle une fixture.C'est intégré. Vous pouvez l'utiliser dans tous vos tests.
00:17:28 :La réutiliser. On verra après le principe de fixture.Vous pouvez la réutiliser.On peut letipper. Je vais vous montrercomment on peut le tipper parce que c'est pratique de le tipper.
00:17:38 :C'est fromdjango.testje crois.Voilà.Et on peut letipper en utilisant ça.Pourquoi je le tippe ?Parce que comme ça, j'ai l'autocomplétion.C'est pratique.
00:17:56 :Donc voilà. C'est parti. On va se faireune méthode get sur notrevue.On va utiliser une variable response.Faire client.Comme ça, on a accès àtoutes les...
00:18:10 :à tout ce qu'on peut appeler. C'est pas mal.Donc on va se faire une get,on a dit. Et puison va faire un reverse et on va appeler notre URL.
00:18:18 :Et l'URL, j'imagineque je l'ai appelée accountSignUp.Donc accountSignUp.C'est ça.AccountSignUp.Alors, je ne sais plus. Il y en a qui...Il y en a qui...
00:18:34 :Comment dire ? Souvent qui mettentles URL dans le dur. Ils n'utilisent pasreverse, ils mettent les URL dans le dur. Mais évitez.Appelez plutôtvos noms d'URL. Comme ça, c'est dynamique.
00:18:44 :Parce que si un jour vous changez l'URL ici,si vous mettez l'URL dans le dur, ça va casser. Donc au moins,si vous utilisez ça, ça ne cassera pas.
00:18:50 :Donc j'ai bien utilisé mon nom d'URL.Maintenant,qu'est-ce qu'on va faire ? On va se faire...J'ai une question ?Oui, s'il vous plaît.Je n'ai pas bien compris au niveau des URL.
00:19:06 :Ok.Pourquoi ?Parce qu'en fait,l'URL...L'URL ici...Donc là, je suis dans mon dossier de projet.On ne va pas prendre ça.C'est l'account que j'avais dit.
00:19:24 :En fait, l'URL,quand tu vas faire ton test,tu peux très bien direeffacer ça et allerrentrer ton URLdans le dur.Mon URL.
00:19:38 :En chaîne de caractère, je peux très bien diremon URL machin.Ainsi de suite. Peu importe ton URL.Tu peux rentrer ton URL comme ça dans le dur.
00:19:48 :Sauf que, ok,ça va fonctionner, mais si demain tu vas aller modifierton URL ici,ça va casser.Parce que des fois, tu vas aller mal nommer, ça ne te plaît pas,tu peux le modifier.
00:20:00 :Là, si tu utilises le name que tu as mis ici,qui s'appelle signup,c'est pour ça que je l'appelleaccount.signup, parce qu'ici, j'ai l'app name.
00:20:08 :Donc, account.signup,comme je l'ai faitlà,en fait, ça va me construiremon URL dynamiquement.Je peux changer, si je veux,mon URL.Demain, ça marchera quand même. Il n'y a pas de problème.
00:20:24 :Je ne sais pas si c'est assez clair.Ok.Donc, voilà.Ok. Donc, maintenant,on va faire un test.Un premier test.On va prendrele statut code. Donc, quand c'est une requête
00:20:42 :GET qui réussit,ça envoie une réponse 200.Et là, si le test ne passe pas,je l'ai goûté, ça veut dire que j'ai fait une connerie.
00:20:50 :Ok, ça passe.Donc là, on voit que, très bien,ça passe. Ça envoie bienune 200 quand je faisune GET.Ensuite,PyTestDjango fournit desasserts spéciauxpropres à lui.
00:21:08 :Je vais vous montrer pour que ce soit plus clair.Donc, from PyTestDjango,assert, je crois,assert, c'est ça.En fait, on peut importerplusieurs asserts. Donc là, je ne sais pas,
00:21:20 :on va prendre un basictemplate. Il n'y a pas un assert templateuse. Je ne sais pas si vous le voyez.Voilà.C'est celui-là. Par exemple, celui-là.
00:21:30 :Donc là, on pourrait très bien direassert template use.Hop.Notre réponse, forcément.Et on va prendrenotre nom URL.On peut le mettre en reverse.
00:21:48 :Je vais le mettre en reverse.Et normalement, ça passe.Non, ça ne passe pas. Il faut que je fasse...Qu'est-ce qui me fait ...
00:22:10 :Je ne sais plus si je peux faire un reverselà-dedans. Je vais essayer de mettreaccount, sinon account.Mais non, je suis bête.Ce n'est pas l'URL. Je fais n'importe quoi.
00:22:22 :Ce que je veux, excusez-moi,je dis n'importe quoi. Ce que je veux, c'est tester.Je suis encore dans mon URL. Ce que je veux, c'est aller tester
00:22:28 :le templatequi est ici. Donc, qui est dans le dossieraccount, ici. Donc, c'est accountsignup.html.Voilà.Oui, je ne sais pas ce que j'ai voulu faire.
00:22:40 :J'étais resté là-haut.Donc, voilà. Normalement, là, ça passe.Voilà.Donc, c'est passé. Donc, ça vérifiebien que c'est mon template, ici, qui est utilisé.Parce que si je retourne dans la vue,on a bien un render et on utilise bien ce template-là.
00:22:54 :Donc, demain, si vous changez detemplate, comme ça, s'il y a un problème, que je ne sais pas,vous le renommez ou que le nom ne vousplaisait pas, vous mettez le compte dans ça, peu importe.
00:23:02 :Comme ça, vous relancez tous vos tests.Hop !Boum ! Il sait que ça casse.Et ce qui est sympa, aussi, ce qu'on peut faire,on peut faire,pour avoir plus de détails, on peut faire unpytestrp.
00:23:16 :Et là, on voit ce qui se passe.Euh...Il y a un peu plus...Bon, c'est un peu le bazar. Il y a plein de choses.
00:23:24 :Et voilà. Donc, là, ilvous donne le message.Il vous dit que ce n'est pas le template qui est utilisé.Donc, voilà.Euh... Je reviens là.
00:23:34 :Donc, ça, c'est un des...C'est vraiment un test facile que j'ai mis enplace. Là, c'est tout basique.Maintenant, on va s'attaquer à un peuplus compliqué quand on est dans les méthodespost.
00:23:46 :Et...Ce que je veux vous dire, aussi, c'est que quand vous faites un test...Alors, on va l'appeler signup...Euh...On va plus s'amuser sur le test unitaire, après.
00:23:56 :Euh...On revient en post.On va rappeler le client.Voilà, qui est utilisable.Et là, le problème, c'est qu'on va devoir accéderà la base de données de Django... à la base de données
00:24:08 :de test. Et donc, ça,il faut lui dire, explicitement,avec PyTest, en déclencheur,s'il faut...C'est .mark....django.db...Django... Il n'y a pas d'interconnexion là-dessus.
00:24:22 :Voilà. Et là, on lui ditqu'en gros, t'as le droitd'accéder à la base de données de test.Forcément, ça ne va pas utiliser la vraie base.
00:24:30 :Ça ne touche pas votre base de données.Et c'est une base de données de test qui va être utilisée.Et donc là, vous lui dites, t'as le droit de faire ça.
00:24:36 :Et donc là, ce conflit, en ce cas-là...Donc, c'est parti.On va se resserrer à une réponse.Une réponse.On va se resserrer à client.post.
00:24:46 :Cette fois, on est en méthode post, OK?Vous m'arrêtez si ça va pas.On se revient à un reverse, comme tout à l'heure.Donc, on va reprendre...
00:24:54 :Donc là, c'est bien l'URL.Sign up.Sauf que cette fois, on fait plein de simples GET.Vu qu'on est en post, on veut lui envoyer des données.
00:25:03 :Et donc, si on veut l'envoyer des données,on fait paramètres data.On dit...Ça dit quoi?Je crois qu'il y avait une question.Et donc là, on envoie les données qui sont là.
00:25:19 :Voilà.Parce que je fais ça parce quequand je fais des tests comme ça, j'en ai besoin plusieurs fois.Donc comme ça, moi, j'ai les données constantes et je les réutilise ici.
00:25:29 :Et donc maintenant, ce qu'on peut faire,ce qu'on pourrait se faire.On va faire... Est-ce qu'il n'y a pas une erreur ou pas?On va le faire après.
00:25:37 :Donc là, on va se direuser est égal àuser.obj.get.Et on va récupérer l'utilisateur.Email.Donc, c'est...J'utilise mon dictionnaire.Voilà.J'ai un script utilisateur ici.
00:25:57 :Et là, pour le récupérer,j'utilise l'email qui est là.Je récupère par la clé.C'est plus dynamique, on va dire.Et ensuite, on va se faire un...
00:26:07 :user.is activeis false.C'est ça que je voulais faire.Response, on ne l'utilise pas encore.On l'utilisera après.Donc là, on va vérifierque l'utilisateur...
00:26:27 :On a dit tout à l'heure queil ne devait pas être actif quand on l'a inscrivé.Donc là,on va tester.Si je n'ai rien fait planter...
00:26:37 :Non, c'est bon. Donc là, ça me dit que c'est OK.L'utilisateur est bien actif.Si j'ai mistout, on peut voir que...Hop là.Hop.
00:26:49 :Boom. Là, il vous le dit.En fait, il est actif.Voilà. Il vous met un assert false.Donc,il est bien false. On va le laisser.
00:27:03 :Et ce qu'on pourrait tester aussi,c'est, je ne sais pas, on pourrait très bien...Quand on fait une adjust comme ça,on fait un redirect quand il est inscrit.
00:27:11 :On le renvoie vers l'index, l'utilisateur.Et on pourrait très bien dire assertresponse comme tout à l'heure pour un statutcode égale...302 dans la direction. Quand on redirige,
00:27:21 :c'est 302.Hop.Et là, on vaen lancer.Hop, c'est passé.Donc, on a vuune 302. Qu'est-ce qu'on pourraitregarder comme ça ?Alors, ce qui arrive souvent,et ce qui est extrêmement chiant,je vais vous montrer,c'est quand vous vous trompezdans les données de test.
00:27:47 :Je ne sais plus, la dernière fois, j'ai mis un mot de passetrop court ou calé, donc ça ne passait pas.Et donc là, quand vous faites ça,là, on voit qu'il manque quelque chose,mais il y a des moments où c'est plus subtil.
00:27:57 :Vous lancez votre test,et là, vous êtes dégoûté parce que si vous cherchez,vous ne trouvez pas, vous ne voyez pas l'erreur.Parce qu'en fait, c'est juste un mot de passe qui est un peutrop court, mais on pensait que c'était bon.
00:28:07 :Et quand on en a plein la tête, c'est un peu galère.Donc là, vous pouvez faire un truc qui est vachement bien.C'est qu'au niveau de la response,hop,on va faire un print ici, parce que je vous dis,c'est sûr que c'est le formulaire qui ne va pas.
00:28:19 :Retenez-le,parce que ça va vous aider.En fait, on peut aller récupérerle contexte du formulaire.Tac.Voilà, on récupère dans le contexte.Et on va aller récupérer.errors, c'est ça.
00:28:35 :Et donc là,je vais relancer le test.Hop.Et voilà.Et si je fais ça normalement,ici, vous voyez,il vous dit que les deux mots de passe ne correspondent pas.
00:28:49 :Donc peu importe l'erreur, sinonil vous diraitque le mot de passe est trop court, ou ainsi de suite.Mais en tout cas, vous pouvez comme ça récupérerles erreurs du formulaire.
00:28:59 :Et franchement, retenez-le, parce que je suis sûrque vous avez utilisé ça.Donc, ça a utilisé.Et quand il n'y a plus de problème,si vous oubliez de l'enlever,c'est que vu qu'il n'y a plus d'erreurs,c'est que ça va être à non.
00:29:13 :Hop. Non.Voilà. Il vous dit que c'est à non.C'est parce qu'il n'y a plus d'erreurs.Il faut penser à l'enlever après.En général, si vous faites un print et qu'il vous sort une erreurparce que c'est à non, c'est que c'est bon signe.
00:29:25 :C'est que normalement,là, il n'y a plus d'erreurs.Voilà.Donc voilà. Là, on a fait déjà deux testspour tester un peu notre vue.Est-ce que ça va pour l'instant ou pas ?
00:29:37 :Ouais, tu peux juste revenir sur le décorateur.Le décorateur, je ne suis pas sûr d'avoir bien compriscomment ça fonctionne.Je ne le mets pas.
00:29:45 :Et en fait, qu'est-ce qu'il te dit ?Il te dit que lui, il n'a pas accèsà la base de données.OK. Donc le décorateur,
00:29:55 :c'est pour créer une base de données fictive,c'est ça que tu disais ?Une base de données fictive qui est créée pour les tests.Mais le problème, c'est que là, vu que tu fais une poste,tu vas toucher la base de données.
00:30:05 :Tu vas créer quelqu'un d'autre.Si tu ne donnes pas le droit d'y accéder,il va te renvoyer une erreur.C'est juste pour donner un...Je n'ai pas le décorateur, mais là, je fais juste un get.
00:30:15 :Donc je ne touche pas la base de données.Pas besoin. Mais là, vu que j'y touche, j'en ai besoin.C'est bon ?Ouais, c'est bon.
00:30:23 :Quoi j'avais pensé ?Je m'étais noté des idées.Dans les tests unitaires,on va se faire ça, je pense.Ouais.On va se faire les tests unitaires.
00:30:35 :Je vais vous montrer quelque choseavant de faire un test unitaire.Pourquoi j'aime bien PyTest ?Si celui-là...Dans le dossier test,ici, on va faire un filequ'on appellecompte-test.py.
00:30:51 :Donc là, je suis bien dans mon compte-test.Je vais vous montrer.On apporte PyTest, bien sûr.On va...On va créer un utilisateur.Donc on va...
00:31:07 :C'est quoi, d'ailleurs ?C'est contrib, c'est ça.À chaque fois que j'ai une paire,j'importequelques modèles.Ensuite, on va importer...On aura besoin de quoi ?
00:31:21 :Je pense qu'on aura besoin de...On va faire ça.On va apporter le modèleadresse... Voilà.Je vous expliquerai pourquoi après.Donc là, ce qu'on peut faire, c'est qu'on peut...
00:31:33 :On ne va pas créer de test, ici.Là, on ne crée pas de test, on va juste créerce qu'on appelle des fixtures.Est-ce qu'il y en a qui connaissent ou pas ?
00:31:41 :Oui.OK. Donc non.OK.Non, on va faire user1.On va faire user1.C'est vraiment trop bien, vous allez voir.On va créer un utilisateur comme ça.
00:31:55 :On va faire un return.C'est user...user.getUserModelHop.User.objects.getUser.objects.getC'est createUser.C'est createUser.On va créer un utilisateur.On va mettre userNameuserName.gabuserName.gab
00:32:21 :emailemail.comemail.comemail.comOn avait quoi aussi ?On avait dit qu'on peut mettre un...Non, ce n'est pas obligatoire.On va essayer de mettre le password direct.
00:32:37 :Password.Je n'ai pas fait de faute.Password.Qu'est-ce que j'ai fait ?Ah oui, j'ai oublié.Password12341234, c'est ça.Donc là, on a créé une fixture.
00:32:53 :Et ça, c'est très pratique parce que maintenant,je vais aller me créer du coupici un fichier.Et on va l'appeler...On va tester la méthoded'adresse.
00:33:07 :Voilà, c'est parti.Donc là, on ne va pastester du coup de vue. On va juste essayerde faire des tests unitaires.Donc c'est parti.
00:33:19 :Et là, on va s'amuserun peu. Donc, on va encore créereuh...On va apporterl'adresse.On va importer les settings.Je ne sais pas si vous vous souvenezpourquoi je fais ça.
00:33:37 :Sinon, je vous remonte.Import settings.Parce que dans les settings ici,j'avais défini un maximumd'adresses maximum d'utilisateurs ici.Dans les settings, voilà.Donc, c'est parti.
00:33:53 :On va se faire un premier test et on va vérifierquand on avait dit tout à l'heure, quand on créeune adresseet que c'est la première, on veut qu'elle soit misepar défaut ici.
00:34:03 :Donc,et là, je vais vous monter différentes méthodesqui vont vraiment vous servir pour les tests.Plusieurs façons de faire.Alors,par exemple, c'est parti, on va coucherla base données. Donc, on va rappeler
00:34:17 :on va donner l'autorisationau test d'aller coucher la base donnée.Donc, on va l'appelerDef Test.On va mettre Firstaddressisdefault.Voilà.Alors,donc,pour qu'il y ait une adresse, il faut qu'il y aitun utilisateur.
00:34:45 :Alors, normalement, si vous n'avez pas de fixure,c'est que vous allez devoir vous créer un utilisateur avant dans le testet après, créer l'adresseen mettant l'utilisateur en foreign key.
00:34:53 :C'est pour ça qu'en fait, il y a un truc qui est plus simple,c'est les conf tests. Parce quedans les tests, en fait, vous aurez sûrement besoin plusieurs foisd'utilisateurs, pas qu'une fois.
00:35:01 :Donc, au lieu de créer un utilisateur pour chaque test,ici,il va le reconnaître normalement, user1.Voilà. Et donc, comme ça,on peut se créer en fait desdonnées toutes faites comme ça.
00:35:13 :On ne parlera pas du yield aujourd'hui,on va rester avec le return.On va se créer des données comme ça qu'on pourra utiliserdans tous nos tests. Mais dans tous les tests, en fait, qui sont
00:35:21 :en dessous dans l'abrévissance de conf test,tous les tests peuvent l'utiliser. Même s'ilrevient sur, par exemple,mon signup ici, je l'aurais prévu très biendire, utiliser user1.
00:35:31 :Voilà.Donc ça, c'est pour ça que c'esttrès très aimé aussi PyTest, Django,c'est qu'on peut utiliser les fixtures comme ça.Donc voilà.Alors, ce qui n'est pas bien, c'est que je n'ai pas dedocstring, mais quand je fais des tests, je mets toujoursdes docstrings. Mais bon,
00:35:47 :là, pour la démo,c'est pas très grave.Et donc,maintenant, on peut aller se créerl'adresse.Alors,hop,et qu'est-ce qu'on veut dans l'adresse ?
00:36:03 :On avait dit qu'il y avait l'utilisateurqui est rattaché à l'adresse.Donc voilà, comme ça, on ne va pas le créer avant.On al'adresseline1 que j'avais mis.
00:36:15 :On va se mettrepar 772route machin.Tac.Ensuite, dans l'adresse, il y avaitl'adresse, on avait mis city,la ville qu'on voulait.Hop.Et ensuite,il y avait postalcode.
00:36:39 :Hop.Et on va mettre le mien.Voilà.Donc là, on a créé notre adresse.Si j'ai fait de la bêtise, l'adresse est en line2,mais pas obligatoire. C'est bon, city,
00:36:51 :postal code, défaut.Voilà. Donc maintenant,je suis là, j'ai créé mon adresse.Je pense qu'il n'y a pas d'erreur.Maintenant, ce qu'on va faire,on va faire un simple assert.
00:37:03 :On va mettre adressedéfautiltout.Logiquement, ça devrait passer.Voilà.Donc là,hop.Et donc là, en fait,imaginons que demain,je ne sais pas, je retouche à ma méthode là.
00:37:25 :Ou quelqu'un,plusieurs à bosser, il y en a un qui fait un trucqui touche,qui supprime machin.Par défaut, j'ai mis comment ?Et là, vous êtes là,vous lancez tous vos tests.
00:37:39 :Et là, vous savez d'où vient le problème.Vous avez l'assertive directement ici. Comme ça, vous savez où allerchercher en fait.Et vous savez que ça vient d'être là qu'il y a un problèmeoù l'adresse est plus amise par défaut.
00:37:51 :Voilà. Donc voilà.Là, c'est un premier testbidon. Mais au moins,on voit que c'est quand même pratique.Maintenant, on va faire un cas plus intéressant.
00:38:01 :Pour ça, on va se créer des fixtures.Des fixturesadresse. Je pense que ça serait plus sympa.Ouais, on va faire ça.On va se créer des fixtures. Et pour ça, ce que je vais faire,
00:38:13 :c'est que je vais aller copier ça.Ça me paraît pas mal. Hop.Et je vais juste les modifier un peu. Je retourne ici.Hop.Pytest.fixture.
00:38:25 :Hop.On va se faire unadresse.Un user.Donc le 1.Et on peut réutiliser la fixture du dessus.Hop.Les fixtures sont réutilisablesentre elles. Hop.
00:38:43 :Et on va se faire un return.Donc là, c'est sale.Forcément.Hop là.Bon.C'est pas bien indenté, mais c'est pas très grave.Pour l'exemple, je sais pas. Là, on va changer un petit peu.
00:38:57 :On va en mettre un qui s'appelle...Hop. On va mettre des trucs différents quand même.Hop.Voilà.Et on va en faire une deuxième.Ici.
00:39:09 :Parce qu'en fait, on va aller testertout simplementle...Comment dire ? Le fait que quand on adeux adresses, c'est le maximum.Donc on veut pas que l'utilisateur puisse avoirplusieurs adresses. Donc là,
00:39:25 :ce qu'on va faire comme place, du coup,c'est où ?Quand il y a plusieurs adresses,on enlève une exception.Voilà.Donc là, ce que je vais faire dans mon test.
00:39:37 :Hop.Donc là, c'est pareil. On varéutiliserla... On va donner accèsà la... Ça, c'est un peu réverbatif, maisil y a un moyen de le faire qu'une fois.
00:39:49 :Je sais plus si c'est un truc genre...Vous faites un truc genrePyTest... Je sais plus.C'est PyTestMark ou un truc dans le genre.Et là, vous m'avez déclaréque je ne sais plus comment on fait. Et en fait, ça va appliquer du coup à tout.
00:40:01 :Mais là, je ne l'ai plus en tête.Donc, c'est parti.Donc là, on va faireTestMaxAddressesLimit.Donc de quoi on a besoin ? L'useur 1,
00:40:17 :l'adresse1, l'adresse 2.Voilà. Comme ça, on n'a pas à les récupérer à chaque fois.Puisqu'elles sont ici.Et donc maintenant, tout simplement,on va iciessayer de créerune nouvelle adresse.
00:40:33 :Donc, on va reprendre celle-là.Hop.Hop là. Et donc,ce qu'on va faire, c'est qu'on va utiliser un context manager.Hop.Voilà. Régis.Et on veut que ça lèveune value error.
00:40:49 :Voilà.Et donc ensuite, on va mettreun alias comme ça.Et ici, on va laisser créer l'adresse.Hop.Super orientation. C'est bon.Voilà.Et maintenant, moi, ce que je veux, c'est que quand jefais un assert,hop,on va lui...
00:41:11 :On s'en est pas obligé. C'est justepourvérifier en faitle message qui estqui est dansl'exception.On peut très bien faire comme ça.
00:41:25 :Voilà, j'ai mis le nombre.Je peux embêter. On va copier ça.Hop.On est sûr que ça passe comme ça.Hop.Voilà. Normalement,si je me fais de bêtises,ça devrait passer.
00:41:41 :Ouais, ça passe. Donc vous voyez,là en fait, on a un context manageret il est censéfaire une valueError.Donc s'il me la lève,le test passe. S'il ne la lève pas, il dira
00:41:53 :qu'il n'y a pas de valueError de levée. Donc il y a un problème.Et donc, très pratiqueparce que du coup, vous savez que là,c'est bon, en fait,ma limite qui est ici,qui est là, elle fonctionne.
00:42:05 :On va voir un dernier test qui est sympa aussi.Ça c'est pareil, c'est un couple.Je vous le montre parce que vous allez péter des plombssinon si vous avez le problème qui vous arrive.
00:42:19 :Le nombre de fois où je me suis fait avoir au moins10 fois là-dessus au début,et même encore hier je me suis fait avoir d'ailleurs.
00:42:27 :On va faire un update test.Et dans les updates, l'exemple c'est problématique.Existing, plus l'erreur,on va appeler existingadresse.Je vais essayer de donner un contexte un peu.
00:42:47 :Donc là, en fait, on veut quequand on met à jour une adresse,et bien, même si on adeux adresses, on ne veut pas être bloqué.
00:43:03 :On ne veut pas que ça bloque puisque la limiteici, elle ne marche plus quand c'est une nouvelle adresse forcément.On veut pouvoir faire un updatesans avoir l'exception qui soit levée.
00:43:11 :Donc vite, si vous ne suivez pas,je continue.Après, je pense sur un exempleassez lourd pour terminer.Et donc là, ce qu'on va faire,c'est qu'on va prendre du coup notrenotreje ne sais pas, on aurait même pu ne mettre que l'adresse2 en fait. Non, on va garder la 2 comme ça
00:43:29 :on a déjà deux adresses.C'est le but du truc.Donc adresse 1, ici on va se direadresse line1, on va le modifier,on va mettreupdateadresse, peu importe, c'est une superadresse, voilà. Et bien sûr,
00:43:47 :on va faireun save. Et je vais vous montrerquelque chosequi est assez sympa. Donc si ça marche, je suis dégoûté.J'aimerais bien que ça ne marche pas.
00:43:57 :Ah certes, c'est l'adresse 1que j'ai changé. Ouais.Adresse 1, ici.Et on va prendre lepoint adresse line. Je m'y perds à force.Tac, voilà.
00:44:09 :Et donc ça va être égal àça. Et là,et là, normalementça passe pas.J'espère que ça passe pas.Ça passe.Je suis dégoûté. Alors là,
00:44:23 :ça passe.C'est normal que ça passe, parce que je l'ai fait.Mais en fait, des fois ça passe pas.Donc un conseil, avant de vous dire, ah je comprends pas,mon save il marche pas, ou il y avraiment un vrai problème. Adresse 1,
00:44:37 :adresse 1, j'ai fait.Toujours, quand vous faites un slash, que vous montiez votre objet,ce que vous faites,c'est que vous rappelez ici votre objet,et vous allez faire un refresh.
00:44:47 :Voilà.Parce que là, j'ai du mal, c'est passé.Mais là, bon là, de toute façon, ça va passer.Mais là, c'estobligé que ça passe.
00:44:57 :Voilà. Parce qu'en fait,des fois, comment dire, ça se met pas à jour,c'est en mémoire, mais c'est pas mis à jour.Il a encore l'ancienne valeur en mémoire.
00:45:05 :Il faut que vous fassiez un refresh depuis votre base de données.Voilà. Donc ça, je vous le montre.Très important, ça vous éviterade péter des ponts sur vos tests.
00:45:13 :Pensez à l'utiliser dès que vous faites un update, comme ça,que vous regardez derrière,pensez à faire ça.Donc voilà.Je vais m'arrêter là pour le code, je vais juste montrer aprèsun exemple rapide que j'ai fait.
00:45:29 :Est-ce que, pour le moment,ça vous a plu, ouça va trop vite, vous êtes un peu perdu, ou c'est bien ?Ça va ? Non, c'est super intéressant.
00:45:37 :Ouais, très bien, merci.Merci. Intéressant. Merci.Super, merci. Cool, c'est un plaisir.Donc, voilà.Pensez toujours,les tests, vous les mettez où vous voulez.Dossier test, on va ranger un peutout ça. Dossier test,
00:45:53 :ensuite, j'ai mes contests, donc mes fixtures,que je réutilise dansmes différents tests. Voilà.Juste que ce truc, Gab, c'estque, pour les fixtures, t'as pas besoinde les importer ou quoi que ce soit, du moment que t'as tonfichier de contest de créé,avec tes fixtures dedans, tu peux les appeler n'importe où
00:46:09 :sans les importer ou quoi que ce soit.Complètement. Là, tu vois, j'ai rien importé.Lui, il sait très bien,en fait, t'as l'autocomplétion,il sait très bien, tu vois, il va aller chercher.
00:46:19 :Il les trouve, ouais.Il teste, c'est trop fort, moi, j'adore ça.J'utilise plus, en fait, du toutle client test, enfin, pas client,j'utilise ça, mais leframework Django test qui vasur AnyTest. Je n'utilise vraiment que
00:46:33 :PyTest, maintenant.J'ai mis du temps, j'ai eu du mal, mais en fait,quand tu le connais, après, c'est vraiment génial.Alors,je vais vous montrerun truc rapidement.
00:46:45 :Pourquoi les tests, c'est important.Ils sont là, les tests.Là, j'ai les tests finitaires,tests de vue.Par exemple,ça, c'est pour le SAV, ça, c'est pour le magasin.
00:47:01 :Par exemple,j'ai des modèles.Alors,j'ai des modèles.Eux, c'est des bébés, c'est bon,ils sont gentils, il n'y a rien de fou là-dedans.Par exemple, quand on va partir surle modèle,le cartes, déjà, ils commencent à être un peu plus violents.
00:47:19 :Voilà.Voilà, le order.Le modèle order qui est bien plusénorme et où il y abeaucoup plus de logique.Ça, c'est une méthode, en fait, qui me permet de créer mes commandes.
00:47:33 :Vous voyez,il se passe beaucoup de chosesdans la méthode, elle est assez balèze.Là, pareil,il se passe quand on est dans les items, pareil,ici, quand je descends, j'ai pas mal de petites méthodesici.
00:47:47 :Pareil, pour le SAV, c'est plusc'est plusgentil, on va dire, pour quand mon système deSAV, il est où, là ? Il estici.
00:47:59 :Hop.Mais là, normalement, il n'y a pas trop de trucs.Voilà, c'est plus, voilà, il y a un petit peude logique, mais en fait, ça va aller m'appelerdes méthodes duc'est quand les gens, en fait, vont faire desacclamations sur des produits, donc ça va appelerdes méthodes sur le produit. Voilà.
00:48:15 :Et, en plus, ça peut utiliserlesfonctions. Donc,vous voyez, en fait, il y a des liensun peu partout.Il y a des, comment on appelle ça,de l'agrégation.
00:48:29 :Un trou de mémoire,quand j'utilise mes classes dans les autres, ainsi de suite, mes méthodes.Donc, mon code, comme ça, je l'ai bien découpé.L'héritage.
00:48:37 :Même pas l'héritage, c'est là, il y a l'agrégationet le...Oh, je ne sais plus, je ne l'ai plus en tête.Et du coup,maintenant, en fait, moi, je suis obligé, ici, d'avoirbeaucoup de tests pour tout ça, parce que c'est...
00:48:49 :Sinon, c'est une horreur.Par exemple, ici, j'ai les vieux testset une test. Voilà. Et, en fait,je teste, j'ai plein de scénarios.Tout en haut. Hop là.
00:48:59 :Et, en fait, j'ai des tests pourtous les scénarios. Je me les écris, là,mes scénarios à chaque fois.À chaque fois, j'ai tous mes scénarios qui sont ici.
00:49:07 :Et je me les écris pour tout. Vous voyez, j'ai pleind'asserts.J'ai plein... Ah, un truc qui ne me plaît pas.Non, c'est bon. J'ai plein, plein d'asserts.
00:49:15 :Voilà. Donc, pourquoi je fais ça ?Donc, là, vous voyez, il y a du retraction de DB, parce que ça ne se mettait pasà jour, justement. Pourquoi je fais ça ?
00:49:21 :Parce qu'il n'y a pas longtemps,dans mon code,par exemple...Après, je ne vous embête plus, je vous lâche.Dans le code, ici, je l'avaismodifié quelque chose dans le shop.
00:49:33 :C'était dans la... Ici, voilà.C'était ici.Voilà. Ça doit être celle-làou dans cette méthode-là.Et, en fait, ça, ça va aller... Ma condition,ici, je l'avais un petit peu modifiée. Je ne sais plus pourquoi.
00:49:45 :Sauf que, derrière, ça m'impactebeaucoup plus de choses. Et donc,quand j'enlais mes tests, boum, ça a cassé.Quand je ne faisais pas de tests, avant, je testais un peu manuellement.
00:49:53 :Et je me rendais compte, trois joursaprès, qu'en fait, tiens,il y a un truc qui marche plus ou qui plante.Là, au moins, maintenant, à chaque...
00:50:01 :À chaque fois que j'ai fini de développerce que je voulais faire, je lance mes tests.Donc, là, vous voyez, il va me collecter111 tests.
00:50:09 :Hop. Et, en fait,comme ça, il va aller vous tester à chaque fois, chaque fichier de test.Et, comme ça, hop,il va, ainsi de suite, il va vous dire,du coup, vous savez exactementquand il y a un problème, je vous mets un petit f,un fail, sur le petit point.
00:50:23 :Par exemple, ça, c'est un f à la place.Et vous savez exactement où c'est cassé.Et, en fait, comme ça, j'ai réussi à débuggeren une minute tous mes problèmes.
00:50:31 :Et j'ai débugué grâce à ça, grâce à mes tests, en fait.J'ai vraiment écrit tous mes scénarios dans les fichiers de tests.Et, d'ailleurs, ça va finir.
00:50:37 :Donc, j'espère qu'il n'y a pas d'erreur. Normalement, j'aurais pu refaire...Hop, voilà.Donc, il y a 111 tests passés en 34 secondes.Donc, voilà, c'était juste avant pour montrerpourquoi c'est important, les tests, en fait.
00:50:49 :Surtout sur des gros projets comme ça.Excuse-moi.Hop là. Est-ce qu'il y a des questions ?Non, c'était super.Juste, je ne sais pas...Je ne sais pas si on a le temps ou pas,d'utiliser, qu'on pouvait peut-être voir comment s'intégreravec GitHub Actions.
00:51:11 :Ah.Je vous ferai voir un petit entourage dessus.Ce n'est pas très compliqué.En plus, moi, GitHub Actions,je vous partage rapidement mon écran.Je peux vous montrer ça.
00:51:23 :Mes secrets sont cachés, normalement.On voit mon écran, là ?Yes.En gros, on fera un entourage là-dessus, si vous voulez.Parce que, franchement, c'est bidon, vous allez voir.
00:51:33 :Hop, j'ai un fichier Yamal,ici.Mais ça,on va aller sur GitHub.C'est pompé.Sur GitHub, il est tout créé quasiment.Il faut juste penser à donnerles versions d'utiliser.
00:51:49 :Moi, je vais mettre entre guillemets, bien sûr.Eux, je crois qu'ils ne mettent pas de guillemets,mais ça plante quand vous mettez un 3.10,ils ne comprennent pas le 0, je crois.
00:51:57 :Moi, je mets entre guillemets.Je teste sur ces 3 versions de Python, les 3 dernières.Il y en a 13, maintenant.Et en fait, tout ça,c'est déjà créé.
00:52:07 :Il me semble, je ne sais plus.On va aller voir vite fait.Il faut juste penser àaller créer icides secrets.On va aller dans Zyron, parce quetout ce qui est, par exemple,je ne sais pas,dans les settings, il est où, mon dossier projet ?
00:52:25 :Donc là,ici, pour le récapituler,il n'y a pas besoin d'utiliser les clés d'API.Les clés d'API, je ne les mets pas dans le code direct, en dur.
00:52:35 :En fait, elles sont cachées. Je ne veux pas qu'elles soientsur GitHub, moi, les clés.Elles sont cachées dans un fichier, je vais les chercher.
00:52:41 :Donc lui,GitHub Action, il faut bien lui dire qu'il y a des secrets.Et les secrets, il faut les créersur GitHub.Alors, on fera un mentoratune prochaine fois là-dessus, mais juste pour montrerque franchement, c'est facile à mettre en place.
00:52:55 :Parce que quand vous faites,quand vous allez sur un...Sur mon projet Wagtail, je n'ai pas dû en faired'action.Non.Parce que c'est à moi, je me disque si ça plante, c'est tant pis.
00:53:09 :C'est de ma faute. Et voilà, en fait,ici, vous avez un...un...directement fichier.Alors, ce que je vais le faire,cliquez sur Configure, ça vous crée un templatede base, et après, vous n'avez plus qu'à rajouterce que vous voulez dessus. Voilà.
00:53:25 :Je le montrerai la prochaine fois.Mais, toujours pensez,quand vous avez des clés secrètes,il faut aller dans...dans...Non, c'est pas ça, je fais n'importe quoi.
00:53:37 :Secrets entre variables, ici. Action.Et en fait, vous allez ici,créer des nouvelles...En fait, créer un genre,un nom, vous appuyez, je ne sais pas, ça s'appelle comment ?
00:53:47 :RecapChatCléPrivate, vous l'appuyez ici.Et ici, vous mettez votre clé.Mais on parlera de ça...Je ne vais pas direen détail, parce que je ne suis vraiment pas un pro du toutdu GitHub Action,mais ça me suffit.
00:54:01 :Moi, je m'en sers juste pour déclencher mes tests.Et donc, on pourra en parler.Ouais, cool.Ben, voilà.Je suis désolé,j'ai largement dépassé.J'ai retenu un peu longtemps, mais...
00:54:15 :C'est vachement importantpour les tests, parce que je vois encore trop de gensqui me disent, les tests,c'est pas grave.Donc, voilà.Est-ce que ça a été, du coup ?
00:54:27 :Il y a des questions ?C'était trop vite ou ça allait pour chez vous ?Non, c'est bon.Ok, super.De toute façon, on aura le replay à dispo aussi.
Aucune occurrence trouvée pour « ».