UiPath Documentation
test-manager
latest
false
Important :
La localisation du contenu nouvellement publié peut prendre 1 à 2 semaines avant d’être disponible.

Guide de l'utilisateur de Test Manager

Spécification du format de fichier TMH

Le fichier .tmh est le format de sauvegarde/migration du projet utilisé par UiPath Test Manager. Ce document décrit en détail sa structure, son contenu et ses exigences d'encodage.

Archiver la structure

<package-name>.tmh               ← ZIP archive
├── manifest.json                ← Package metadata and object counts
└── objects/
    ├── requirements/
    │   └── requirements-{n}.json
    ├── testcases/
    │   └── testcases-{n}.json
    ├── teststeps/
    │   └── teststeps-{n}.json
    ├── testsets/
    │   └── testsets-{n}.json
    ├── testsettestcaseassignments/
    │   └── testsettestcaseassignments-{n}.json
    ├── requirementtestcaseassignments/
    │   └── requirementtestcaseassignments-{n}.json
    ├── objectlabels/
    │   ├── objectlabels-testcase-{n}.json
    │   ├── objectlabels-testset-{n}.json
    │   ├── objectlabels-requirement-{n}.json
    │   ├── objectlabels-testexecution-{n}.json
    │   └── objectlabels-testcaselog-{n}.json
    ├── customfieldvalues/
    │   ├── customfieldvalues-testcase-{n}.json
    │   └── customfieldvalues-requirement-{n}.json
    ├── customfieldlabels/
    │   └── customfieldlabels-{n}.json
    ├── customfielddefinitions/
    │   └── customfielddefinitions-{n}.json
    ├── attachments/
    │   ├── attachments-testexecution-{n}.json
    │   ├── attachments-requirement-{n}.json
    │   ├── attachments-testcaselog-{n}.json
    │   ├── attachments-teststeplog-{n}.json
    │   └── attachments-project-{n}.json
    ├── testexecutions/
    │   ├── testexecutions-Manual-Finished-{n}.json
    │   ├── testexecutions-Automated-Finished-{n}.json
    │   └── testexecutions-Mixed-Finished-{n}.json
    ├── testcaselogs/
    │   └── testcaselogs-{n}.json
    ├── teststeplogs/
    │   └── teststeplogs-{n}.json
    ├── testcaselog-assertions/
    │   └── testcaselogassertions-{n}.json
    ├── testcaselogresultoverrides/
    │   └── testcaselogresultoverrides-{n}.json
    ├── assertion-attachments/
    │   └── assertion-attachments-{n}.json
    ├── defects/
    │   └── defects-{n}.json
    ├── parameters/
    │   └── parameters-{n}.json
    ├── testsetpackages/
    │   └── testsetpackages-{n}.json
    ├── testsettestcaseparameters/
    │   └── testsettestcaseparameters-{n}.json
    ├── testsetschedules/
    │   └── testsetschedules-testset-{n}.json
    ├── objectfilters/
    │   └── objectfilters-testset-{n}.json
    ├── projectauthorization/
    │   └── projectauthorization-{n}.json
    ├── projectsettings/
    │   └── projectsettings.json         ← singular, no number suffix
    └── prompts/
        └── prompts-{n}.json
