Tutoriel Pytest pour les débutants : luminaires, paramétrage et exemples réels

  1. Accueil
  2. Blog
  3. Automatisation des tests

Automatisation des tests

Tutoriel Pytest pour les débutants : Appareils, paramétrage et exemples réels

Pytest vous permet d’écrire des tests Python avec des fonctions simples et des instructions d’assertion simples. Créez une petite suite de tests étape par étape, lisez les résultats d’échec réels et découvrez les fonctionnalités que vous utiliserez quotidiennement.

10 min de lecture
Tutoriel Pytest pour débutants : luminaires, paramétrage et exemples réels

À retenir

  • Pytest trouve les fonctions nommées test_* et les vérifie avec des instructions simples assert.
  • Les luminaires fournissent une configuration et un nettoyage réutilisables, demandés simplement en les nommant comme arguments.
  • @pytest.mark.parametrize exécute un test avec de nombreuses entrées.
  • Mettez les appareils partagés dans conftest.py et vous n’avez pas besoin de les importer.

Si vous avez évité d’écrire des tests parce qu’ils vous semblent une corvée, ce tutoriel pytest devrait vous faire changer d’avis. Pytest supprime la majeure partie de la cérémonie : il n’y a aucune classe dont on peut hériter et aucune méthode d’assertion spéciale à retenir. Un test peut comporter seulement deux lignes.

Nous allons construire un petit panier et le tester étape par étape. Nous avons tout exécuté sur Python 3.13 avec pytest 9.2, et le résultat affiché est réel, bien que nous ayons supprimé les chemins de fichiers et les détails de synchronisation qui différeront sur votre machine.

Pourquoi pytester ?

Python est livré avec unittest, qui fonctionne bien, mais pytest est généralement le choix le plus pratique. Voici le même chèque dans chacun :

Tâche test unitaire test py
Vérifier l’égalité self.assertEqual(a, b) affirmer a == b
Vérifier une exception self.assertRaises(...) pytest.raises(...)
Structure des tests Une classe qui hérite de TestCase Une fonction simple
Configuration et nettoyage Méthodes setUp et tearDown Luminaires réutilisables
De nombreuses entrées subTest boucles paramétrer

Pytest peut également exécuter vos tests unittest existants, afin que vous puissiez basculer progressivement. Il dispose également d’un vaste écosystème de plugins, comprenant pytest-cov pour la couverture et pytest-xdist pour les exécutions parallèles.

Installer pytest

Créez d’abord un environnement virtuel, comme expliqué dans notre Tutoriel sur l’environnement virtuel Python, puis installez-le :

pip install pytest
pytest --version

# pytest 9.2.0

Créez un dossier de projet contenant deux fichiers, cart.py et test_cart.py. Pytest trouve automatiquement les tests en suivant les règles de dénomination : fichiers nommés test_*.py ou *_test.py, fonctions commençant par test et classes commençant par Test. Si un test n’est pas récupéré, une incompatibilité de nom est la première chose à vérifier.

Le code à tester

# cart.py
class Cart:
    def __init__(self):
        self.items = []

    def add(self, name, price, qty=1):
        if qty < 1:
            raise ValueError("qty must be at least 1")
        self.items.append((name, price, qty))

    def total(self, discount=0):
        subtotal = sum(price * qty for _, price, qty in self.items)
        return round(subtotal * (1 - discount / 100), 2)

Vos premiers tests

# test_cart.py
from cart import Cart

def test_empty_cart_is_free():
    assert Cart().total() == 0

C’est un test complet. Exécutez pytest à partir du dossier du projet et il signale un test réussi. Si vous obtenez une erreur d’importation, exécutez-la en tant que python -m pytest, ce qui ajoute le dossier actuel au chemin d’importation.

Échecs de lecture

C’est là que pytest brille vraiment. Voici un test avec une valeur attendue volontairement erronée :

def test_wrong_total():
    c = Cart()
    c.add("Keyboard", 1500)
    assert c.total() == 1400

