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

  1. Accueil
  2. Blog
  3. Tests de logiciels

Tests de logiciels

Partitionnement d’équivalence : Technique de conception de tests expliquée avec des exemples concrets

Vous ne pouvez pas tester toutes les entrées possibles, alors quelles valeurs devez-vous choisir ? Le partitionnement d’équivalence vous donne une réponse claire. Apprenez la méthode étape par étape, travaillez sur des exemples réels et voyez où elle a besoin d’aide.

8 min de lecture
Technique de conception de tests de partitionnement d'équivalence expliquée avec des exemples concrets

À retenir

  • Le Partitionnement d’équivalence divise les entrées en groupes qui doivent se comporter de la même manière.
  • Vous testez une valeur représentative de chaque groupe plutôt que chaque valeur.
  • Incluez toujours les partitions invalides, car la gestion des erreurs est l’endroit où se cachent de nombreux bogues.
  • Cela fonctionne mieux en complément de l’analyse des valeurs limites, car les bogues se trouvent souvent en marge d’un groupe.

Un champ d’âge qui accepte les 18 à 60 ans comporte un nombre énorme d’entrées possibles, une fois que vous comptez les négatifs, les nombres énormes, le texte et les espaces. Personne ne peut tous les essayer. Le partitionnement d’équivalence résout ce problème en regroupant les entrées que le logiciel doit traiter de la même manière, puis en testant une valeur de chaque groupe.

C’est l’une des premières techniques de conception de tests que tout testeur devrait apprendre. Dans ce guide, nous le parcourons étape par étape et testons un exemple en Python. Nous avons exécuté ce code sur Python 3.13 et sa sortie est incluse. Les règles de mot de passe et de coupon ci-dessous sont des exemples illustratifs, non tirés d’un système réel.

Qu’est-ce que le partitionnement d’équivalence ?

Le partitionnement d’équivalence, également appelé partitionnement de classe d’équivalence (ECP), est une technique de conception de tests en boîte noire. Il divise les entrées possibles d’une fonctionnalité en partitions ou classes. Chaque valeur à l’intérieur d’une partition est censée produire le même type de comportement.

Comme vous n’avez pas besoin de voir le code, vous pouvez l’appliquer directement à partir d’une exigence. Pour en savoir plus sur ce style de test, lisez Tests en boîte noire ou en boîte blanche.

Pourquoi ça marche

La technique repose sur une hypothèse : si une valeur dans une partition trouve un bogue, les autres valeurs dans cette partition le trouveront probablement aussi. Et si une valeur passe, les autres passeront probablement aussi. Tester 25, 26 et 27 ans dans un domaine d’âge adulte ne vous apprendra probablement rien que le test de 25 ans seul ne vous apprendra rien.

Approche Tests pour un champ d’âge Résultat
exhaustif Toutes les valeurs possibles Impossible en pratique
Devinettes aléatoires Tout ce qui me vient à l’esprit Doublons et lacunes
Partitionnement d’équivalence Un par partition Petit, avec une couverture délibérée

Il s’agit cependant d’une hypothèse et non d’une garantie. Les logiciels peuvent avoir des cas particuliers cachés dans une partition, une limitation sur laquelle nous reviendrons plus tard.

Comment le faire en cinq étapes

  1. Lisez l’exigence et identifiez l’entrée et ses règles.
  2. Trouvez les partitions valides, qui sont les groupes de valeurs qui doivent être acceptées, et notez si différentes plages se comportent différemment.
  3. Trouvez les partitions invalides, y compris les valeurs trop faibles, trop élevées, de mauvais type et vides.
  4. Choisissez une valeur représentative dans chaque partition, généralement quelque part au milieu.
  5. Notez le résultat attendu pour chacun, comme dans tout bon cas de test.

Exemple concret : un champ d’âge

Exigence : Les utilisateurs âgés de 18 à 60 ans peuvent s’inscrire.

Partition Tapez Valeur de test Résultat attendu
En dessous de 18 ans Invalide 10 Rejeté
18 à 60 Valide 35 Accepté
Au-dessus de 60 Invalide 75 Rejeté
Pas un numéro Invalide “abc” Erreur
Vide Invalide (empty) Message “Obligatoire”