<package-name>.tmh               ← ZIP archive
├── manifest.json                ← Package metadata and object counts
└── objects/
    ├── requirements/
    │   └── requirements-{n}.json
    ├── testcases/
    │   └── testcases-{n}.json
    ├── teststeps/
    │   └── teststeps-{n}.json
    ├── testsets/
    │   └── testsets-{n}.json
    ├── testsettestcaseassignments/
    │   └── testsettestcaseassignments-{n}.json
    ├── requirementtestcaseassignments/
    │   └── requirementtestcaseassignments-{n}.json
    ├── objectlabels/
    │   ├── objectlabels-testcase-{n}.json
    │   ├── objectlabels-testset-{n}.json
    │   ├── objectlabels-requirement-{n}.json
    │   ├── objectlabels-testexecution-{n}.json
    │   └── objectlabels-testcaselog-{n}.json
    ├── customfieldvalues/
    │   ├── customfieldvalues-testcase-{n}.json
    │   └── customfieldvalues-requirement-{n}.json
    ├── customfieldlabels/
    │   └── customfieldlabels-{n}.json
    ├── customfielddefinitions/
    │   └── customfielddefinitions-{n}.json
    ├── attachments/
    │   ├── attachments-testexecution-{n}.json
    │   ├── attachments-requirement-{n}.json
    │   ├── attachments-testcaselog-{n}.json
    │   ├── attachments-teststeplog-{n}.json
    │   └── attachments-project-{n}.json
    ├── testexecutions/
    │   ├── testexecutions-Manual-Finished-{n}.json
    │   ├── testexecutions-Automated-Finished-{n}.json
    │   └── testexecutions-Mixed-Finished-{n}.json
    ├── testcaselogs/
    │   └── testcaselogs-{n}.json
    ├── teststeplogs/
    │   └── teststeplogs-{n}.json
    ├── testcaselog-assertions/
    │   └── testcaselogassertions-{n}.json
    ├── testcaselogresultoverrides/
    │   └── testcaselogresultoverrides-{n}.json
    ├── assertion-attachments/
    │   └── assertion-attachments-{n}.json
    ├── defects/
    │   └── defects-{n}.json
    ├── parameters/
    │   └── parameters-{n}.json
    ├── testsetpackages/
    │   └── testsetpackages-{n}.json
    ├── testsettestcaseparameters/
    │   └── testsettestcaseparameters-{n}.json
    ├── testsetschedules/
    │   └── testsetschedules-testset-{n}.json
    ├── objectfilters/
    │   └── objectfilters-testset-{n}.json
    ├── projectauthorization/
    │   └── projectauthorization-{n}.json
    ├── projectsettings/
    │   └── projectsettings.json         ← singular, no number suffix
    └── prompts/
        └── prompts-{n}.json
Remarque :

Seuls les types d’objet qui ont été réellement exportés sont présents. Les dossiers/fichiers manquants sont ignorés en mode silencieux lors de l’importation.

Conventions d'affectation de noms de fichiers

La plupart des types d’objets — blocs numérotés

Les fichiers sont nommés <type>-{n}.json{n} commence à 0 pour les exportations réelles produites par le système. Par exemple:

requirementtestcaseassignments-0.json
testcases-0.json
teststeps-0.json
requirementtestcaseassignments-0.json
testcases-0.json
teststeps-0.json

L'importation analyse tous les fichiers de chaque dossier, de sorte que la numérotation basée sur 0et basée sur 1fonctionne lors de la création personnalisée de fichiers.

Les exportations volumineuses peuvent être divisées en plusieurs fichiers (testcases-0.json, testcases-1.json, etc.) — l'importation lit tous les fichiers dans le dossier.

Astuce :

Pour des performances optimales, limitez chaque fichier à un maximum de 500 objets.

Noms de fichiers à l'échelle du type

Plusieurs types d'objet étendent leurs fichiers par le type d'objet auquel ils appartiennent. L’importation lit tous les fichiers du dossier, quel que soit le qualificatif, mais les exportations réelles utilisent toujours ces noms:

Type d'objetModèle de nom de fichier
ÉtiquetteObjets (ObjectLabels)objectlabels-testcase-{n}.json, objectlabels-testset-{n}.json, objectlabels-requirement-{n}.json,...
ValeursChampPersonnalisé (CustomFieldValues)customfieldvalues-testcase-{n}.json, customfieldvalues-requirement-{n}.json
Pièces jointes (Attachments)attachments-testexecution-{n}.json, attachments-requirement-{n}.json,…
Exécutions de testtestexecutions-Manual-Finished-{n}.json, testexecutions-Automated-Finished-{n}.json,…
Filtres d’objetsobjectfilters-testset-{n}.json
Planifications de l'ensemble de teststestsetschedules-testset-{n}.json

Paramètres du projet — aucun suffixe numérique

projectsettings/projectsettings.json
projectsettings/projectsettings.json

Ce fichier est toujours unique (aucun numéro de segment).

Exigences d’encodage

Tous les fichiers JSON doivent être encodés en UTF-8 sans BOM.

Avertissement :

Le Set-Content -Encoding utf8 de PowerShell 5.1 écrit un BOM UTF-8 (EF BB BF). Cela amène JSON.parse dans le navigateur à lancer SyntaxError: Unexpected token à la position 0. Utilisez toujours [System.IO.File]::WriteAllText($path, $content, (New-Object System.Text.UTF8Encoding($false))) lors de la création de fichiers .tmh à partir de PowerShell.

Contrôle de version du schéma

Le manifest.json comporte un champ schemaVersion (par exemple, "1.0.16"). L'importation utilise cette version avec les attributs [IntroducedIn] sur chaque propriété DTO pour déterminer les champs à lire. Les champs introduits dans une version plus récente que la version du schéma du package sont ignorés lors de la désérialisation.

