Docs Autonomy
API HTTP v1

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érationPortéeIdempotenceRôle
project.listautonomy:readAucuneLister par nom les projets auxquels vous avez accès. Commencez ici pour trouver le projectId que demandent les autres opérations.
project.getautonomy:readAucuneRécupérer un projet par son projectId, avec ses connaissances produit.

Cas de test

OpérationPortéeIdempotenceRôle
test_case.listautonomy:readAucuneLister 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.getautonomy:readAucuneRé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.createautonomy:test_cases:writeObligatoireCré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_stepsautonomy:test_cases:writeObligatoireRemplacer toute la liste d'étapes d'un cas de test. Nécessite toujours confirm: true.
test_case.archiveautonomy:test_cases:writeObligatoireArchiver 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érationPortéeIdempotenceRôle
test_plan.listautonomy:readAucuneLister les plans de test. Filtrez par projectId ou une query sur le nom.
test_plan.getautonomy:readAucuneRécupérer un plan de test avec ses cas de test, dans l'ordre.
test_plan.createautonomy:test_plans:writeObligatoireCréer un plan de test dans un projet, éventuellement avec ses premiers cas de test (testCaseIds, tous issus de ce projet).
test_plan.set_membersautonomy:test_plans:writeObligatoireRemplacer 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érationPortéeIdempotenceRôle
run.triggerautonomy:runs:writeObligatoireMettre 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.listautonomy:readAucuneLister 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.getautonomy:readAucuneRé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_actionsautonomy:readAucuneLister 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.evidenceautonomy:readAucuneObtenir 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érationPortéeIdempotenceRôle
environment.listautonomy:readAucuneLister les environnements avec leurs cibles de plateforme. Filtrez par projectId. Les noms des valeurs sont affichés, jamais les valeurs.
environment.getautonomy:readAucuneRécupérer un environnement par son environmentSlug.
environment.upsertautonomy:environments:writeObligatoireCré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érationPortéeIdempotenceRôle
issue.listautonomy:readAucuneLister 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.createautonomy:issues:writeObligatoireSignaler 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.commentautonomy:issues:writeObligatoireAjouter un commentaire en texte brut à un problème.
issue.set_statusautonomy:issues:writeObligatoirePasser 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 :

Une étapejson
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 propre id, un kind et exact.
kindChampsCe qu'elle apporte à l'agent
accountroleUne connexion enregistrée de l'environnement de l'exécution, désignée par son rôle, comme "Grower".
inboxlabel?, address?Une nouvelle boîte de réception pour l'exécution, ou une address existante.
phonelabel?, number?Un numéro de téléphone qui reçoit des SMS, ou un number existant.
filelabel?, fileUn fichier à téléverser. Copiez l'objet file depuis un cas de test qui utilise déjà ce fichier.
screenshotlabel?Une capture d'écran du résultat atteint, conservée comme preuve.
datalabel, 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.

test_case.createbash
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 :

run.triggerbash
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" }
}'
CibleChamps
webbaseUrl
apibaseUrl, en option runtimeValues ([{ "name", "value", "isSecret" }])
androidpackageName, plus artifactUrl ou un storageId analysé
iosBientô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érationQuanddetails.wouldChange
test_case.update_stepsToujours : toute la liste d'étapes est remplacée.stepCountBefore, stepCountAfter
test_plan.set_membersUniquement si des cas de test seraient retirés.removed, added (chacun [{ testCaseId, name }])
environment.upsertLorsque 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 :

Codejson
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é ?

On this page