Et voici ce qu’il a imprimé lorsque nous l’avons exécuté :

    def test_wrong_total():
        c = Cart()
        c.add("Keyboard", 1500)
>       assert c.total() == 1400
E       assert 1500.0 == 1400
E        +  where 1500.0 = total()

FAILED fail_example.py::test_wrong_total - assert 1500.0 == 1400
============================== 1 failed in 0.12s ==============================

Le > marque la ligne défaillante et les lignes E affichent les valeurs réelles. Vous n’avez pas besoin d’ajouter un message personnalisé, car pytest réécrit les instructions assert afin qu’elles puissent rapporter ce qu’elles ont comparé. Il fait la même chose pour les listes et les dictionnaires, en indiquant exactement quels éléments diffèrent.

Test des exceptions

La gestion des erreurs est aussi un comportement et mérite des tests. pytest.raises ne passe que si le bloc lève l’exception attendue :

import pytest

def test_rejects_zero_qty():
    with pytest.raises(ValueError, match="at least 1"):
        Cart().add("Pen", 10, qty=0)

L’argument facultatif match vérifie le message à l’aide d’une expression régulière, donc un autre ValueError ne passera pas par accident. Pour savoir comment générer et gérer des erreurs comme celle-ci, lisez notre guide sur la Gestion des exceptions Python.

Luminaires : configuration réutilisable

La plupart des tests nécessitent d’abord quelque chose de préparé. Un luminaire est une fonction qui le fournit. Décorez-le avec @pytest.fixture, et tout test qui le nomme comme argument reçoit le résultat :

@pytest.fixture
def cart():
    c = Cart()
    c.add("Keyboard", 1500)
    c.add("Mouse", 500, qty=2)
    return c

def test_total(cart):
    assert cart.total() == 2500

Chaque test reçoit un nouveau panier par défaut, les tests ne peuvent donc pas s’influencer mutuellement. Pytest fait correspondre le nom de l’argument au nom de l’appareil, et vous n’appelez jamais l’appareil vous-même. @pytest.fixture est un décorateur, que nous expliquons dans Les décorateurs Python expliqués.

Nettoyage avec rendement

Utilisez yield au lieu de return lorsque vous devez nettoyer par la suite. Le code après yield s’exécute à la fin du test, même s’il échoue :

@pytest.fixture
def temp_db():
    print("\nopen db")
    yield {"users": []}
    print("close db")

def test_db(temp_db):
    assert temp_db["users"] == []

L’exécution avec -s pour afficher la sortie imprimée a confirmé que la commande était ouverte, testée, puis fermée.

Portée du luminaire et conftest.py

Par défaut, un appareil s’exécute une fois par test. Pour une configuration coûteuse, comme une base de données ou un navigateur, modifiez sa durée de vie avec scope :

Portée Créé une fois par
function (par défaut) Tester
classe Classe d’essai
modules Fichier
paquet Forfait
séance Test complet

Mettez les appareils utilisés par plusieurs fichiers dans un fichier appelé conftest.py. Pytest le charge automatiquement, afin que les tests puissent utiliser ses appareils sans importation. Soyez prudent avec les étendues partagées, car une modification apportée par un test peut s’infiltrer dans le suivant.

Paramétrer : un test, plusieurs entrées

Plutôt que de copier un test pour chaque valeur, listez les cas :

@pytest.mark.parametrize("discount, expected", [
    (0, 2500),
    (10, 2250),
    (100, 0),
])
def test_discount(cart, discount, expected):
    assert cart.total(discount) == expected

Chaque ligne devient son propre test, et vous pouvez le voir dans le résultat détaillé de notre exécution du fichier complet :

test_cart.py::test_total PASSED                        [ 16%]
test_cart.py::test_discount[0-2500] PASSED             [ 33%]
test_cart.py::test_discount[10-2250] PASSED            [ 50%]
test_cart.py::test_discount[100-0] PASSED              [ 66%]
test_cart.py::test_rejects_zero_qty PASSED             [ 83%]
test_cart.py::test_empty_cart_is_free PASSED           [100%]