Dernière version actuelle: 1.0.16

Résumé de l’historique des versions:

VersionAjouts notables
1.0.0Initial: exigences, cas de test, étapes de test, ensembles de test, affectations, libellés, pièces jointes, défauts, valeurs de champ personnalisés
1.0.1preCondition sur les cas de test
1.0.2Exécutions de test, remplacements des résultats du journal de cas de test, assertions
1.0.4Exportation du sous-ensemble (isSubsetExport, exportSubsetDetails)
1.0.5Libellés de champ personnalisé
1.0.7Invites définies par l’utilisateur
1.0.9postCondition sur les cas de test
1.0.10Paramètres
1.0.11Packages d’ensembles de tests, folderKey/folderName sur les ensembles de tests, packageEntryPointUniqueId , etc. sur les cas de test
1.0.13id champ sur les pièces jointes
1.0.14studioWebFileId/studioWebProjectId sur les cas de test; id sur les affectations d’ensembles de tests/de cas de test
1.0.15assigneeEmail sur les affectations d’ensembles de tests/de cas de test
1.0.16Configuration du projet (paramètres, gouvernance, signataires), définitions de champs personnalisés, autorisations de projet

manifeste.json

Situé à la racine de l'archive (pas à l'intérieur de objects/).

{
  "objectCountDetails": {
    "testCases": 5,
    "testSets": 2,
    "requirements": 3,
    "objectLabels": 0,
    "attachments": 0,
    "testExecutions": 0,
    "testCaseLogs": 0,
    "testCaseResultOverrides": 0,
    "testSteps": 12,
    "testStepLogs": 0,
    "testSetTestCaseAssignments": 6,
    "requirementTestCaseAssignments": 4,
    "defects": 0,
    "customFieldValues": 0,
    "customFieldLabels": 0,
    "assertions": 0,
    "assertionScreenshots": 0,
    "testSetLabelFilters": 0,
    "userDefinedPrompts": 0,
    "parameters": 0,
    "testSetPackages": 0,
    "testSetTestCaseParameters": 0,
    "customFieldDefinitions": 0,
    "projectAuthorizations": 0
  },
  "project": {
    "name": "My Project",
    "description": "Project description",
    "projectPrefix": "MP"
  },
  "tmPackageId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "schemaVersion": "1.0.16"
}
{
  "objectCountDetails": {
    "testCases": 5,
    "testSets": 2,
    "requirements": 3,
    "objectLabels": 0,
    "attachments": 0,
    "testExecutions": 0,
    "testCaseLogs": 0,
    "testCaseResultOverrides": 0,
    "testSteps": 12,
    "testStepLogs": 0,
    "testSetTestCaseAssignments": 6,
    "requirementTestCaseAssignments": 4,
    "defects": 0,
    "customFieldValues": 0,
    "customFieldLabels": 0,
    "assertions": 0,
    "assertionScreenshots": 0,
    "testSetLabelFilters": 0,
    "userDefinedPrompts": 0,
    "parameters": 0,
    "testSetPackages": 0,
    "testSetTestCaseParameters": 0,
    "customFieldDefinitions": 0,
    "projectAuthorizations": 0
  },
  "project": {
    "name": "My Project",
    "description": "Project description",
    "projectPrefix": "MP"
  },
  "tmPackageId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "schemaVersion": "1.0.16"
}
Remarque :

Les exportations réelles incluent également un champ packageName (le nom de fichier de téléchargement suggéré). L'importation l'ignore - omettez-la dans les fichiers créés à la main.

objets/ — Schémas de fichiers JSON

Chaque fichier d'objet utilise un objet wrapper dont la propriété unique est un tableau JSON. Le tableau contient les enregistrements d'objets individuels.

exigences/{n} fichier(s).json

{
  "requirements": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "User can log in",
      "description": "The login form must accept valid credentials.",
      "foreignRef": "",
      "connectorRequirementId": "00000000-0000-0000-0000-000000000000"
    }
  ]
}
{
  "requirements": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "User can log in",
      "description": "The login form must accept valid credentials.",
      "foreignRef": "",
      "connectorRequirementId": "00000000-0000-0000-0000-000000000000"
    }
  ]
}
ChampSaisie de texteRemarques
idChaîne GUIDIdentifiant unique par exigence
namestringRequis; 255 caractères maximum
descriptionstringPeut être une chaîne de caractères vide
foreignRefstringRéférence système externe; peut être vide
connectorRequirementIdChaîne GUIDUtilisez "00000000-0000-0000-0000-000000000000" lorsqu'il n'est pas lié à un connecteur

