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

  1. Accueil
  2. Blog
  3. Développement de logiciels

Développement de logiciels

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

Les promesses sont la façon dont JavaScript gère le travail qui se termine plus tard, et async/await est construit sur elles. Apprenez comment ils se comportent réellement, avec des résultats concrets à partir de chaque exemple, et évitez les erreurs qui engloutissent vos erreurs.

10 min de lecture
Les promesses JavaScript expliquées : then, catch, Promise.all et les erreurs courantes

À retenir

  • Une promesse est un objet représentant un résultat qui sera disponible ultérieurement.
  • Il est en attente jusqu’à ce qu’il soit satisfait ou rejeté, et une fois réglé, il ne change jamais.
  • Chaque then renvoie une nouvelle promesse, ce qui rend le chaînage possible.
  • Utilisez Promise.all lorsque chaque résultat est requis et Promise.allSettled lorsque vous souhaitez chaque résultat.

Les requêtes réseau, les lectures de fichiers et les minuteries se terminent toutes plus tard, mais JavaScript ne peut pas simplement s’arrêter et attendre, sinon la page se bloquerait. Les promesses JavaScript vous donnent un moyen simple de dire “quand cela se termine, faites cela, et si cela échoue, faites ceci à la place”.

Même si vous écrivez principalement async et await, vous utilisez des promesses en dessous, donc les comprendre rend le débogage beaucoup plus facile. Nous avons exécuté ces exemples sur Node.js 24, et le résultat affiché provient de cette exécution. Ils se comportent de la même manière dans les navigateurs modernes.

Qu’est-ce qu’une promesse ?

Une promesse est un espace réservé pour une valeur future. Pensez au buzzer qu’un restaurant vous remet lorsque vous commandez. Vous n’avez pas encore votre nourriture, mais vous tenez quelque chose qui vous dira quand elle sera prête ou qu’il y aura un problème, et en attendant vous êtes libre de faire autre chose.

Dans le code, une fonction asynchrone renvoie immédiatement une promesse et vous joignez ce qui devrait se passer ensuite :

fetch("/api/user")
  .then((response) => response.json())
  .then((user) => console.log(user.name))
  .catch((error) => console.log("Failed:", error.message));

Les trois états promis

État Signification Qu’est-ce qui court
En attente Le travail n’est pas terminé Rien pour l’instant
Réalisé Il s’est terminé par une valeur then gestionnaires
Rejeté Il a échoué pour une raison catch gestionnaires

Une promesse qui est tenue ou rejetée est appelée réglée. Une promesse ne peut être conclue qu’une seule fois. Après cela, son état et sa valeur sont corrigés, et les appels ultérieurs à resolve ou reject sont ignorés.

Créer une promesse

Vous consommez généralement les promesses d’API comme fetch, mais en créer une montre comment elles fonctionnent. Le constructeur reçoit deux fonctions, resolve et reject :

function fetchUser(id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (id > 0) {
        resolve({ id, name: "Asha" });
      } else {
        reject(new Error("Invalid id"));
      }
    }, 100);
  });
}

console.log(fetchUser(1));

// Promise { <pending> }

L’enregistrement immédiat de la promesse montre qu’elle est toujours en attente, car le minuteur ne s’est pas déclenché. La valeur ne peut être atteinte que via un gestionnaire ou await. Rejetez toujours avec un objet Error plutôt qu’une chaîne, car un Error comporte une trace de pile qui facilite le débogage.

puis, attrape et enfin

Ces trois méthodes attachent des gestionnaires à une promesse :

fetchUser(1).then((user) => console.log(user.name));
// Asha

fetchUser(-1)
  .then((user) => console.log("never runs", user))
  .catch((error) => console.log("caught:", error.message))
  .finally(() => console.log("finally"));

// caught: Invalid id
// finally

then s’exécute en cas de succès, catch s’exécute en cas d’échec et finally s’exécute dans les deux sens. Cela fait de finally le bon endroit pour le nettoyage, comme cacher une roulette de chargement. Il ne reçoit aucun argument, car il ne devrait pas se soucier du résultat.

Enchaîner les promesses

L’idée clé est que then renvoie toujours une nouvelle promesse. Tout ce que renvoie votre gestionnaire devient la valeur de cette nouvelle promesse :