Cinq tests vous permettent de couvrir chaque comportement de l’exigence. De nombreux didacticiels s’arrêtent aux trois premières lignes, mais les deux dernières sont celles que les vrais utilisateurs déclenchent par accident. Vous pouvez également ajouter des lignes pour les nombres négatifs ou décimaux, si ceux-ci peuvent raisonnablement être traités différemment.

Le tester dans le code

Voici cette règle sous forme de fonction, avec un test unitaire par partition, en utilisant le module intégré de Python unittest :

import unittest

def can_register(age):
    if not isinstance(age, int) or isinstance(age, bool):
        raise TypeError("age must be a whole number")
    return 18 <= age <= 60

class EquivalenceTests(unittest.TestCase):
    def test_valid_partition(self):
        self.assertTrue(can_register(35))

    def test_too_young_partition(self):
        self.assertFalse(can_register(10))

    def test_too_old_partition(self):
        self.assertFalse(can_register(75))

    def test_wrong_type_partition(self):
        with self.assertRaises(TypeError):
            can_register("abc")

Notre course a réussi :

test_too_old_partition ... ok
test_too_young_partition ... ok
test_valid_partition ... ok
test_wrong_type_partition ... ok

Dans un projet réel, la fonctionnalité de paramétrage de pytest est un moyen intéressant d’exécuter une table de valeurs de partition via un seul test.

Exemple concret : un mot de passe

Exigence : Un mot de passe doit comporter de 8 à 20 caractères et contenir au moins un chiffre.

Celui-ci a deux règles, longueur et contenu, nous considérons donc des partitions pour les deux :

Partition Tapez Valeur de test Résultat attendu
Longueur valide, comporte un chiffre Valide lever du soleil42 Accepté
Trop court Invalide abc1 Erreur : trop court
Trop longtemps Invalide Une valeur de 30 caractères avec un chiffre Erreur : trop long
Longueur valide, aucun chiffre Invalide lever du soleil Erreur : chiffre requis
Vide Invalide (empty) Erreur : obligatoire

Notez que chaque test invalide enfreint une seule règle. Si une valeur était à la fois trop courte et qu’il manquait un chiffre, un test de réussite ne pourrait pas vous dire quel contrôle a fonctionné. Un chèque peut être brisé, tandis que l’autre le cache.

Exemple concret : entrées non numériques

La technique ne se limite pas aux plages de numéros. Les options, catégories et états discrets forment également des partitions. Supposons qu’un magasin ait cette règle :

Exigence : La livraison est gratuite pour les membres Gold, 50 pour les Silver et 100 pour tous les autres. Les valeurs de niveau inconnues sont des erreurs.

Partition Valeur de test Frais attendus
Or or 0
Argent argent 50
Pas d’adhésion (none) 100
Niveau inconnu platine Erreur

Ici, chaque option est sa propre partition, car chacune doit se comporter différemment. D’autres partitions courantes incluent les types de fichiers, tels que les téléchargements valides et non valides, et les groupes basés sur les résultats, tels qu’un prêt approuvé ou refusé.

Conseil : Pensez aux résultats ainsi qu’aux entrées. Si un calcul peut produire une remise, aucune remise ou un avertissement, assurez-vous qu’au moins un test atteint chacun de ces résultats.

Plusieurs entrées à la fois

Avec plusieurs champs, le nombre de combinaisons augmente rapidement. Trois champs avec quatre partitions chacun donnent 64 combinaisons. Deux stratégies aident :

  • Faible couverture : assurez-vous que chaque partition apparaît dans au moins un test, en combinant plusieurs valeurs valides par test. Pour les valeurs non valides, testez-les une par une afin que les erreurs ne se masquent pas.
  • Couverture basée sur des règles : lorsque les combinaisons modifient réellement le résultat, comme le statut du membre avec la valeur de la commande, utilisez tests de table de décision pour les répertorier correctement.

Couplage avec l’analyse des valeurs limites

Le partitionnement vous indique les groupes à tester. Cela en dit peu sur où dans un groupe les bogues aiment se cacher, et beaucoup se cachent juste sur les bords. Pour le montrer, nous avons écrit une version boguée avec l’erreur classique :