cas de test/{n} fichier JSON

{
  "testCases": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440001",
      "version": null,
      "name": "Verify login with valid credentials",
      "inputParams": null,
      "description": "",
      "automationId": null,
      "automationTestCaseName": null,
      "automationProjectName": null,
      "foreignRef": "",
      "connectorTestCaseId": null,
      "preCondition": null,
      "postCondition": null,
      "packageEntryPointUniqueId": null,
      "packageIdentifier": null,
      "packageEntryPointName": null,
      "feedId": null,
      "packageSourceName": null,
      "studioWebFileId": null,
      "studioWebProjectId": null
    }
  ]
}
{
  "testCases": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440001",
      "version": null,
      "name": "Verify login with valid credentials",
      "inputParams": null,
      "description": "",
      "automationId": null,
      "automationTestCaseName": null,
      "automationProjectName": null,
      "foreignRef": "",
      "connectorTestCaseId": null,
      "preCondition": null,
      "postCondition": null,
      "packageEntryPointUniqueId": null,
      "packageIdentifier": null,
      "packageEntryPointName": null,
      "feedId": null,
      "packageSourceName": null,
      "studioWebFileId": null,
      "studioWebProjectId": null
    }
  ]
}
ChampSaisie de texteRemarques
idChaîne GUIDUnique par cas de test
versionchaîne | Nullnull pour les cas de test manuels; "1.0.0" pour les cas de test automatisés liés à une version de package; "" pour les cas de test automatisés sans version fixe
namestringRequis; 255 caractères maximum
inputParamschaîne | NullParamètres d'entrée encodés en JSON; null pour le manuel
descriptionstringDescription en texte enrichi; "" en cas d'absence
automationIdchaîne | NullIdentifiant d'automatisation UiPath; null pour le manuel
automationTestCaseNamechaîne | NullNom complet de l’automatisation; null pour le manuel
automationProjectNamechaîne | NullProjet d'automatisation; null pour le manuel
foreignRefstringRéférence système externe; "" en cas d'absence
connectorTestCaseIdchaîne | NullID système du connecteur; null en cas d'absence
preConditionchaîne | nul (v1.0.1+)Texte de précondition; null si absent; 8 000 caractères maximum
postConditionchaîne | nul (v1.0.9+)Texte post-condition; null si absent; 8 000 caractères maximum
packageEntryPointUniqueIdchaîne | nul (v1.0.11+)GUID du point d'entrée du package; null pour le manuel
packageIdentifierchaîne | nul (v1.0.11+)ID de package; null pour le manuel
packageEntryPointNamechaîne | nul (v1.0.11+)Nom du point d'entrée; null pour le manuel
feedIdchaîne | nul (v1.0.11+)ID de flux de package; null pour le manuel
packageSourceNamechaîne | nul (v1.0.11+)Nom de la source du package; null pour le manuel
studioWebFileIdchaîne | nul (v1.0.14+)ID de fichier Studio Web; null pour le manuel
studioWebProjectIdchaîne | nul (v1.0.14+)ID de projet Studio Web; null pour le manuel

teststeps/{n} fichier(s).json

{
  "testSteps": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440010",
      "testCaseId": "550e8400-e29b-41d4-a716-446655440001",
      "orderNo": 0,
      "actionType": null,
      "description": "Navigate to the login page",
      "expectedResult": "Login page is displayed",
      "clipboardData": ""
    }
  ]
}
{
  "testSteps": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440010",
      "testCaseId": "550e8400-e29b-41d4-a716-446655440001",
      "orderNo": 0,
      "actionType": null,
      "description": "Navigate to the login page",
      "expectedResult": "Login page is displayed",
      "clipboardData": ""
    }
  ]
}
ChampSaisie de texteRemarques
idChaîne GUIDUnique par étape
testCaseIdChaîne GUIDDoit référencer un cas de test existant id
orderNoIntegerOrdre d'affichage basé sur 0 (première étape = 0)
actionTypechaîne | Nullnull pour les étapes manuelles
descriptionstringTexte d'action de l'étape
expectedResultstringRésultat attendu; "" en cas d'absence
clipboardDatastringDonnées du presse-papiers/capture d’écran; 8 000 caractères maximum; Généralement ""

ensembles de tests/{n} fichier(s).json

