Si vous avez un schéma OpenAPI ou GraphQL, Schemathesis peut générer des milliers de cas de test sans écrire une seule assertion manuelle. Il lit votre spécification, produit des entrées valides et variées, les envoie à votre API, puis signale les réponses qui cassent le contrat. Dans ce guide, vous allez installer Schemathesis, l’exécuter sur une API locale ou distante, comprendre les tests basés sur les propriétés, puis l’intégrer à un workflow de tests fonctionnels et de tests de contrat avec Apidog.
Qu'est-ce que Schemathesis ?
Schemathesis est un outil Python open-source qui génère automatiquement des tests API à partir d’un schéma OpenAPI ou GraphQL. Il s’appuie sur Hypothesis, la bibliothèque Python de tests basés sur les propriétés, et il est distribué sous licence MIT.
Le principe est direct : votre spécification décrit déjà les requêtes et réponses attendues. Schemathesis utilise cette spécification comme source de vérité, appelle votre API réelle, puis vérifie si l’implémentation respecte le contrat.
Il peut par exemple détecter :
- une erreur
500déclenchée par une entrée valide ; - une réponse qui ne correspond pas au schéma déclaré ;
- un code de statut non documenté ;
- un
Content-Typedifférent de celui annoncé ; - des incohérences dans des scénarios avec état.
Vous pouvez l’utiliser en ligne de commande avec schemathesis run ou son alias court st run. Pour démarrer vite, l’interface CLI est généralement suffisante. Si vous voulez l’intégrer plus finement à vos tests Python, vous pouvez aussi l’utiliser avec pytest.
Comprendre les tests basés sur les propriétés
Les tests API classiques sont souvent basés sur des exemples :
POST /users
Content-Type: application/json
{
"email": "alice@example.com",
"age": 30
}
Puis vous vérifiez une réponse attendue :
{
"id": "usr_123",
"email": "alice@example.com",
"age": 30
}
Cette approche est utile, mais elle ne couvre que les cas que vous avez pensés à écrire.
Les tests basés sur les propriétés inversent la logique. Au lieu de définir un seul exemple, vous définissez une propriété qui doit toujours rester vraie. Schemathesis applique cette idée à votre API :
Une requête valide selon le schéma ne doit pas faire planter le serveur ni produire une réponse qui viole le schéma.
À partir de vos contraintes OpenAPI, Schemathesis génère automatiquement des valeurs pertinentes. Par exemple, si votre schéma contient :
type: integer
minimum: 1
maximum: 100
Schemathesis peut tester des valeurs limites comme 1, 100, mais aussi d’autres entrées générées pour exposer les failles de validation.
Lorsqu’un bug est trouvé, Hypothesis réduit le cas d’échec à une entrée minimale qui reproduit encore le problème. Vous obtenez donc une charge utile exploitable, au lieu d’un énorme payload aléatoire difficile à comprendre.
Ce n’est pas du monkey testing. Le monkey testing envoie des entrées aléatoires pour voir ce qui casse. Les tests basés sur les propriétés sont structurés : ils utilisent le schéma pour générer des données ciblées et savent quoi vérifier parce que la spécification définit le contrat attendu.
Installer Schemathesis
Schemathesis est un package Python. Vous avez besoin de Python 3 et de pip.
Installez-le avec :
pip install schemathesis
Vérifiez ensuite que la commande fonctionne :
st --version
Vous pouvez aussi l’exécuter sans installation permanente avec uvx, si uv est déjà configuré :
uvx schemathesis run http://127.0.0.1:8000/openapi.json
Exécuter Schemathesis sur une API
1. Tester une API dont le schéma est exposé par URL
Si votre API expose son schéma OpenAPI à une URL comme /openapi.json, lancez :
st run http://127.0.0.1:8000/openapi.json
Schemathesis va :
- charger le schéma ;
- découvrir les opérations disponibles ;
- générer des requêtes pour chaque opération ;
- envoyer les requêtes à l’API ;
- valider les réponses ;
- afficher les échecs reproductibles.
2. Tester une API avec un fichier OpenAPI local
Si votre fichier se trouve sur votre machine :
st run ./openapi.yaml --url http://127.0.0.1:8000
Ici :
-
./openapi.yamlest la spécification ; -
--urlindique l’URL de base de l’API réelle à tester.
3. Ajouter un header d’authentification
Pour une API protégée par token :
st run http://127.0.0.1:8000/openapi.json \
--header 'Authorization: Bearer your-token'
Vous pouvez également ajouter d’autres headers nécessaires à votre environnement :
st run ./openapi.yaml \
--url https://api.example.com \
--header 'Authorization: Bearer your-token' \
--header 'X-Environment: staging'
Les options peuvent varier selon les versions majeures. Avant de figer une commande dans votre CI, vérifiez toujours :
st run --help
Lire un échec Schemathesis
Quand Schemathesis trouve un problème, il affiche la requête qui l’a déclenché. L’objectif est de vous permettre de reproduire rapidement le bug.
Un workflow de tri typique :
- copiez la requête générée ;
- rejouez-la avec
curl, Apidog ou votre client API ; - vérifiez si l’échec vient de l’implémentation ou du schéma ;
- corrigez l’API ou la spécification ;
- relancez
st run.
Exemple de reproduction avec curl :
curl -X POST http://127.0.0.1:8000/users \
-H 'Content-Type: application/json' \
-d '{"age": 1,"email":"test@example.com"}'
Si la réponse ne respecte pas votre schéma OpenAPI, vous avez deux possibilités :
- l’API est incorrecte et doit être corrigée ;
- la spécification est incomplète ou obsolète et doit être mise à jour.
Ce que Schemathesis détecte
Les vérifications par défaut ciblent l’écart entre ce que votre spécification promet et ce que votre serveur fait réellement.
| Problème | À quoi cela ressemble |
|---|---|
| Erreurs serveur | Une requête déclenche une erreur 500 au lieu d’une erreur 4xx gérée ou d’une réponse valide |
| Violations de schéma | Le corps de réponse ne correspond pas au schéma déclaré pour ce code de statut |
| Incohérences de code de statut | L’API renvoie un code de statut non documenté dans la spécification |
Dérive du Content-Type
|
Le type de contenu de la réponse ne correspond pas à celui annoncé |
| Bugs d’état | Une opération fonctionne seule mais échoue dans un workflow réaliste en plusieurs étapes |
Les bugs d’état sont particulièrement intéressants. Schemathesis peut enchaîner des opérations à partir des liens déclarés dans la spécification. Par exemple :
- créer une ressource ;
- la récupérer ;
- la mettre à jour ;
- la supprimer ;
- vérifier son état après suppression.
Ce type de scénario trouve des bugs que les tests isolés endpoint par endpoint ratent souvent.
Personnaliser Schemathesis avec des hooks
Les hooks permettent d’adapter Schemathesis à votre contexte. Vous pouvez les utiliser pour :
- filtrer certaines opérations ;
- enrichir les données générées ;
- ajouter des vérifications métier ;
- gérer des contraintes que le schéma ne sait pas exprimer ;
- préparer un état avant un test.
Par exemple, si certaines routes nécessitent un contexte particulier, vous pouvez écrire du code Python autour de Schemathesis au lieu de tout piloter uniquement en CLI.
C’est utile quand votre API a :
- des flux d’authentification complexes ;
- des dépendances entre ressources ;
- des contraintes implicites ;
- des données préexistantes obligatoires.
Ajouter Schemathesis à la CI
Schemathesis est facile à ajouter dans un pipeline CI, car la commande retourne un code d’erreur en cas d’échec.
Exemple GitHub Actions simplifié :
name: API fuzzing
on:
pull_request:
push:
branches:
- main
jobs:
schemathesis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install Schemathesis
run: pip install schemathesis
- name: Run API
run: |
# Démarrez votre API ici
# Exemple :
# uvicorn app.main:app --host 0.0.0.0 --port 8000 &
echo "Start API"
- name: Run Schemathesis
run: |
st run ./openapi.yaml --url http://127.0.0.1:8000
En pratique, vous pouvez exécuter Schemathesis :
- sur chaque pull request pour détecter vite les régressions ;
- chaque nuit pour des campagnes plus longues ;
- avant une release pour valider le contrat exposé.
Quand utiliser Schemathesis
Schemathesis est pertinent si vous disposez d’une spécification OpenAPI ou GraphQL suffisamment précise et que vous voulez couvrir beaucoup de cas limites sans écrire tous les tests à la main.
Utilisez-le si :
- vous maintenez une spécification OpenAPI et voulez vérifier qu’elle est respectée par le serveur réel ;
- vous voulez détecter les erreurs
500non gérées ; - vous voulez ajouter une couche de fuzzing en CI ;
- votre API contient des workflows avec état ;
- votre équipe utilise déjà Python,
pipoupytest.
Évitez de l’utiliser comme unique stratégie de test. Schemathesis vérifie surtout la robustesse et la conformité au schéma. Il ne valide pas à lui seul la logique métier.
Par exemple, il peut détecter qu’une réponse ne respecte pas le schéma, mais il ne saura pas nécessairement vérifier qu’un calcul de remise, une règle de facturation ou une permission métier est correcte. Pour cela, vous avez toujours besoin de tests fonctionnels basés sur des exemples.
Schemathesis et Apidog : où chacun s’intègre
Apidog et Schemathesis couvrent des besoins différents.
Apidog est une plateforme pour concevoir, déboguer, tester, simuler et documenter des API. Schemathesis est un outil spécialisé dans le fuzzing basé sur les propriétés à partir d’un schéma.
Apidog ne fait pas de fuzzing basé sur les propriétés. Sa fonctionnalité la plus proche est le monkey testing, qui envoie des entrées aléatoires pour faire apparaître des plantages. C’est utile, mais ce n’est pas équivalent à Schemathesis, qui génère des entrées à partir des contraintes du schéma et valide les réponses contre ce même schéma.
| Étape du workflow | Schemathesis | Apidog |
|---|---|---|
| Fuzzing basé sur les propriétés à partir d’une spécification | Oui, fonctionnalité principale | Non |
| Conception visuelle d’API et édition de spécifications | Non | Oui |
| Tests fonctionnels basés sur des exemples | Limité | Oui, constructeur de tests visuel |
| Tests de contrat par rapport à une spécification | Partiel, via les vérifications de schéma | Oui, workflow dédié |
| Serveurs de simulation à partir d’un schéma | Non | Oui, simulation intelligente |
| Exécuteur de tests CI | Oui, st run
|
Oui, apidog run
|
| Documentation générée automatiquement | Non | Oui |
Un workflow pratique peut ressembler à ceci :
- concevoir et maintenir la spécification dans Apidog ;
- générer des tests fonctionnels à partir de cette spécification ;
- créer un serveur de simulation pour les consommateurs d’API ;
- exécuter les tests en CI avec
apidog run; - ajouter une passe Schemathesis sur la même spécification ;
- corriger les divergences entre contrat et implémentation.
Les deux couches ne cherchent pas les mêmes bugs. Apidog valide les scénarios connus et les contrats attendus. Schemathesis explore les cas limites et les entrées que vous n’auriez probablement pas écrites à la main.
Si votre objectif est de transformer une spécification en suite fonctionnelle exécutable plutôt qu’en campagne de fuzzing, Apidog peut générer directement des collections de tests API à partir de vos spécifications OpenAPI. Vous pouvez aussi télécharger Apidog pour tester ce workflow.
Foire aux questions
Schemathesis est-il gratuit ?
Oui. Schemathesis est open source sous licence MIT. Vous pouvez l’installer et l’exécuter gratuitement avec :
pip install schemathesis
Il existe aussi une offre commerciale hébergée pour les équipes qui veulent une expérience gérée, mais l’outil principal utilisable localement et en CI est gratuit.
Quelle est la différence entre schemathesis run et st run ?
Ce sont les mêmes commandes. st est l’alias court de schemathesis.
Ces deux commandes sont équivalentes :
schemathesis run ./openapi.yaml --url http://127.0.0.1:8000
st run ./openapi.yaml --url http://127.0.0.1:8000
Utilisez celle que vous préférez.
Schemathesis peut-il remplacer mes tests API fonctionnels ?
Non. Schemathesis vérifie que votre API ne plante pas et que les réponses respectent le schéma. Il ne remplace pas les tests fonctionnels qui valident la logique métier.
Vous avez toujours besoin de tests basés sur des exemples et de tests de contrat. Schemathesis doit être vu comme une couche complémentaire de fuzzing, pas comme un remplacement.
Schemathesis fonctionne-t-il avec GraphQL ?
Oui. Schemathesis prend en charge OpenAPI et GraphQL. Pour GraphQL, il génère des requêtes à partir des définitions de types du schéma et vérifie les réponses selon le contrat attendu.
Conclusion
Schemathesis fait une chose précise : prendre une spécification OpenAPI ou GraphQL et tester votre API réelle avec des entrées générées automatiquement. Il trouve des plantages, des réponses invalides et des écarts de contrat que les tests manuels basés sur des exemples peuvent manquer.
Ajoutez-le à votre CI si vous voulez une couche de fuzzing pilotée par le schéma. Gardez vos tests fonctionnels pour valider les scénarios métier connus.
Apidog complète ce workflow côté conception, tests fonctionnels, simulation, exécution CI et documentation. Vous pouvez concevoir la spécification, générer des tests, les exécuter avec apidog run, documenter l’API, puis ajouter Schemathesis pour explorer les cas limites. Téléchargez Apidog pour construire la partie conception et tests fonctionnels de ce pipeline.

Top comments (0)