Un code d'état vert ment. Votre endpoint POST /orders renvoie 201 Created, le corps de la réponse semble parfait et votre test passe. Mais la ligne a-t-elle réellement atterri dans la base de données avec le bon statut ? Le décompte des stocks a-t-il diminué ? Un test qui ne lit que la réponse HTTP vérifie ce que l'API a *dit*, pas ce que le système a *fait*. Pour combler cet écart, vous devez regarder la base de données elle-même.
C'est là que les requêtes de base de données au sein d'un scénario de test prennent tout leur sens. Vous préparez un état connu avant une requête, déclenchez la requête, puis interrogez la table pour confirmer la vérité sur le disque. Apidog intègre cette fonctionnalité via les Connexions de Base de Données et le processeur d'Opération de Base de Données, ce qui vous permet d'exécuter des commandes SQL ou NoSQL comme des étapes dans le même scénario qui pilote vos appels HTTP, sans aucun script externe. Si vous débutez dans la création de scénarios, le guide sur comment écrire un scénario de test avec Apidog couvre les bases au niveau des requêtes sur lesquelles cet article s'appuie. Pour un rappel sur la façon dont les bases de données relationnelles modélisent ces données, l'aperçu côté serveur de MDN est une excellente introduction.
Ce que vous apportent les opérations de base de données dans un test
Un test d'API qui ne touche jamais la base de données est une boîte noire. Il fait confiance à la réponse. La plupart du temps, c'est bien, mais les bugs intéressants se trouvent dans l'écart entre ce que l'API renvoie et ce qu'elle persiste : un champ de statut qui ne change jamais, une clé étrangère qui ne pointe nulle part, une suppression douce qui devient une suppression dure.
Les étapes de base de données vous permettent de faire trois choses qu'un test HTTP pur ne peut pas faire :
- Préparer un état de départ précis afin qu'un test ne soit pas à la merci des données résiduelles.
- Affirmer la vérité en lisant la ligne que l'API prétend avoir écrite.
- Extraire une valeur réelle de la base de données et l'injecter dans la requête suivante, afin que votre test utilise les ID réellement générés par le serveur au lieu de suppositions.
Apidog divise la fonctionnalité en deux. D'abord, vous créez une connexion réutilisable sous Paramètres > Connexions de Base de Données. Ensuite, vous attachez une étape d'Opération de Base de Données à une requête en tant que Pré-processeur (exécuté avant la requête) ou Post-processeur (exécuté après). Une seule connexion, réutilisée dans chaque scénario du projet.
Une note sur la couverture avant de planifier en fonction. MySQL, SQL Server (2014 et plus récent), PostgreSQL et Oracle fonctionnent sur le plan gratuit. ClickHouse, MongoDB et Redis sont payants. La documentation MongoDB l'indique clairement : la connexion à MongoDB est une fonctionnalité payante. Idem pour Redis. Ainsi, le tutoriel MySQL ci-dessous fonctionne sur le niveau gratuit ; les sections Mongo et Redis nécessitent un plan payant.
Étape 1 : créer une connexion de base de données
Ouvrez Paramètres > Connexions de Base de Données et cliquez sur + Nouveau en haut à droite. Choisissez votre type de base de données, puis remplissez les champs de connexion :
- Hôte (par exemple
db.staging.internalou127.0.0.1) - Port (
3306pour MySQL) - Nom d'utilisateur et Mot de passe
- Nom de la base de données (par exemple
shop)