{
  "testSets": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440020",
      "version": null,
      "name": "Regression Suite",
      "description": "",
      "source": "TestManager",
      "externalTestSetId": null,
      "sourceDetails": null,
      "folderKey": null,
      "folderName": ""
    }
  ]
}
{
  "testSets": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440020",
      "version": null,
      "name": "Regression Suite",
      "description": "",
      "source": "TestManager",
      "externalTestSetId": null,
      "sourceDetails": null,
      "folderKey": null,
      "folderName": ""
    }
  ]
}
ChampSaisie de texteRemarques
idChaîne GUIDUnique par ensemble de tests
versionchaîne | Nullnull pour les ensembles de tests gérés par Test Manager
namestringRequis; 255 caractères maximum
descriptionstring"" en cas d'absence
sourcestring"TestManager" (par défaut) ou "Orchestrator"il s'agit d'une chaîne, pas un entier
externalTestSetIdchaîne | NullID externe lorsque source est "Orchestrator"; null sinon
sourceDetailschaîne | NullMétadonnées source supplémentaires; null en cas d'absence
folderKeychaîne | nul (v1.0.11+)Clé de dossier UiPath Orchestrator; null si non lié
folderNamechaîne (v1.0.11+)Nom complet du dossier; "" si non lié; non stocké dans la base de données, à titre informatif uniquement

affectations de cas de test.json

{
  "testSetTestCaseAssignments": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440030",
      "testSetId": "550e8400-e29b-41d4-a716-446655440020",
      "testCaseId": "550e8400-e29b-41d4-a716-446655440001",
      "assigneeEmail": null
    }
  ]
}
{
  "testSetTestCaseAssignments": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440030",
      "testSetId": "550e8400-e29b-41d4-a716-446655440020",
      "testCaseId": "550e8400-e29b-41d4-a716-446655440001",
      "assigneeEmail": null
    }
  ]
}
ChampSaisie de texteRemarques
idChaîne GUID (v1.0.14+)Identifiant de l'affectation
testSetIdChaîne GUIDFait référence à un ensemble de tests id
testCaseIdChaîne GUIDFait référence à un cas de test id
assigneeEmailchaîne | nul (v1.0.15+)Adresse e-mail du bénéficiaire; null si désaffecté

affectations de cas de test/{n}.json

{
  "requirementTestCaseAssignments": [
    {
      "requirementId": "550e8400-e29b-41d4-a716-446655440000",
      "testCaseId": "550e8400-e29b-41d4-a716-446655440001"
    }
  ]
}
{
  "requirementTestCaseAssignments": [
    {
      "requirementId": "550e8400-e29b-41d4-a716-446655440000",
      "testCaseId": "550e8400-e29b-41d4-a716-446655440001"
    }
  ]
}
Avertissement :

Aucun champ id . Contrairement à la plupart des autres types d’objet, les affectations de cas de test d’exigence n’ont que requirementId et testCaseId.

objectLabels/ObjectLabels-{objecttype}-{n}.json

Remarque :

Nom du fichier: les exportations réelles utilisent un nom qualifié pour le type tel que objectlabels-testcase-1.json, objectlabels-testset-1.json, objectlabels-requirement-1.json, etc. L'importation lit tous les fichiers dans le dossier objectlabels/ , de sorte que le qualificatif n'est pas strictement requis lors de la création personnalisée de fichiers, mais il est recommandé de suivre la convention.

{
  "objectLabels": [
    {
      "objectId": "550e8400-e29b-41d4-a716-446655440001",
      "name": "regression",
      "description": "",
      "labelType": 0,
      "objectType": "TestCase"
    }
  ]
}
{
  "objectLabels": [
    {
      "objectId": "550e8400-e29b-41d4-a716-446655440001",
      "name": "regression",
      "description": "",
      "labelType": 0,
      "objectType": "TestCase"
    }
  ]
}
ChampSaisie de texteRemarques
objectIdChaîne GUIDID de l’objet labellisé
namestringTexte du libellé
descriptionstringDescription du libellé; "" en cas d'absence
labelTypeInteger1 = libellé système (par ex. "manual", "automated"); 0 = libellé défini par l'utilisateur
objectTypestring"TestCase", "TestSet", "Requirement", "TestExecution", "TestCaseLog"

valeurs de champ personnalisé/{n} fichier.json