============================== 6 passed in 0.05s ==============================

Si une ligne échoue, les autres s’exécutent toujours et le nom vous indique exactement quelles valeurs sont à l’origine du problème. Notez que nous avons combiné le paramétrage avec le luminaire cart. Pour choisir les valeurs susceptibles de détecter des bogues, utilisez l’analyse des valeurs limites.

Astuce : Lorsque vos paramètres sont longs ou peu clairs, transmettez ids=["none", "ten", "full"] pour donner à chaque cas un nom lisible dans le rapport.

Luminaires intégrés utiles

Pytest comprend plusieurs appareils prêts à l’emploi. Ces deux-là sont particulièrement utiles, et tous deux ont réussi notre test :

def test_write_report(tmp_path):
    report = tmp_path / "report.txt"
    report.write_text("passed")
    assert report.read_text() == "passed"

def read_mode():
    return os.environ.get("APP_MODE", "dev")

def test_mode(monkeypatch):
    monkeypatch.setenv("APP_MODE", "staging")
    assert read_mode() == "staging"

tmp_path donne à chaque test un dossier temporaire unique, afin que les tests ne touchent jamais de vrais fichiers. monkeypatch modifie les variables ou les attributs d’environnement et annule la modification à la fin du test. Un autre outil utile est capsys, qui capture la sortie imprimée afin que vous puissiez la vérifier.

Marqueurs : sauter et xfail

Les marqueurs ajoutent des étiquettes et des comportements aux tests :

@pytest.mark.skip(reason="payment sandbox is down")
def test_payment():
    assert False

@pytest.mark.xfail(reason="floating point")
def test_rounding():
    assert 0.1 + 0.2 == 0.3

skip n’exécute pas du tout le test. xfail l’exécute mais s’attend à un échec, donc un problème connu n’interrompt pas votre build. Avec les autres tests supplémentaires dans le même fichier, notre exécution se résume à 3 passed, 1 skipped, 1 xfailed. D’ailleurs, ce test d’arrondi échoue vraiment : en arithmétique à virgule flottante, 0,1 + 0,2 n’est pas exactement 0,3. Utilisez pytest.approx(0.3) pour comparer des décimales.

Vous pouvez également créer vos propres marqueurs, tels que @pytest.mark.slow, et exécuter uniquement ceux avec pytest -m slow, ou les laisser de côté avec -m "not slow". Enregistrez des marqueurs personnalisés dans votre fichier de configuration pour éviter les avertissements.

Indicateurs de ligne de commande utiles

Commande Ce que ça fait
pytest -v Afficher le nom de chaque test
pytest -q Afficher un résumé plus court
pytest -x Arrêtez-vous au premier échec
pytest -k remise Exécutez des tests dont les noms correspondent à un mot
pytest -s Afficher la sortie print
pytest --lf Relancez uniquement les derniers échecs
pytest--pdb Ouvrir le débogueur en cas d’échec
pytest test_cart.py :: test_total Exécutez un test spécifique

Exécuter pytest dans CI

Les tests sont plus utiles lorsqu’ils s’exécutent automatiquement à chaque modification. Un travail GitHub Actions minimal ressemble à ceci :

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-python@v5
    with:
      python-version: "3.13"
  - run: pip install -r requirements.txt
  - run: python -m pytest

Pytest se termine avec un code différent de zéro lorsque les tests échouent, ce qui entraîne l’arrêt du pipeline. Nous n’avons pas exécuté ce fichier de workflow, alors adaptez-le à votre projet. Notre Guide CI/CD GitHub Actions explique les détails. Pytest fonctionne également bien pour les tests de navigateur, comme le montrent nos Tutoriel Selenium Python et Tutoriel Modèle d’objet de page.

Pour conclure