def buggy(age):
    return 18 < age <= 60     # should be 18 <= age

[buggy(a) for a in (35, 10, 75)]   # [True, False, False]
buggy(18)                          # False

Nos valeurs de partition, 35, 10 et 75, ont toutes donné les bonnes réponses, donc ces tests seraient réussis. Pourtant, un jeune de 18 ans est rejeté à tort. C’est pourquoi les deux techniques vont de pair :

Technique Choisit Valeurs pour les 18 à 60 ans
Partitionnement d’équivalence Une valeur à l’intérieur de chaque groupe 10, 35, 75
Analyse des valeurs limites Valeurs aux bords de chaque groupe 17, 18, 60, 61

Utilisez le partitionnement pour trouver les groupes, puis les limites pour tester où les groupes se rencontrent. Dans notre code, un test distinct pour 17, 18, 60 et 61 a réussi la fonction correcte et détecterait ce bug. Notre guide d’analyse des valeurs limites couvre ce sujet dans son intégralité.

Avantages et limites

Avantages Limites
Réduit considérablement le nombre de tests S’appuie sur des partitions correctes
Donne une couverture claire et explicable Peut manquer des bugs aux limites
Ne nécessite aucun accès au code Peut manquer des cas spéciaux cachés
S’applique tôt, même à partir des exigences Ne modélise pas bien les séquences ou les combinaisons

Le plus grand risque est une hypothèse erronée. Si le code comporte une règle cachée pour une valeur spécifique, le test que vous avez choisi risque tout simplement de ne pas l’atteindre. Les tests exploratoires et la couverture du code vous aident à trouver ce que les partitions ont manqué.

Erreurs courantes

  • Oubli des partitions invalides. Tester uniquement les chemins heureux laisse la gestion des erreurs décochée.
  • Test de plusieurs valeurs à partir d’une seule partition. Cela ajoute des coûts sans nouvelles informations.
  • Combinaison de plusieurs valeurs invalides dans un seul test. Une erreur peut en cacher une autre.
  • Sauter les limites. Les tests de partition seuls manquent souvent des bogues isolés.
  • Deviner les règles. Si une exigence n’est pas claire, demandez. Est-ce que 60 ans devrait inclure les personnes de 60 ans et demi ?

Pour conclure

Le partitionnement d’équivalence remplace « combien de tests dois-je écrire ? » avec une bien meilleure question : “quels comportements existent et ai-je couvert chacun d’entre eux ?” Pour l’essayer, prenez un formulaire que vous testez aujourd’hui et listez ses partitions sur papier, y compris celles invalides. Ajoutez ensuite des limites. Vous vous retrouverez souvent avec moins de tests qui trouvent plus de bugs.

Questions fréquentes

Qu’est-ce que le partitionnement d’équivalence dans les tests ?

Il s’agit d’une technique de boîte noire qui divise les entrées en groupes censés se comporter de la même manière. Vous testez ensuite une valeur représentative de chaque groupe, pas toutes les valeurs.

Quelle est la différence entre le partitionnement d’équivalence et l’analyse des valeurs limites ?

Le partitionnement sélectionne une valeur à l’intérieur de chaque groupe. L’analyse des valeurs limites teste les valeurs aux limites de ces groupes. Ils sont généralement utilisés ensemble.

De combien de cas de test le partitionnement d’équivalence a-t-il besoin ?

Généralement au moins un par partition, valide et invalide. Un champ de tranche d’âge nécessite généralement environ trois à cinq tests.

Le cloisonnement d’équivalence est-il une boîte noire ou une boîte blanche ?

Il s’agit d’une technique de boîte noire, puisque les partitions proviennent d’exigences et n’ont pas besoin du code. Cependant, les développeurs peuvent également l’appliquer aux tests unitaires.

Que sont les partitions valides et invalides ?

Les partitions valides contiennent des valeurs que le système doit accepter. Les partitions invalides contiennent des valeurs qu’elles doivent rejeter, telles que des nombres hors limites, des types incorrects et des espaces.

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

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 →