Opérations
Routes, portées, idempotence et rôle des 23 opérations de l'API HTTP, avec des exemples de requêtes.
Appelez chaque opération avec POST /api/v1/<operation> et un corps objet JSON. Le nom d'opération indiqué dans les tableaux est exactement le suffixe qui suit /api/v1/. Sur MCP, la même opération est l'outil autonomy_<operation>, avec les points remplacés par des underscores.
Dans les tableaux, Obligatoire signifie que la requête doit contenir une idempotencyKey (voir Mutations idempotentes).
Projets
| Opération | Portée | Idempotence | Rôle |
|---|---|---|---|
project.list | autonomy:read | Aucune | Lister par nom les projets auxquels vous avez accès. Commencez ici pour trouver le projectId que demandent les autres opérations. |
project.get | autonomy:read | Aucune | Récupérer un projet par son projectId, avec ses connaissances produit. |
Cas de test
| Opération | Portée | Idempotence | Rôle |
|---|---|---|---|
test_case.list | autonomy:read | Aucune | Lister les cas de test, du plus récent au plus ancien. Filtrez par projectId, platform ou une query sur le nom. Vérifiez ici avant de créer un cas, pour réutiliser la couverture existante. |
test_case.get | autonomy:read | Aucune | Récupérer un cas de test par son testCaseId, avec ses étapes et leurs pièces jointes. Les valeurs secrètes ne sont jamais renvoyées. |
test_case.create | autonomy:test_cases:write | Obligatoire | Créer un cas de test dans un projet à partir d'étapes formulées comme des résultats attendus. Prend projectId, name, platforms, steps, et en option description et tags. |
test_case.update_steps | autonomy:test_cases:write | Obligatoire | Remplacer toute la liste d'étapes d'un cas de test. Nécessite toujours confirm: true. |
test_case.archive | autonomy:test_cases:write | Obligatoire | Archiver un cas de test : il disparaît des listes et ne peut plus être exécuté. Ses exécutions et leurs résultats sont conservés. L'archiver une seconde fois ne change rien. |
Plans de test
| Opération | Portée | Idempotence | Rôle |
|---|---|---|---|
test_plan.list | autonomy:read | Aucune | Lister les plans de test. Filtrez par projectId ou une query sur le nom. |
test_plan.get | autonomy:read | Aucune | Récupérer un plan de test avec ses cas de test, dans l'ordre. |
test_plan.create | autonomy:test_plans:write | Obligatoire | Créer un plan de test dans un projet, éventuellement avec ses premiers cas de test (testCaseIds, tous issus de ce projet). |
test_plan.set_members | autonomy:test_plans:write | Obligatoire | Remplacer les cas de test d'un plan de test, dans l'ordre. Nécessite confirm: true uniquement si des cas seraient retirés. |
Exécutions
| Opération | Portée | Idempotence | Rôle |
|---|---|---|---|
run.trigger | autonomy:runs:write | Obligatoire | Mettre des exécutions en file d'attente. Indiquez exactement l'un des deux champs testCaseId ou testPlanId (un plan met en file une exécution par cas de test). Ciblez un environnement enregistré du même projet avec environmentSlug, ou transmettez targets pour un nouveau déploiement ou un nouveau build. Répond immédiatement. |
run.list | autonomy:read | Aucune | Lister les exécutions récentes, de la plus récente à la plus ancienne. Filtrez par projectId, testCaseId, status, environmentSlug ou branch. Vérifiez ici avant de lancer un travail en double. |
run.get | autonomy:read | Aucune | Récupérer le résultat d'une exécution, le résultat de chaque étape et ce que l'exécution a créé. Attente longue (long-polling) avec cursor et waitMs. |
run.step_actions | autonomy:read | Aucune | Lister les Step Actions de l'exécution : tout ce que l'agent a fait pour atteindre chaque résultat attendu, y compris la Final check. Les valeurs que vous avez enregistrées comme secrets sont masquées. Filtrez avec stepIndex. |
run.evidence | autonomy:read | Aucune | Obtenir les preuves de chaque étape exécutée : le résultat attendu, le résultat, l'explication, la Final check et des liens média de courte durée. Filtrez avec step. |
Voir Exécutions et preuves pour suivre une exécution et lire ces résultats.
Environnements
| Opération | Portée | Idempotence | Rôle |
|---|---|---|---|
environment.list | autonomy:read | Aucune | Lister les environnements avec leurs cibles de plateforme. Filtrez par projectId. Les noms des valeurs sont affichés, jamais les valeurs. |
environment.get | autonomy:read | Aucune | Récupérer un environnement par son environmentSlug. |
environment.upsert | autonomy:environments:write | Obligatoire | Créer un environnement (projectId est obligatoire pour en créer un), ou en mettre un à jour par son slug. La mise à jour d'un environnement existant nécessite confirm: true. Les runtimeValues sont fusionnées par nom et s'utilisent sous la forme {{env.NAME}} dans n'importe quelle étape. Les valeurs secrètes sont en écriture seule. |
Une cible web ou API nécessite une url, et une cible Android un artifactUrl pour son build (les cibles iOS ne peuvent pas être enregistrées tant que les tests iOS ne sont pas disponibles). packageName, bundleId et versionLabel sont facultatifs : si vous les omettez, ils sont lus dans le build, et une valeur que vous envoyez l'emporte. L'enregistrement fonctionne pendant que le build est encore en cours de lecture ; si son identifiant d'application ne peut pas être lu, les exécutions sur cette cible ne peuvent pas démarrer.
Problèmes
| Opération | Portée | Idempotence | Rôle |
|---|---|---|---|
issue.list | autonomy:read | Aucune | Lister les problèmes, du plus récent au plus ancien. Filtrez par projectId, environmentSlug, status, kind, ou runId pour les problèmes qu'une exécution a trouvés ou montrés. |
issue.create | autonomy:issues:write | Obligatoire | Signaler un problème dans l'environnement où il a été constaté. kind vaut bug ou risk. Prend title, un body en texte brut, en option expected et actual, et runIds pour citer des exécutions. |
issue.comment | autonomy:issues:write | Obligatoire | Ajouter un commentaire en texte brut à un problème. |
issue.set_status | autonomy:issues:write | Obligatoire | Passer un problème à open, resolved ou ignored. Résolvez-le après qu'une exécution du même cas de test a montré la correction. |
Un problème ne modifie jamais le résultat d'une exécution ou d'une étape. Les problèmes signalés avant la v0.5 peuvent avoir le type note ; les nouveaux problèmes sont bug ou risk. Voir Problèmes.
Étapes sous forme de résultats attendus
Un cas de test est une liste d'étapes. Chaque étape est un résultat attendu formulé en langage courant, avec des pièces jointes facultatives :
1{2 "id": "sign-up",3 "text": "A new account exists for a fresh email address",4 "attachments": [5 {6 "id": "inbox",7 "kind": "inbox",8 "exact": false9 }10 ]11}id: stable au sein du cas de test. Lettres, chiffres,_et-, jusqu'à 64 caractères.text: le résultat attendu, jusqu'à 2 000 caractères. Il peut utiliser{{env.NAME}}.attachments: jusqu'à 12. Chacune a son propreid, unkindetexact.
kind | Champs | Ce qu'elle apporte à l'agent |
|---|---|---|
account | role | Une connexion enregistrée de l'environnement de l'exécution, désignée par son rôle, comme "Grower". |
inbox | label?, address? | Une nouvelle boîte de réception pour l'exécution, ou une address existante. |
phone | label?, number? | Un numéro de téléphone qui reçoit des SMS, ou un number existant. |
file | label?, file | Un fichier à téléverser. Copiez l'objet file depuis un cas de test qui utilise déjà ce fichier. |
screenshot | label? | Une capture d'écran du résultat atteint, conservée comme preuve. |
data | label, value?, intent?, secret? | Une valeur à utiliser (value), ou une intention (intent) pour que l'agent en choisisse une, comme « A strong password ». |
Les pièces jointes sont des données de test, sauf si exact vaut true. Si le produit refuse une valeur de test uniquement parce qu'elle est déjà prise, l'agent utilise une nouvelle valeur du même type et le signale. Une valeur Exact est utilisée telle quelle, et c'est sur son éventuel refus que l'étape est jugée. Une pièce jointe data, inbox ou phone marquée Exact doit fournir sa valeur, son adresse ou son numéro.
address, number et value peuvent valoir {{env.NAME}}, renseigné à partir de l'environnement de l'exécution. Une pièce jointe data avec secret: true est en écriture seule : sa valeur est stockée masquée et n'est jamais renvoyée. Si test_case.update_steps renvoie une pièce jointe secrète sans sa valeur, la valeur stockée est conservée.
L'API accepte jusqu'à 50 étapes par cas de test. L'éditeur du tableau de bord en affiche jusqu'à 12 : gardez donc courts les cas que vous modifiez aussi dans le tableau de bord. Voir Rédaction pour bien formuler les résultats attendus.
Créer un cas de test
Ce cas de test s'inscrit avec une nouvelle boîte de réception et un mot de passe généré, choisit un pays qui doit être exactement « Kenya », confirme le compte depuis l'e-mail de bienvenue et conserve une capture d'écran du profil.
curl --request POST "https://api.autonomyqa.com/api/v1/test_case.create" \
--header "Authorization: Bearer $AUTONOMY_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"idempotencyKey": "ci-create-grower-sign-up-v1",
"projectId": "jd7exampleprojectid",
"name": "Grower sign-up",
"description": "A new grower can sign up, confirm their email and see their profile.",
"platforms": ["web"],
"tags": ["sign-up", "smoke"],
"steps": [
{
"id": "sign-up",
"text": "A new grower account exists for a fresh email address, with Kenya as the country",
"attachments": [
{ "id": "inbox", "kind": "inbox", "label": "Sign-up inbox", "exact": false },
{
"id": "password",
"kind": "data",
"label": "Password",
"intent": "A strong password the sign-up form accepts",
"exact": false
},
{ "id": "country", "kind": "data", "label": "Country", "value": "Kenya", "exact": true }
]
},
{
"id": "confirm-email",
"text": "The account is confirmed with the link in the welcome email",
"attachments": []
},
{
"id": "profile",
"text": "The profile page shows Kenya as the country",
"attachments": [
{ "id": "profile-shot", "kind": "screenshot", "label": "Profile", "exact": false }
]
}
]
}'Stockez la clé aut_ dans AUTONOMY_API_KEY. La réponse est le nouveau cas de test, avec son id.
Déclencher une exécution
Indiquez exactement l'un des deux champs testCaseId ou testPlanId, et soit environmentSlug, soit targets, mais pas les deux. Cet exemple cible une nouvelle prévisualisation web :
curl --request POST "https://api.autonomyqa.com/api/v1/run.trigger" \
--header "Authorization: Bearer $AUTONOMY_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"idempotencyKey": "ci-run-pr-128-grower-sign-up-9f3a2c1",
"testCaseId": "jh7exampletestcaseid",
"platforms": ["web"],
"targets": {
"web": { "baseUrl": "https://preview-128.example.com" }
},
"branch": "feature/sign-up-copy",
"pr": "128",
"deployment": { "commitSha": "9f3a2c1d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b" }
}'| Cible | Champs |
|---|---|
web | baseUrl |
api | baseUrl, en option runtimeValues ([{ "name", "value", "isSecret" }]) |
android | packageName, plus artifactUrl ou un storageId analysé |
ios | Bientôt disponible : les exécutions iOS ne peuvent pas encore démarrer. bundleId, plus artifactUrl ou un storageId analysé |
platforms limite l'exécution à certaines des plateformes du cas de test. branch, pr et deployment relient les exécutions à une branche, une pull request ou un commit. À partir de l'offre Team, scope: "changed" avec changedFiles concentre l'exécution sur les fichiers modifiés.
La réponse contient runIds, l'environment utilisé et, pour un plan de test, planGroupRunId. Suivez chaque exécution avec run.get.
run.trigger refuse un cas de test importé qui n'a pas été confirmé, un cas de test qui n'a encore que des étapes antérieures à la v0.5 (« Rewrite them as outcome steps with test_case.update_steps, then run it. ») et un plan de test sans cas de test.
Mutations idempotentes
Chaque mutation marquée Obligatoire nécessite une chaîne idempotencyKey dans son corps JSON. C'est un champ du corps, pas un en-tête. Sans elle, l'API renvoie 400 INVALID_ARGUMENT avec le message « idempotencyKey is required for this operation. »
- Une nouvelle tentative avec la même clé et les mêmes arguments renvoie le résultat stocké au lieu de refaire le travail.
- Réutiliser une clé avec des arguments différents renvoie
409 CONFLICT: « idempotencyKey was already used with different arguments. » - Les résultats sont conservés 24 heures. Les clés sont propres à chaque appelant.
Utilisez une clé par modification voulue, et ne la réutilisez que pour retenter cette modification. Les opérations de lecture ne prennent pas de clé.
Confirmation avant remplacement
Les créations et run.trigger ne nécessitent jamais de confirmation. Trois opérations nécessitent confirm: true lorsqu'elles remplaceraient quelque chose :
| Opération | Quand | details.wouldChange |
|---|---|---|
test_case.update_steps | Toujours : toute la liste d'étapes est remplacée. | stepCountBefore, stepCountAfter |
test_plan.set_members | Uniquement si des cas de test seraient retirés. | removed, added (chacun [{ testCaseId, name }]) |
environment.upsert | Lorsque le slug existe et que des champs ou des cibles sont fournis. | fields, platforms |
Sans confirmation, rien n'est écrit. L'API renvoie 400 INVALID_ARGUMENT avec details.confirmRequired: true et l'aperçu details.wouldChange. Lisez l'aperçu, puis renvoyez la même requête avec confirm: true. N'ajoutez pas confirm: true automatiquement. Voir Erreurs pour la réponse complète.
Pagination par curseur
Toutes les opérations *.list, ainsi que run.step_actions, acceptent un limit facultatif et un cursor opaque :
1{2 "projectId": "jd7exampleprojectid",3 "limit": 20,4 "cursor": "<nextCursor from the previous response>"5}limit vaut 20 par défaut et doit être un entier de 1 à 100. Chaque réponse a la forme { items, nextCursor }. Transmettez nextCursor tel quel pour obtenir la page suivante ; null signifie qu'il n'y a plus de pages. Gardez les mêmes filtres d'une page à l'autre. Un null au premier niveau, comme "cursor": null, est traité comme absent.
run.list et issue.list appliquent certains filtres à l'intérieur de chaque page : une page peut donc être courte, voire vide, alors qu'il reste des résultats. Continuez à paginer tant que nextCursor est renseigné.
Vous n’avez pas trouvé ?