- Démarrage
- Gestion de projet
- Documents
- Travailler avec l’analyse de l’impact des modifications
- Créer des scénarios de test
- Affectation de cas de test aux exigences.
- Clonage des cas de test
- Exporter des cas de test
- Lier des cas de test à Test Manager dans Studio
- Delete test cases
- Cas de test manuels
- Importer des cas de test manuels
- Documenter les cas de test avec Task Capture
- Paramètres
- Activation de la gouvernance au niveau du projet
- Désactivation de la gouvernance au niveau du projet
- Activation de la gouvernance au niveau des cas de test
- Désactivation de la gouvernance au niveau du cas de test
- Gérer les approbateurs pour les cas de test régis
- Gérer les cas de test régis à l’état En cours
- Gérer les cas de test régis à l’état En révision
- Gérer les objets régis à l'état Signé
- Gérer les commentaires pour les cas de test régis
- Appliquer des filtres et des vues
- Importer des ensembles de test Orchestrator
- Creating test sets
- Ajouter des cas de test à un ensemble de test
- Attribuer des utilisateurs par défaut dans l'exécution de l'ensemble de tests
- Activation de la couverture des activités
- Activer Healing Agent
- Configuration d'ensembles de test pour des dossiers et des robots d'exécution spécifiques
- Remplacer les paramètres
- Cloner des ensembles de tests
- Exporter des ensembles de tests
- Appliquer des filtres et des vues
- FAQ - Parité des fonctionnalités - Test Manager vs Orchestrator
- Exécution de tests manuels
- Exécuter des tests automatisés
- Exécuter des cas de test sans ensemble de tests
- Exécuter des tests mixtes
- Créer des exécutions en attente
- Appliquer un ordre d’exécution
- Réexécution des exécutions de test
- Planification des exécutions
- Résoudre les problèmes des exécutions automatisées
- Tests d'accessibilité pour Test Cloud
- Rechercher avec Autopilot
- Opérations et utilitaires de projet
- Paramètres de Test Manager
- Intégration de l'outil de gestion du cycle de vie des applications (ALM)
- Intégration de l'API
- Résolution des problèmes
Guide de l'utilisateur de Test Manager
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
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 où {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.
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'objet | Modè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 test | testexecutions-Manual-Finished-{n}.json, testexecutions-Automated-Finished-{n}.json,… |
| Filtres d’objets | objectfilters-testset-{n}.json |
| Planifications de l'ensemble de tests | testsetschedules-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.
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:
| Version | Ajouts notables |
|---|---|
1.0.0 | Initial: 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.1 | preCondition sur les cas de test |
1.0.2 | Exécutions de test, remplacements des résultats du journal de cas de test, assertions |
1.0.4 | Exportation du sous-ensemble (isSubsetExport, exportSubsetDetails) |
1.0.5 | Libellés de champ personnalisé |
1.0.7 | Invites définies par l’utilisateur |
1.0.9 | postCondition sur les cas de test |
1.0.10 | Paramètres |
1.0.11 | Packages d’ensembles de tests, folderKey/folderName sur les ensembles de tests, packageEntryPointUniqueId , etc. sur les cas de test |
1.0.13 | id champ sur les pièces jointes |
1.0.14 | studioWebFileId/studioWebProjectId sur les cas de test; id sur les affectations d’ensembles de tests/de cas de test |
1.0.15 | assigneeEmail sur les affectations d’ensembles de tests/de cas de test |
1.0.16 | Configuration 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"
}
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"
}
]
}
| Champ | Saisie de texte | Remarques |
|---|---|---|
id | Chaîne GUID | Identifiant unique par exigence |
name | string | Requis; 255 caractères maximum |
description | string | Peut être une chaîne de caractères vide |
foreignRef | string | Référence système externe; peut être vide |
connectorRequirementId | Chaîne GUID | Utilisez "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
}
]
}
| Champ | Saisie de texte | Remarques |
|---|---|---|
id | Chaîne GUID | Unique par cas de test |
version | chaîne | Null | null 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 |
name | string | Requis; 255 caractères maximum |
inputParams | chaîne | Null | Paramètres d'entrée encodés en JSON; null pour le manuel |
description | string | Description en texte enrichi; "" en cas d'absence |
automationId | chaîne | Null | Identifiant d'automatisation UiPath; null pour le manuel |
automationTestCaseName | chaîne | Null | Nom complet de l’automatisation; null pour le manuel |
automationProjectName | chaîne | Null | Projet d'automatisation; null pour le manuel |
foreignRef | string | Référence système externe; "" en cas d'absence |
connectorTestCaseId | chaîne | Null | ID système du connecteur; null en cas d'absence |
preCondition | chaîne | nul (v1.0.1+) | Texte de précondition; null si absent; 8 000 caractères maximum |
postCondition | chaîne | nul (v1.0.9+) | Texte post-condition; null si absent; 8 000 caractères maximum |
packageEntryPointUniqueId | chaîne | nul (v1.0.11+) | GUID du point d'entrée du package; null pour le manuel |
packageIdentifier | chaîne | nul (v1.0.11+) | ID de package; null pour le manuel |
packageEntryPointName | chaîne | nul (v1.0.11+) | Nom du point d'entrée; null pour le manuel |
feedId | chaîne | nul (v1.0.11+) | ID de flux de package; null pour le manuel |
packageSourceName | chaîne | nul (v1.0.11+) | Nom de la source du package; null pour le manuel |
studioWebFileId | chaîne | nul (v1.0.14+) | ID de fichier Studio Web; null pour le manuel |
studioWebProjectId | chaî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": ""
}
]
}
| Champ | Saisie de texte | Remarques |
|---|---|---|
id | Chaîne GUID | Unique par étape |
testCaseId | Chaîne GUID | Doit référencer un cas de test existant id |
orderNo | Integer | Ordre d'affichage basé sur 0 (première étape = 0) |
actionType | chaîne | Null | null pour les étapes manuelles |
description | string | Texte d'action de l'étape |
expectedResult | string | Résultat attendu; "" en cas d'absence |
clipboardData | string | Donné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": ""
}
]
}
| Champ | Saisie de texte | Remarques |
|---|---|---|
id | Chaîne GUID | Unique par ensemble de tests |
version | chaîne | Null | null pour les ensembles de tests gérés par Test Manager |
name | string | Requis; 255 caractères maximum |
description | string | "" en cas d'absence |
source | string | "TestManager" (par défaut) ou "Orchestrator" — il s'agit d'une chaîne, pas un entier |
externalTestSetId | chaîne | Null | ID externe lorsque source est "Orchestrator"; null sinon |
sourceDetails | chaîne | Null | Métadonnées source supplémentaires; null en cas d'absence |
folderKey | chaîne | nul (v1.0.11+) | Clé de dossier UiPath Orchestrator; null si non lié |
folderName | chaî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
}
]
}
| Champ | Saisie de texte | Remarques |
|---|---|---|
id | Chaîne GUID (v1.0.14+) | Identifiant de l'affectation |
testSetId | Chaîne GUID | Fait référence à un ensemble de tests id |
testCaseId | Chaîne GUID | Fait référence à un cas de test id |
assigneeEmail | chaî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"
}
]
}
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
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"
}
]
}
| Champ | Saisie de texte | Remarques |
|---|---|---|
objectId | Chaîne GUID | ID de l’objet labellisé |
name | string | Texte du libellé |
description | string | Description du libellé; "" en cas d'absence |
labelType | Integer | 1 = libellé système (par ex. "manual", "automated"); 0 = libellé défini par l'utilisateur |
objectType | string | "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"
}
]
}
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.
| Champ | Saisie de texte | Remarques |
|---|---|---|
projectTimeZone | chaîne | Null | Chaîne de fuseau horaire IANA (par exemple, "Europe/Vienna") |
folderKey | GUID | Null | Dossier Orchestrator lié |
governanceEnabled | booléen | Null | Indique si la gouvernance est activée pour le projet |
governedByDefault | booléen | Null | Indique si les nouveaux cas de test sont régis par défaut |
signatories | tableau | Null | Liste des approbateurs/signataires |
signatories[].signatoryId | GUID | ID d’utilisateur ou de groupe |
signatories[].signatoryType | Integer | 0 = Utilisateur, 1 = GroupeUtilisateurs |
signatories[].signatoryLastKnownDetails | string | Nom ou e-mail affiché au moment de l’exportation |
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
-
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.
-
Les références croisées doivent se résoudre. Un
testCaseIddans une étape ou une affectation de test doit faire référence à un cas de testidprésent dans le même package. -
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. -
Conventions
nullvs"": utiliseznullpour les champs facultatifs qui sont réellement absents (par ex.automationId,inputParams,preCondition,connectorTestCaseId, tous lespackage*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""oùnullest attendu, peut entraîner des échecs d'importation silencieux. -
objectCountDetailsdans 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. -
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.
- Archiver la structure
- Conventions d'affectation de noms de fichiers
- La plupart des types d’objets — blocs numérotés
- Noms de fichiers à l'échelle du type
- Paramètres du projet — aucun suffixe numérique
- Exigences d’encodage
- Contrôle de version du schéma
- manifeste.json
- objets/ — Schémas de fichiers JSON
- exigences/{n} fichier(s).json
- cas de test/{n} fichier JSON
- teststeps/{n} fichier(s).json
- ensembles de tests/{n} fichier(s).json
- affectations de cas de test.json
- affectations de cas de test/{n}.json
- objectLabels/ObjectLabels-{objecttype}-{n}.json
- valeurs de champ personnalisé/{n} fichier.json
- Paramètres du projet/paramètres du projet JSON
- Règles et contraintes
- Fichier TMH valide minimum (créé à la main)