Si votre base de données se trouve derrière un bastion, développez la section Tunnel SSH et ajoutez les détails de l'hôte de rebond. MySQL expose également un mode SSL avec quatre options : Prefer (la valeur par défaut, qui tente le SSL puis revient en arrière), Require, Verify CA et Verify Full. Choisissez la plus stricte que votre serveur prend en charge. Puis cliquez sur Enregistrer.
Deux pièges de connexion pour vous éviter un après-midi de confusion :
- Authentification MySQL 8. Le plugin par défaut
caching_sha2_passwordpeut refuser la connexion. Si vous rencontrez une erreur d'authentification, changez l'utilisateur avecALTER USER 'tester'@'%' IDENTIFIED WITH mysql_native_password BY '...';et réessayez. Le manuel de référence MySQL couvre en détail la différence de plugin. - Les identifiants sont locaux. Les détails de connexion sont stockés sur votre propre machine et ne sont pas synchronisés avec le cloud. Chaque coéquipier configure la connexion lui-même. Si vous coordonnez une équipe, les notes sur le partage des paramètres de connexion de base de données expliquent le flux de travail.
Étape 2 : préparer les données avec un Pré-processeur
Imaginons que vous testiez le flux de création de commande. Vous voulez qu'un client connu existe avant de passer une commande, afin que le test ne dépende pas de ce qui se trouve dans la table.
Ouvrez votre requête, trouvez Pré-processeurs, survolez Ajouter un processeur de base de données et choisissez Opération de base de données. Nommez-le quelque chose comme préparer client, choisissez votre connexion MySQL, puis sous Saisir la commande SQL, écrivez une insertion. Les variables dynamiques utilisent la syntaxe {{variable_name}}, vous pouvez donc récupérer les valeurs directement de votre environnement :
INSERT INTO customers (id, email, status)
VALUES ({{customer_id}}, '{{customer_email}}', 'active')
ON DUPLICATE KEY UPDATE status = 'active';
Maintenant, la requête s'exécute contre un état garanti. Le client existe, est actif et a un ID que vos étapes ultérieures connaissent déjà. La préparation dans un Pré-processeur rend chaque test autonome au lieu de s'appuyer sur les effets secondaires de l'ordre des tests.
Étape 3 : affirmer la vérité par rapport à la base de données avec un Post-processeur
Voici l'essentiel. Votre requête crée une commande. Après son retour, vous interrogez la table orders pour confirmer que la ligne existe avec le bon statut.
Ajoutez la requête qui appelle votre API :
POST /api/orders
Content-Type: application/json
{
"customer_id": {{customer_id}},
"items": [{ "sku": "APRON-01", "qty": 2 }]
}
Supposons que le corps de la réponse contienne le nouvel ID de commande, que vous capturez dans une variable appelée order_id avec une assertion de réponse normale. Maintenant, ouvrez Post-processeurs sur cette requête. En mode CONCEPTION, vous les trouverez dans l'onglet Exécuter ; en mode DÉBOGAGE, ils se trouvent dans l'onglet Requête. Survolez Ajouter un Post-processeur, sélectionnez Opération de base de données, nommez-le vérifier ligne commande et choisissez votre connexion.
Sous Configurer l'opération, choisissez l'opération et entrez le SQL :
SELECT id, status, total_cents
FROM orders
WHERE id = {{order_id}};
Les résultats de la requête sont renvoyés sous forme de tableau d'objets, un par ligne. Pour extraire un seul champ, ouvrez Extraire les résultats (Facultatif) et ajoutez une entrée Extraire le résultat vers une variable. Définissez un Nom de variable comme db_order_status et une Expression JSONPath qui isole le champ de la première ligne :
$[0].status
Cliquez sur Envoyer et vérifiez la Console pour voir le résultat brut et la valeur extraite. Maintenant, db_order_status contient ce qui est réellement sur le disque. Ajoutez une assertion qu'il est égal à pending (ou ce que votre API est censée définir), et votre test vérifie enfin la persistance, et non pas seulement l'écho HTTP. Si l'API a renvoyé 201 mais a écrit status = 'draft', c'est cette étape qui le détecte.
Étape 4 : extraire une valeur de base de données et l'utiliser en aval
L'extraction n'est pas seulement pour les assertions. Souvent, la base de données contient une valeur que la réponse ne renvoie jamais, et vous en avez besoin pour la requête suivante.
Imaginez un flux où la création d'une commande génère également une fulfillment_ref interne sur le serveur, écrite dans la ligne mais omise de la réponse de l'API. Votre prochaine requête, GET /api/fulfillments/{ref}, en a besoin. Interrogez-la dans un Post-processeur :
SELECT fulfillment_ref
FROM orders
WHERE id = {{order_id}};
Extrayez-le avec le Nom de variable fulfillment_ref et l'Expression JSONPath $[0].fulfillment_ref. Parce qu'Apidog scope cette variable à l'environnement, votre prochaine requête référence simplement {{fulfillment_ref}} dans son chemin ou son corps et récupère la valeur réelle, générée par le serveur. C'est le même modèle que l'enchaînement des réponses HTTP, couvert dans passer des données entre les étapes de test et orchestration de test API et passage de données, sauf que la source de vérité est une table au lieu d'un corps JSON.
MongoDB et Redis : les variantes NoSQL
Le processeur fonctionne de la même manière pour les bases de données NoSQL, avec une surface de configuration différente. Les deux sont des fonctionnalités payantes, alors planifiez en conséquence. La documentation Apidog contient la référence complète des champs si vous en avez besoin.
MongoDB
Ajoutez une étape d'Opération de Base de Données et sélectionnez MongoDB comme type. Au lieu de SQL brut, vous obtenez un menu déroulant Type d'opération avec Rechercher, Insérer, Mettre à jour, Supprimer et Exécuter la commande de base de données. Pour toute action CRUD, le Nom de la collection est obligatoire. Le champ Condition de requête prend du JSON :
{ "_id": "65486728456e79993a150f1c" }
Apidog convertit automatiquement une chaîne d'ID correspondante en ObjectId, vous n'avez donc pas à l'envelopper vous-même. Lorsque vous avez besoin de types BSON, les helpers ISODate(...), ObjectId(...), NumberDecimal(...) et NumberLong(...) sont pris en charge ; le manuel MongoDB documente comment chacun d'eux correspond à une valeur stockée. La connexion accepte soit une chaîne de connexion complète, soit les composants individuels d'hôte et d'identifiants.
Une note d'honnêteté : le flux MySQL documente l'extraction JSONPath dans une variable, mais les documents MongoDB et Redis ne décrivent pas le même mécanisme d'Extraction du résultat vers une variable. Concentrez-vous donc sur les opérations Mongo pour l'initialisation et la confirmation de l'état, et ne supposez pas que le chemin d'extraction de style SQL fonctionne de manière identique tant que vous ne l'avez pas vérifié dans la Console.
Redis
La connexion Redis demande l'Hôte, le Port, le Mot de passe et l'Index de la base de données. Les opérations visuelles utilisent un menu déroulant Type d'opération prenant en charge GET, SET et DELETE. Pour lire une session mise en cache, choisissez GET et définissez la Clé sur quelque chose comme user:session:123. Pour tout ce que le menu déroulant ne couvre pas, l'onglet Exécuter la commande Redis exécute toute commande valide :
KEYS user:*
C'est ainsi que vous confirmez une entrée de cache que l'API était censée écrire, ou en videz une avant un test pour prouver que l'endpoint la repeuple.
Variations avancées et limites
Quelques éléments à savoir avant de construire une grande suite :
- Boucles. Lorsque vous itérez sur des lignes dans une étape ForEach, référencez l'élément de boucle actuel avec
{{$.StepID.element.field}}, oùStepIDest le numéro réel de l'étape de boucle. Pratique pour affirmer une ligne par itération. - Brancher sur une valeur de base de données. Extrayez un champ de statut, puis routez le reste du scénario en fonction de celui-ci. L'association des lectures de base de données avec la logique conditionnelle dans les scénarios de test API permet à un test de suivre un chemin lorsque la ligne est
payéeet un autre lorsqu'elle esten attente. - Routage environnemental. Plus d'informations ci-dessous, mais en bref : définissez une connexion par environnement et Apidog choisit la bonne automatiquement.
- Procédures stockées. L'interface visuelle ne gère pas les opérations complexes comme les procédures stockées. Gardez le SQL dans vos étapes pour des instructions simples.
- Configuration Oracle. Oracle nécessite l'installation d'un client Oracle séparé sur votre machine avant de pouvoir se connecter du tout.
Gérer les identifiants par environnement
Vous ne voulez jamais qu'un test n'affecte accidentellement des données de production. La réponse d'Apidog est une Connexion de Base de Données par environnement. Vous créez une connexion de staging et une connexion locale, chacune avec son propre hôte et mot de passe.
Ensuite, vous changez d'environnement à l'aide du menu déroulant en haut à droite. Apidog achemine automatiquement chaque requête du scénario vers la connexion qui correspond à l'environnement actuellement sélectionné. Sélectionnez staging et votre SELECT s'exécute sur staging ; passez à local et la même étape s'exécute sur la base de données de votre ordinateur portable, sans aucune modification du SQL ou de l'étape. Les identifiants diffèrent par environnement sans aucune reconfiguration manuelle en cours d'exécution.
Parce que ces identifiants sont stockés localement et ne sont pas synchronisés, cela protège également les mots de passe de production du projet cloud partagé. Chaque ingénieur conserve les siens.
Automatiser le flux de travail avec l'Apidog CLI
Une fois que le scénario passe dans l'application, exécutez-le sans interface graphique en CI afin que chaque pull request revérifie la base de données, pas seulement le contrat HTTP. Installez le CLI et authentifiez-vous :
npm install -g apidog-cli
apidog login --with-token <YOUR_ACCESS_TOKEN>
Ensuite, exécutez le scénario exact que vous avez construit, par son ID, contre un environnement choisi :
apidog run --access-token $APIDOG_ACCESS_TOKEN -t <scenario_id> -e <env_id> -r cli
Ici, -t est l'ID du scénario de test, -e est l'ID de l'environnement, et -r est le rapporteur (cli, html ou junit ; séparez-les par des virgules pour plusieurs, comme -r html,cli). Une chose à prévoir : les détails de connexion de la base de données sont locaux, donc le runner a besoin de la configuration exportée pour atteindre votre base de données depuis la CI. Si vous alimentez les lignes du scénario à partir d'un ensemble de données, le test axé sur les données avec l'Apidog CLI montre comment chaque ligne exécute les mêmes assertions de base de données, et la planification des tests API avec Apidog couvre l'exécution de cela à une cadence afin qu'une assertion de base de données défaillante remonte comme n'importe quel autre test.
Foire aux questions
Quelles bases de données sont gratuites et lesquelles sont payantes ? MySQL, SQL Server (2014 et plus récent), PostgreSQL et Oracle sont inclus dans le plan gratuit. ClickHouse, MongoDB et Redis nécessitent un plan payant. La documentation MongoDB et Redis indique toutes deux que leur connectivité est une fonctionnalité payante, alors vérifiez la page des tarifs avant de planifier une suite NoSQL. Téléchargez Apidog pour essayer d'abord les bases de données gratuites.
Puis-je utiliser une valeur de la base de données dans une requête ultérieure ? Oui. Ajoutez un Post-processeur avec une opération de base de données, exécutez un SELECT, puis utilisez Extraire le résultat vers une variable avec un Nom de variable et une Expression JSONPath comme $[0].fulfillment_ref pour isoler le champ de la première ligne. Référencez-le plus tard comme {{variable_name}}. La même idée de chaînage pour les réponses HTTP est couverte dans passer des données entre les étapes de test.
Mes coéquipiers obtiennent-ils automatiquement mes connexions de base de données ? Non. Les identifiants de connexion sont stockés localement sur chaque client et ne sont pas synchronisés avec le cloud, donc chaque membre de l'équipe configure la connexion lui-même. C'est délibéré : cela protège les mots de passe de production du projet partagé.
Ma connexion MySQL 8 échoue constamment. Pourquoi ? MySQL 8 utilise par défaut le plugin d'authentification caching_sha2_password, qui peut bloquer la connexion. Passez l'utilisateur à mysql_native_password avec ALTER USER ... IDENTIFIED WITH mysql_native_password et reconnectez-vous.
Puis-je exécuter des procédures stockées ou une logique de base de données complexe ? Pas via l'interface visuelle. Elle gère les instructions standard SELECT, INSERT, UPDATE et DELETE, mais les opérations complexes comme les procédures stockées ne sont pas prises en charge. Limitez vos étapes de test à des instructions directes.
En résumé
Les requêtes de base de données transforment un test d'API de "la réponse semblait correcte" en "les données sont réellement correctes". Préparez un état connu dans un Pré-processeur, vérifiez la ligne persistante dans un Post-processeur, et extrayez les valeurs générées par le serveur pour les enchaîner dans la requête suivante, le tout dans un seul scénario. Configurez une connexion par environnement et les mêmes étapes s'exécuteront en toute sécurité sur staging ou en local sans modifications.
Essayez-le gratuitement, sans carte de crédit : Téléchargez Apidog, pointez une connexion MySQL vers votre base de données de développement, et ajoutez un Post-processeur qui lit la ligne que votre prochaine requête crée.