Vous disposez désormais de ce dont vous avez besoin pour la plupart des suites de tests Python : des assertions simples, des paramètres pour la configuration, des paramètres pour les variations et quelques indicateurs pour la vitesse. Commencez petit. Choisissez une fonction dans laquelle vous avez récemment corrigé un bug et écrivez d’abord un test pour ce bug. Si vous ne savez pas quoi tester à chaque niveau, lisez les informations sur les tests unitaires et d’intégration.

Questions fréquentes

A quoi sert pytest ?

Pytest est un framework de test Python. Il est utilisé pour les tests unitaires, d’intégration et d’API, et fonctionne également bien avec les outils de navigateur tels que Selenium et Playwright.

Est-ce que pytest est meilleur que unittest ?

De nombreuses équipes le préfèrent pour sa syntaxe plus simple, ses montages et ses échecs plus clairs. unittest ne nécessite aucune installation et pytest peut également exécuter des tests unittest existants.

Qu’est-ce qu’un luminaire dans pytest ?

Un appareil est une fonction qui prépare quelque chose dont un test a besoin, comme des données ou une connexion. Les tests le reçoivent en le nommant comme argument.

Qu’est-ce que conftest.py ?

Il s’agit d’un fichier spécial permettant de partager des appareils et des hooks entre des fichiers de test. Pytest le charge automatiquement, ses appareils ne nécessitent donc aucune instruction d’importation.

Pourquoi pytest ne trouve-t-il pas mes tests ?

Il s’agit généralement d’un problème de nom. Les fichiers doivent être nommés test_*.py ou *_test.py et les fonctions doivent commencer par test. Vérifiez également que vous l’avez exécuté à partir du bon dossier.

Continuez à apprendre

Travailler avec Stack Quora

Besoin d’aide pour les tests, WordPress ou le référencement ?

Nous aidons les équipes à proposer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous vous proposerons une prochaine étape claire.

Continuez à lire

Plus de guides sur tests, IA et développement moderne

Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.

Intelligence artificielle

Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire

Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …

Lire l'article →
DevOps

Variables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués

Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…

Lire l'article →
Développement logiciel

Limitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429

Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…

Lire l'article →
Automatisation des tests

Se moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests

Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…

Lire l'article →
Tests logiciels

Couverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %

Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…

Lire l'article →
Bases de données et SQL

DELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser

DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …

Lire l'article →
Bases de données et SQL

Vues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples

Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …

Lire l'article →
Développement logiciel

Interface TypeScript vs Type : différences réelles, testées avec le compilateur

Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…

Lire l'article →
Développement logiciel

Python *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs

Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…

Lire l'article →
Développement logiciel

Fonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser

Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…

Lire l'article →
Intelligence artificielle

Que sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter

Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…

Lire l'article →
DevOps

Surveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces

Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…

Lire l'article →
DevOps

Volumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière

Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…

Lire l'article →
Automatisation des tests

TDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser

TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…

Lire l'article →
Tests logiciels

Tests d'acceptation utilisateur (UAT) : processus, liste de contrôle et exemples réels

Les tests d'acceptation des utilisateurs sont expliqués : qui les exécute, en quoi ils diffèrent du contrôle qualité, un processus en sept étapes, u…

Lire l'article →
Bases de données et SQL

Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

Les valeurs SQL NULL expliquées avec les requêtes que nous avons exécutées : logique à trois valeurs, IS NULL, COALESCE, NULLIF, comment les agrégat…

Lire l'article →
Bases de données et SQL

Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

SQL CASE WHEN expliqué avec les requêtes que nous avons exécutées : formulaires simples et recherchés, ordre des conditions, pivots avec SUM, astuce…

Lire l'article →
Développement logiciel

Qu'est-ce que JWT ? Les jetons Web JSON expliqués avec un exemple fonctionnel

Qu’est-ce que JWT ? JSON Web Tokens expliqué : les trois parties, un jeton construit et falsifié dans le code que nous avons exécuté, JWT vs session…

