- Primeros pasos
- Gestión de proyecto
- Documentos
- Trabajo con el análisis de impacto de cambios
- Creación de casos de prueba
- Asignar Casos de prueba a los Requisitos
- Clonación de casos de prueba
- Exportar casos de prueba
- Vincular casos de prueba en Studio a Test Manager
- Delete test cases
- Casos de prueba manuales
- Importar casos de prueba manuales
- Documentar casos de prueba con Task Capture
- Parámetros
- Habilitar la gobernanza a nivel de proyecto
- Deshabilitar la gobernanza a nivel de proyecto
- Habilitar el control a nivel de caso de prueba
- Deshabilitar el control a nivel de caso de prueba
- Gestionar aprobadores para casos de prueba controlados
- Gestionar casos de prueba gobernados en el estado En trabajo
- Gestionar casos de prueba controlados en el estado En revisión
- Gestionar objetos controlados en estado Firmado
- Gestionar comentarios para casos de prueba controlados
- Aplicar filtros y vistas
- Importar conjuntos de pruebas de Orchestrator
- Creating test sets
- Añadir casos de prueba a un conjunto de pruebas
- Asignar usuarios predeterminados en la ejecución del conjunto de pruebas
- Habilitación de la cobertura de actividad
- Habilitar Healing Agent
- Configurar conjuntos de pruebas para carpetas de ejecución y robots específicos
- Anular parámetros
- Clonación de conjuntos de pruebas
- Exportar conjuntos de pruebas
- Aplicar filtros y vistas
- Preguntas frecuentes: paridad de características: Test Manager frente a Orchestrator
- Ejecución de pruebas manuales
- Ejecución de pruebas automatizadas
- Ejecutar casos de prueba sin un conjunto de pruebas
- Ejecutar pruebas mixtas
- Crear ejecuciones pendientes
- Aplicar una orden de ejecución
- Volver a ejecutar ejecuciones de prueba
- Programar ejecuciones
- Solución de problemas de ejecuciones automatizadas
- Pruebas de accesibilidad para Test Cloud
- Buscar con Autopilot
- Operaciones y utilidades del proyecto
- Configuración de Test Manager
- Configuración del nivel de tenant
- Gestión de acceso de usuario y grupo
- Búsqueda de Autopilot
- Campos personalizados
- Biblioteca de solicitudes
- Configuración general del proyecto
- Configuración del proyecto de automatización
- Mis notificaciones
- Cifrado de claves administradas por el cliente
- Registros de auditoría
- Integración de herramientas de ALM
- Integración de API
- Solución de problemas
Guía de usuario de Test Manager
Un archivo .tmh es el formato de copia de seguridad/migración del proyecto utilizado por UiPath Test Manager. Este documento describe su estructura, contenido y requisitos de codificación en detalle.
Estructura del archivo
<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
Solo están presentes los tipos de objetos que se exportaron realmente. Las carpetas/archivos que faltan se omiten de forma silenciosa durante la importación.
Convenciones de nomenclatura de archivos
La mayoría de los tipos de objetos: fragmentos numerados
Los archivos se nombran <type>-{n}.json donde {n} comienza en 0 para exportaciones reales producidas por el sistema. Por ejemplo:
requirementtestcaseassignments-0.json
testcases-0.json
teststeps-0.json
requirementtestcaseassignments-0.json
testcases-0.json
teststeps-0.json
El importador escanea todos los archivos en cada carpeta, por lo que tanto la numeración basada en 0como la basada en 1funcionan al crear archivos manualmente.
Las exportaciones grandes pueden dividirse en varios archivos (testcases-0.json, testcases-1.json, etc.): el importador lee todos los archivos de la carpeta.
Para un rendimiento óptimo, limita cada archivo a un máximo de 500 objetos.
Nombres de archivo de ámbito de tipo
Varios tipos de objetos delimitan sus archivos por el tipo de objeto al que pertenecen. El importador lee todos los archivos de la carpeta independientemente del calificador, pero las exportaciones reales siempre utilizan estos nombres:
| Tipo de objeto | Patrón de nombre de archivo |
|---|---|
| ObjectLabels | objectlabels-testcase-{n}.json, objectlabels-testset-{n}.json, objectlabels-requirement-{n}.json, … |
| CustomFieldValues | customfieldvalues-testcase-{n}.json, customfieldvalues-requirement-{n}.json |
| Archivos adjuntos | attachments-testexecution-{n}.json, attachments-requirement-{n}.json, … |
| Ejecución de prueba | testexecutions-Manual-Finished-{n}.json, testexecutions-Automated-Finished-{n}.json, … |
| Filtros de objetos | objectfilters-testset-{n}.json |
| Programaciones de conjuntos de prueba | testsetschedules-testset-{n}.json |
Configuración del proyecto: sin sufijo numérico
projectsettings/projectsettings.json
projectsettings/projectsettings.json
Este archivo siempre es singular (sin número de fragmento).
Requisitos de codificación
Todos los archivos JSON deben codificarse como UTF-8 sin BOM.
El Set-Content -Encoding utf8 de PowerShell 5.1 escribe un BOM UTF-8 (EF BB BF). Esto hace que JSON.parse en el navegador arroje SyntaxError: Unexpected token en la posición 0. Usa siempre [System.IO.File]::WriteAllText($path, $content, (New-Object System.Text.UTF8Encoding($false))) al crear archivos .tmh desde PowerShell.
Versiones del esquema
El manifest.json lleva un campo schemaVersion (por ejemplo, "1.0.16"). El importador utiliza esta versión junto con los atributos [IntroducedIn] en cada propiedad DTO para determinar qué campos leer. Los campos introducidos en una versión más reciente que la versión del esquema del paquete se ignoran durante la deserialización.
Última versión actual: 1.0.16
Resumen del historial de versiones:
| Versión | Adiciones notables |
|---|---|
1.0.0 | Inicial: requisitos, casos de prueba, pasos de prueba, conjuntos de pruebas, asignaciones, etiquetas, archivos adjuntos, defectos, valores de campo personalizados |
1.0.1 | preCondition en casos de prueba |
1.0.2 | Ejecuciones de prueba, anulaciones de resultados de registro de casos de prueba, aserciones |
1.0.4 | Exportación de subconjunto (isSubsetExport, exportSubsetDetails) |
1.0.5 | Etiquetas de campo personalizadas |
1.0.7 | Solicitudes definidas por el usuario |
1.0.9 | postCondition en casos de prueba |
1.0.10 | Parámetros |
1.0.11 | Paquetes de conjuntos de pruebas, folderKey/folderName en conjuntos de pruebas, packageEntryPointUniqueId etc. en casos de prueba |
1.0.13 | id campo en archivos adjuntos |
1.0.14 | studioWebFileId/studioWebProjectId en casos de prueba; id en asignaciones de conjuntos de pruebas/casos de prueba |
1.0.15 | assigneeEmail en asignaciones de conjuntos de pruebas/casos de prueba |
1.0.16 | Configuración del proyecto (configuración, gobernanza, firmantes), definiciones de campo personalizadas, autorizaciones de proyecto |
manifest.json
Ubicado en la raíz del archivo (no dentro 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"
}
Las exportaciones reales también incluyen un campo packageName (el nombre de archivo de descarga sugerido). El importador lo ignora: omítelo en archivos hechos a mano.
object/ — Esquemas de archivo JSON
Cada archivo de objeto utiliza un objeto contenedor cuya única propiedad es una matriz JSON. La matriz contiene los registros de objetos individuales.
requisitos/{n}.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"
}
]
}
| Campo | Tipo | Notas |
|---|---|---|
id | Cadena GUID | Identificador único por requisito |
name | String | Obligatorio; 255 caracteres como máximo |
description | String | Puede ser una cadena vacía |
foreignRef | String | Referencia del sistema externo; puede estar vacío |
connectorRequirementId | Cadena GUID | Usar "00000000-0000-0000-0000-000000000000" cuando no esté vinculado a un conector |
casos de prueba/{n}.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
}
]
}
| Campo | Tipo | Notas |
|---|---|---|
id | Cadena GUID | Único por caso de prueba |
version | cadena | nulo | null para casos de prueba manuales; "1.0.0" para casos de prueba automatizados vinculados a una versión de paquete; "" para casos de prueba automatizados sin una versión fija |
name | String | Obligatorio; 255 caracteres como máximo |
inputParams | cadena | nulo | Parámetros de entrada codificados en JSON; null para manual |
description | String | Descripción de texto enriquecido; "" cuando está ausente |
automationId | cadena | nulo | identificador de automatización de UiPath; null para manual |
automationTestCaseName | cadena | nulo | Nombre para mostrar de la automatización; null para manual |
automationProjectName | cadena | nulo | Proyecto de automatización; null para manual |
foreignRef | String | Referencia del sistema externo; "" cuando está ausente |
connectorTestCaseId | cadena | nulo | ID del sistema del conector; null cuando está ausente |
preCondition | cadena | nulo (v1.0.1+) | Texto de condición previa; null cuando está ausente; 8000 caracteres como máximo |
postCondition | cadena | nulo (v1.0.9+) | Texto de condición posterior; null cuando está ausente; 8000 caracteres como máximo |
packageEntryPointUniqueId | cadena | null (v1.0.11+) | GUID del punto de entrada del paquete; null para manual |
packageIdentifier | cadena | null (v1.0.11+) | ID del paquete; null para manual |
packageEntryPointName | cadena | null (v1.0.11+) | Nombre del punto de entrada; null para manual |
feedId | cadena | null (v1.0.11+) | ID de la fuente del paquete; null para manual |
packageSourceName | cadena | null (v1.0.11+) | Nombre de origen del paquete; null para manual |
studioWebFileId | cadena | null (v1.0.14+) | ID de archivo de Studio Web; null para manual |
studioWebProjectId | cadena | null (v1.0.14+) | ID del proyecto de Studio Web; null para manual |
pasos de prueba/{n}.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": ""
}
]
}
| Campo | Tipo | Notas |
|---|---|---|
id | Cadena GUID | Único por paso |
testCaseId | Cadena GUID | Debe hacer referencia a un caso de prueba existente id |
orderNo | Entero | Orden de visualización basado en 0 (primer paso = 0) |
actionType | cadena | nulo | null para pasos manuales |
description | String | Texto de la acción del paso |
expectedResult | String | Resultado esperado; "" cuando está ausente |
clipboardData | String | Datos del portapapeles/capturas de pantalla; 8000 caracteres como máximo; por lo general "" |
conjuntos de pruebas/{n}.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": ""
}
]
}
| Campo | Tipo | Notas |
|---|---|---|
id | Cadena GUID | Único por conjunto de pruebas |
version | cadena | nulo | null para conjuntos de pruebas gestionados por Test Manager |
name | String | Obligatorio; 255 caracteres como máximo |
description | String | "" cuando está ausente |
source | String | "TestManager" (predeterminado) o "Orchestrator" : se trata de una cadena, no de un número entero |
externalTestSetId | cadena | nulo | ID externo cuando source es "Orchestrator"; null de lo contrario |
sourceDetails | cadena | nulo | Metadatos de origen adicionales; null cuando está ausente |
folderKey | cadena | null (v1.0.11+) | Clave de carpeta de UiPath Orchestrator; null si no está vinculado |
folderName | string (v1.0.11+) | Nombre para mostrar de la carpeta; "" si no está vinculado; no almacenado en la base de datos, solo informativo |
asignaciones de casos de prueba/{n}.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
}
]
}
| Campo | Tipo | Notas |
|---|---|---|
id | Cadena GUID (v1.0.14+) | Identificador de asignación |
testSetId | Cadena GUID | Hace referencia a un conjunto de pruebas id |
testCaseId | Cadena GUID | Hace referencia a un caso de prueba id |
assigneeEmail | cadena | null (v1.0.15+) | Correo electrónico del asignado; null si no está asignado |
requisitotestcaseassignments/{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"
}
]
}
No hay campo id . A diferencia de la mayoría de los otros tipos de objetos, las asignaciones de requisito-caso de prueba solo tienen requirementId y testCaseId.
etiquetasobjeto/etiquetasobjeto-{objecttype}-{n}.json
Nomenclatura de archivos: las exportaciones reales utilizan un nombre calificado por tipo como objectlabels-testcase-1.json, objectlabels-testset-1.json, objectlabels-requirement-1.json, etc. El importador lee todos los archivos de la carpeta objectlabels/ , por lo que el calificador no es estrictamente necesario al crear archivos manualmente, pero se recomienda seguir la convención.
{
"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"
}
]
}
| Campo | Tipo | Notas |
|---|---|---|
objectId | Cadena GUID | ID del objeto etiquetado |
name | String | Texto de la etiqueta |
description | String | Descripción de la etiqueta; "" cuando está ausente |
labelType | Entero | 1 = etiqueta del sistema (por ejemplo "manual", "automated"); 0 = etiqueta definida por el usuario |
objectType | String | "TestCase", "TestSet", "Requirement", "TestExecution", "TestCaseLog" |
valoresDeCampoPersonalizados/{n}.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"
}
]
}
projectsettings/projectsettings.json
Introducido en la versión del esquema 1.0.16. Solo presente cuando está habilitada la opción "Exportar configuración del proyecto".
{
"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"
}
]
}
A diferencia de todos los demás archivos de objetos, projectsettings.json es un objeto directo (no una matriz de envoltorio). El archivo contiene un único objeto JSON plano.
| Campo | Tipo | Notas |
|---|---|---|
projectTimeZone | cadena | nulo | Cadena de zona horaria IANA (por ejemplo, "Europe/Vienna") |
folderKey | GUID | nulo | Carpeta de Orchestrator vinculada |
governanceEnabled | booleano | nulo | Si el control está habilitado para el proyecto |
governedByDefault | booleano | nulo | Si los nuevos casos de prueba se rigen por defecto |
signatories | matriz | nulo | Lista de aprobadores/firmantes |
signatories[].signatoryId | GUID | ID de usuario o grupo |
signatories[].signatoryType | Entero | 0 = Usuario, 1 = GrupoDeUsuarios |
signatories[].signatoryLastKnownDetails | String | Nombre para mostrar o correo electrónico en el momento de la exportación |
lastDisabledAt (la marca de tiempo de deshabilitación del control) se excluye intencionadamente de la exportación: es una marca de tiempo interna que no es significativa para un proyecto reimportado.
Reglas y restricciones
-
Todos los ID deben ser GUID únicos y válidos. No reutilices ID en objetos del mismo o diferente tipo.
-
Las referencias cruzadas deben resolverse. Un
testCaseIden un paso de prueba o asignación debe hacer referencia a un caso de pruebaidpresente en el mismo paquete. -
Los objetos de envoltorio son obligatorios. Incluso cuando la colección tiene un elemento, debe estar envuelto:
{ "testCases": [ {...} ] }, nunca una matriz u objeto vacío. -
Convenciones
nullfrente a"": utilizanullpara los campos opcionales que están realmente ausentes (p. ej.automationId,inputParams,preCondition,connectorTestCaseId, todos los campospackage*en casos de prueba manuales). Utilice""solo para los campos que siempre están presentes como cadenas pero que están vacíos (por ejemploforeignRef,description,clipboardData). Mezclarlos, particularmente utilizando""donde se esperanull, puede causar fallos de importación silenciosos. -
objectCountDetailsen el manifiesto debe coincidir con los recuentos reales de objetos presentes, pero el importador no valida estrictamente los recuentos: las discrepancias solo afectan a la visualización del resumen previo a la importación. -
UTF-8 sin BOM es obligatorio para todos los archivos.
Archivo TMH mínimo válido (hecho a mano)
El archivo .tmh válido más pequeño que aceptará Test Manager contiene solo 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"
}
Todos los subdirectorios objects/ son opcionales. El importador omite silenciosamente cualquier tipo de objeto que no esté presente en el archivo.
- Estructura del archivo
- Convenciones de nomenclatura de archivos
- La mayoría de los tipos de objetos: fragmentos numerados
- Nombres de archivo de ámbito de tipo
- Configuración del proyecto: sin sufijo numérico
- Requisitos de codificación
- Versiones del esquema
- manifest.json
- object/ — Esquemas de archivo JSON
- requisitos/{n}.json
- casos de prueba/{n}.json
- pasos de prueba/{n}.json
- conjuntos de pruebas/{n}.json
- asignaciones de casos de prueba/{n}.json
- requisitotestcaseassignments/{n}.json
- etiquetasobjeto/etiquetasobjeto-{objecttype}-{n}.json
- valoresDeCampoPersonalizados/{n}.json
- projectsettings/projectsettings.json
- Reglas y restricciones
- Archivo TMH mínimo válido (hecho a mano)