Promise.resolve(2)
  .then((n) => n * 10)
  .then((n) => n + 1)
  .then((n) => console.log("chain:", n));

// chain: 21

Si un gestionnaire renvoie une autre promesse, la chaîne attend qu’elle se règle avant de continuer. C’est ce qui transforme les rappels imbriqués en une séquence plate d’étapes :

getUser(id)
  .then((user) => getOrders(user.id))
  .then((orders) => getInvoice(orders[0].id))
  .then((invoice) => console.log(invoice.total))
  .catch(handleError);

Comment les erreurs se propagent dans une chaîne

Une promesse rejetée saute tous les then jusqu’à ce qu’elle atteigne un catch. Lancer à l’intérieur d’un gestionnaire compte également comme un rejet. Et un catch qui revient remet normalement la chaîne sur les rails :

Promise.resolve("start")
  .then(() => {
    throw new Error("step 2 failed");
  })
  .then(() => console.log("skipped"))
  .catch((error) => {
    console.log("caught:", error.message);
    return "recovered";
  })
  .then((value) => console.log("continues:", value));

// caught: step 2 failed
// continues: recovered

Considérez cela comme la version asynchrone de try et catch. Un catch à la fin couvre généralement toute la chaîne. Si vous souhaitez uniquement enregistrer une erreur et que vous échouez toujours, relancez-la depuis l’intérieur du catch.

Astuce : fetch rejette uniquement en cas de panne de réseau. Une réponse 404 ou 500 est toujours satisfaisante, alors vérifiez response.ok vous-même. Notre aide-mémoire sur les codes d’état HTTP explique la signification de chaque code.

Promise.all, allSettled, race et tout

Ces méthodes statiques coordonnent plusieurs promesses à la fois. Tous prennent un tableau et renvoient une promesse.

Méthode S’accomplit quand Rejette quand Utilisez-le pour
Promise.all Tous remplissent N’importe qui rejette Tous les résultats sont obligatoires
Promise.allSettled Tout s’installe Jamais Vous voulez chaque résultat
Promise.race Le premier à s’installer remplit Le premier à régler les rejets Délais d’attente
Promise.any Le premier remplit Tous rejettent La première source à succès

Pour les tester, nous avons utilisé deux petits assistants, un qui réussit après un certain temps et un qui échoue après un certain temps :

const wait = (ms, value) =>
  new Promise((resolve) => setTimeout(() => resolve(value), ms));
const fail = (ms, message) =>
  new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms));

Promise.all

await Promise.all([wait(300, "a"), wait(100, "b"), wait(200, "c")]);

// [ 'a', 'b', 'c' ]   took about 300 ms

Deux détails à noter. Les résultats conservent l’ordre de saisie, même si b a terminé en premier. Et le temps total était d’environ 300 ms, le temps de la tâche la plus lente et non la somme de 600 ms, car les trois s’exécutaient déjà en même temps. Si l’un d’eux refuse, l’ensemble rejette aussitôt :

await Promise.all([wait(100, "a"), fail(50, "b failed")]);

// rejected: b failed

Promise.allSettled

Celui-ci attend tout et rapporte chaque résultat, afin qu’un échec ne perde pas le reste. Cela convient à un tableau de bord où chaque widget se charge indépendamment :

const results = await Promise.allSettled([wait(50, "a"), fail(50, "b failed")]);
results.map((r) => r.status);

// [ 'fulfilled', 'rejected' ]

Promise.race et Promise.any

await Promise.race([wait(300, "slow"), wait(100, "fast")]);   // fast
await Promise.any([fail(50, "x"), wait(100, "ok")]);          // ok

La différence est que race prend le premier à s’installer, même s’il échoue, tandis que any ignore les échecs tant que quelque chose réussit. Une utilisation classique de race consiste à ajouter un délai d’attente à une requête lente, bien que la tâche la plus lente continue de s’exécuter en arrière-plan à moins que vous ne l’annuliez.

Promesses et asynchrone/attente

async et await sont une manière plus lisible de travailler avec les mêmes promesses. Une fonction async renvoie toujours une promesse, et await met cette fonction en pause jusqu’à ce qu’une promesse soit satisfaite :