Lire l'article →
Développement logiciel

Boucle d'événements JavaScript expliquée : pile d'appels, microtâches et minuteries avec des exemples

La boucle d'événements JavaScript expliquée avec le code que nous avons exécuté : pile d'appels, files d'attente de tâches et de microtâches, pourqu…

Lire l'article →
Développement logiciel

Générateurs Python et rendement expliqués : économisez de la mémoire avec des exemples réels

Les générateurs Python et le rendement expliqués avec le code que nous avons exécuté : comment ils s'arrêtent et reprennent, les économies de mémoir…

Lire l'article →
Intelligence artificielle

Que sont les intégrations ? Vecteurs et similarité cosinus expliqués simplement

Que sont les intégrations ? Un guide en langage simple sur les vecteurs, la similarité cosinus et la recherche sémantique, avec un petit exemple que…

Lire l'article →
DevOps

Déploiement Bleu-Vert vs Canary : différences, compromis et comment choisir

Explication du déploiement bleu-vert ou canari : comment chacun fonctionne, coût, risque et restauration, regroupement d'utilisateurs stable que nou…

Lire l'article →
Automatisation des tests

Tests instables : quelles sont leurs causes et comment les corriger définitivement

Des tests irréguliers expliqués avec des démos que nous avons exécutées : les principales causes, comment en confirmer et en diagnostiquer une, les …

Lire l'article →
Tests logiciels

Tests de charge vs tests de contrainte : différences, métriques et exemples k6

Explication des tests de charge et des tests de stress : ce que chacun prouve, les tests de pointe et de trempage, les métriques qui comptent, pourq…

Lire l'article →
Tests logiciels

Scénario de test et scénario de test : principales différences, exemples et quand les utiliser

Scénario de test et scénario de test expliqués : des définitions claires, un tableau côte à côte, une fonctionnalité de réinitialisation de mot de p…

Lire l'article →
Bases de données et SQL

Optimisation des requêtes SQL : lire les plans d'exécution et corriger les requêtes lentes, avec des délais

Optimisation des requêtes SQL testée sur un million de lignes : lire les plans d'exécution, ajouter les bons index, corriger les filtres non Sargabl…

Lire l'article →
Bases de données et SQL

SQL UNION vs UNION ALL : différences, exemples et performances testées

SQL UNION vs UNION ALL expliqué avec les requêtes que nous avons exécutées : des doublons, les règles suivent toutes les deux, un véritable bug de d…

Lire l'article →
Développement logiciel

Tutoriel API JavaScript Fetch : GET, POST, gestion des erreurs et délais d'attente

Un didacticiel de l'API JavaScript Fetch testé sur un serveur local : GET et POST, pourquoi 404 ne lance pas, un assistant réutilisable, des chaînes…

Lire l'article →
Développement logiciel

Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

Gestion des fichiers Python expliquée avec le code que nous avons exécuté : modes ouverts, avec lecture de fichiers volumineux, CSV, JSON, pathlib, …

Lire l'article →
Développement logiciel

Classes et objets Python : didacticiel POO avec des exemples réels

Classes et objets Python expliqués avec le code que nous avons exécuté : __init__, méthodes, attributs de classe par rapport à l'instance, héritage,…

Lire l'article →
Intelligence artificielle

Qu'est-ce qu'un grand modèle de langage ? Comment fonctionnent les LLM, expliqués sans battage médiatique

Qu’est-ce qu’un grand modèle de langage ? Les LLM expliqués en langage simple : jetons, intégrations, attention, formation, fenêtres de température …

Lire l'article →
DevOps

Commandes Linux pour les débutants : le guide du terminal essentiel avec des exemples

Commandes Linux pour débutants, regroupées par tâche : navigation, fichiers, affichage des journaux, grep, tuyaux, autorisations, processus et archi…

Lire l'article →
Automatisation des tests

Selenium vs Playwright : principales différences, code comparé et lequel choisir