{
  "customFieldValues": [
    {
      "objectId": "550e8400-e29b-41d4-a716-446655440001",
      "objectType": "TestCase",
      "fieldName": "Priority",
      "fieldValue": "High"
    }
  ]
}
{
  "customFieldValues": [
    {
      "objectId": "550e8400-e29b-41d4-a716-446655440001",
      "objectType": "TestCase",
      "fieldName": "Priority",
      "fieldValue": "High"
    }
  ]
}

Paramètres du projet/paramètres du projet JSON

Introduit dans la version de schéma 1.0.16. Présent uniquement lorsque l’option « Exporter la configuration du projet » est activée.

{
  "projectTimeZone": "Europe/Vienna",
  "folderKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "governanceEnabled": true,
  "governedByDefault": false,
  "signatories": [
    {
      "signatoryId": "550e8400-e29b-41d4-a716-446655440099",
      "signatoryType": 0,
      "signatoryLastKnownDetails": "john.doe@company.com"
    }
  ]
}
{
  "projectTimeZone": "Europe/Vienna",
  "folderKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "governanceEnabled": true,
  "governedByDefault": false,
  "signatories": [
    {
      "signatoryId": "550e8400-e29b-41d4-a716-446655440099",
      "signatoryType": 0,
      "signatoryLastKnownDetails": "john.doe@company.com"
    }
  ]
}
Remarque :

Contrairement à tous les autres fichiers d'objet, projectsettings.json est un objet direct (et non un tableau de wrapper). Le fichier contient un objet JSON plate unique.

ChampSaisie de texteRemarques
projectTimeZonechaîne | NullChaîne de fuseau horaire IANA (par exemple, "Europe/Vienna")
folderKeyGUID | NullDossier Orchestrator lié
governanceEnabledbooléen | NullIndique si la gouvernance est activée pour le projet
governedByDefaultbooléen | NullIndique si les nouveaux cas de test sont régis par défaut
signatoriestableau | NullListe des approbateurs/signataires
signatories[].signatoryIdGUIDID d’utilisateur ou de groupe
signatories[].signatoryTypeInteger0 = Utilisateur, 1 = GroupeUtilisateurs
signatories[].signatoryLastKnownDetailsstringNom ou e-mail affiché au moment de l’exportation
Remarque :

lastDisabledAt (l'horodatage de désactivation de la gouvernance) est intentionnellement exclu de l'exportation — il s'agit d'un horodatage interne qui n'est pas significatif pour un projet réimporté.

Règles et contraintes

  1. Tous les ID doivent être des GUID uniques et valides. Ne réutilisez pas les ID entre des objets de type même ou différent.

  2. Les références croisées doivent se résoudre. Un testCaseId dans une étape ou une affectation de test doit faire référence à un cas de test id présent dans le même package.

  3. Les objets wrapper sont requis. Même lorsque la collection contient un élément, elle doit toujours être encapsulée: { "testCases": [ {...} ] } et jamais un tableau ou un objet à barres.

  4. Conventionsnull vs "" : utilisez null pour les champs facultatifs qui sont réellement absents (par ex. automationId, inputParams, preCondition, connectorTestCaseId, tous les package* champs des cas de test manuels). Utilisez "" uniquement pour les champs qui sont toujours présents sous forme de chaînes mais qui sont vides (par ex. foreignRef, description, clipboardData). Leur combinaison, en particulier l'utilisation ""null est attendu, peut entraîner des échecs d'importation silencieux.

  5. objectCountDetails dans le manifeste doit correspondre au nombre réel d'objets présents, mais l'importation ne valide pas strictement les comptes - les incompatibilités n'affectent que l'affichage du résumé avant l'importation.

  6. Le format UTF-8 sans BOM est obligatoire pour tous les fichiers.

Fichier TMH valide minimum (créé à la main)

Le plus petit fichier .tmh valide que Test Manager acceptera contient simplement un manifest.json:

{
  "objectCountDetails": { ... },
  "project": { "name": "Test Project", "description": "", "projectPrefix": "TP" },
  "tmPackageId": "<new-guid>",
  "schemaVersion": "1.0.16"
}
{
  "objectCountDetails": { ... },
  "project": { "name": "Test Project", "description": "", "projectPrefix": "TP" },
  "tmPackageId": "<new-guid>",
  "schemaVersion": "1.0.16"
}

Tous les sous-répertoires objects/ sont facultatifs. L'importation ignore silencieusement tout type d'objet absent de l'archive.

Cette page vous a-t-elle été utile ?

Connecter

Besoin d'aide ? Assistance

Vous souhaitez apprendre ? UiPath Academy

Vous avez des questions ? UiPath Forum

Rester à jour