async function showInvoice(id) {
  try {
    const user = await getUser(id);
    const orders = await getOrders(user.id);
    console.log(orders.length);
  } catch (error) {
    console.log("Failed:", error.message);
  }
}

Les rejets deviennent des erreurs renvoyées, donc les travaux ordinaires try et catch. Vous avez toujours besoin de Promise.all pour le travail parallèle, car attendre un appel après l’autre les exécute dans l’ordre. Notre Guide JavaScript async/await approfondit ce sujet.

Promesses et boucle d’événements

Les gestionnaires de promesses ne sont jamais appelés immédiatement, même lorsque la promesse est déjà conclue. Ils s’exécutent après la fin du code actuel et avant tout minuteur. Voici la preuve :

setTimeout(() => console.log("timeout"), 0);
Promise.resolve().then(() => console.log("microtask"));
console.log("sync");

// sync
// microtask
// timeout

Le code synchrone s’exécute en premier. Vient ensuite la file d’attente de microtâches, qui contient les gestionnaires de promesses. Ce n’est qu’alors que la boucle d’événements reprend la tâche suivante, telle qu’un minuteur. Il s’agit d’une question d’entretien populaire qui explique pourquoi un setTimeout de zéro n’est pas vraiment immédiat.

Promesses vs rappels

Préoccupation Rappels Promesses
Séquençage Imbriqué, plus profond à chaque étape Une chaîne plate
Erreurs Vérifié à tous les niveaux Un catch peut couvrir la chaîne
Travail parallèle Compteurs manuels Promise.all
Appelé deux fois par erreur ? Possible Je ne peux pas régler deux fois

Erreurs courantes

  • Oublier de rentrer à l’intérieur de then. Sans un return, l’étape suivante reçoit undefined et n’attend pas votre promesse intérieure.
  • Non catch du tout. Cela provoque un rejet non géré, et dans Node.js, cela arrête le processus par défaut.
  • Imbrication au lieu de chaînage. Mettre then à l’intérieur de then recrée l’enfer des rappels. Renvoyez la promesse et continuez la chaîne.
  • Envelopper une promesse dans new Promise. Si une fonction renvoie déjà une promesse, utilisez-la simplement.
  • Utilisation de forEach avec des rappels asynchrones. Il n’attend pas. Utilisez for...of ou Promise.all avec map, comme indiqué dans notre guide des méthodes de tableau JavaScript.
  • Penser qu’une promesse peut être annulée. Elle ne peut pas être annulée d’elle-même. Pour les requêtes, utilisez AbortController.

Pour conclure

Les promesses se résument à quelques règles : une promesse est réglée une fois, then renvoie une nouvelle promesse et les erreurs parcourent la chaîne jusqu’à ce que quelque chose les rattrape. Une fois que ces règles semblent naturelles, async et await cessent d’être magiques. Pour vous entraîner, réécrivez une fonction basée sur le rappel à l’aide de promesses, puis récupérez deux points de terminaison avec Promise.all et gérez correctement un échec.

Questions fréquentes

Qu’est-ce qu’une promesse en JavaScript ?

Une promesse est un objet représentant le résultat éventuel d’un travail asynchrone. Il commence comme en attente, puis se remplit avec une valeur ou est rejeté avec une raison.

Quelle est la différence entre then et catch ?

puis s’exécute lorsqu’une promesse est remplie, et catch s’exécute lorsqu’elle est rejetée. catch est alors effectivement avec seulement un gestionnaire de rejet, et il peut également détecter les erreurs générées lors des étapes précédentes.

Quelle est la différence entre Promise.all et Promise.allSettled ?

Promise.all rejette dès qu’une promesse est rejetée. Promise.allSettled les attend toujours tous et rapporte le statut, la valeur ou la raison de chacun.

Dois-je utiliser des promesses ou asynchrone/attendre ?

Ils travaillent ensemble, car wait est construit sur des promesses. La plupart du code se lit mieux avec async/await, tandis que Promise.all et les méthodes similaires restent utiles pour le travail parallèle.

Les promesses se déroulent-elles en parallèle ?

JavaScript exécute un morceau de code à la fois sur un thread, mais fonctionne comme si les requêtes réseau se produisaient en arrière-plan. Plusieurs d’entre elles peuvent être en cours en même temps.

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 →