Comparatif Selenium vs Playwright : architecture, attente, support du navigateur et du langage, débogage, même test dans les deux outils, conseils d…

Lire l'article →
Tests logiciels

Partitionnement d'équivalence : technique de conception de tests expliquée avec des exemples concrets

Le partitionnement d'équivalence expliqué : comment trouver des partitions valides et invalides, des exemples concrets d'âges, de mots de passe et d…

Lire l'article →
Tests logiciels

Gravité vs priorité dans les tests logiciels : différences, matrice et exemples réels

Explication de la gravité et de la priorité dans les tests logiciels : des définitions claires, une matrice à quatre voies avec des exemples, des éc…

Lire l'article →
Bases de données et SQL

Tutoriel sur les sous-requêtes SQL : types, sous-requêtes corrélées et EXISTE avec des exemples

Un didacticiel sur les sous-requêtes SQL avec les requêtes que nous avons exécutées : les sous-requêtes scalaires, IN, FROM et SELECT, les sous-requ…

Lire l'article →
Bases de données et SQL

Transactions SQL et ACID expliquées : COMMIT, ROLLBACK et niveaux d'isolement

Transactions SQL et ACID expliquées avec un virement bancaire que nous avons effectué : COMMIT, ROLLBACK, points de sauvegarde, verrous, niveaux d'i…

Lire l'article →
Développement logiciel

Aide-mémoire sur les commandes Git : les commandes que vous utilisez réellement, avec des exemples

Une aide-mémoire sur les commandes Git regroupées par tâche : configuration, transfert, branches, télécommandes, cache, historique et annulation des…

Lire l'article →
Développement logiciel

Les promesses JavaScript expliquées : alors, catch, Promise.all et les erreurs courantes

Les promesses JavaScript expliquées avec le code que nous avons exécuté : les états, les chaînes then et catch, la gestion des erreurs, Promise.all,…

Lire l'article →
Développement logiciel

Tutoriel du dictionnaire Python : méthodes, exemples et modèles courants

Un didacticiel de dictionnaire Python avec du code que nous avons exécuté : créer, lire et mettre à jour des dictés, des méthodes clés, des fusions,…

Lire l'article →
Intelligence artificielle

Qu’est-ce que RAG ? La génération augmentée par récupération expliquée avec un exemple fonctionnel

Qu’est-ce que le RAG ? La génération augmentée par récupération expliquée étape par étape : indexation, segmentation, intégrations, récupération, un…

Lire l'article →
DevOps

Tutoriel Terraform pour les débutants : Infrastructure en tant que code du premier fichier aux modules

Un didacticiel Terraform pour les débutants : commencez sans compte cloud, apprenez l'initialisation, la planification et l'application, puis les va…

Lire l'article →
DevOps

Docker vs Kubernetes : principales différences, comment ils fonctionnent ensemble et ce dont vous avez besoin

Docker vs Kubernetes expliqué : ce que chacun fait, la même application s'exécute avec les deux, Docker Compose et Swarm comparés, les dockershim ch…

Lire l'article →
Automatisation des tests

Tutoriel Pytest pour les débutants : luminaires, paramétrage et exemples réels

Un tutoriel pytest pour les débutants avec des tests que nous avons exécutés sur pytest 9.2 : assertions, appareils, paramétrage, conftest, marqueur…

Lire l'article →
Tests logiciels

Cycle de vie des tests logiciels (STLC) : 6 phases, critères d'entrée et de sortie, exemple

Le cycle de vie des tests logiciels expliqué : six phases STLC avec des critères d'entrée et de sortie, des livrables, un exemple de fonctionnalité …

Lire l'article →
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.

Lire l'article →
Développement logiciel

List comprehension Python : syntaxe, exemples et cas à éviter

La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…

Lire l'article →
Bases de données et SQL

Jointures SQL expliquées avec exemples (Inner, Left, Right, Full)

Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…

Lire l'article →