Primeros pasos
TestDetta compara tu rama con su base, determina qué proyectos de pruebas y qué clases de prueba pueden observar el cambio, y ejecuta solo esos. Cuando no puede estar seguro, ejecuta más, nunca menos.
Requisitos
- El SDK de .NET 10 para ejecutar el propio TestDetta. Tus pruebas siguen usando el SDK y el test runner que ya usa tu repositorio.
- El historial de git completo. TestDetta compara con la merge base de tu rama y recorre el historial para encontrar mapas de cobertura. Los clones superficiales (shallow) no permiten ninguna de las dos cosas.
- La rama de destino descargada, para que exista una ref como
origin/main. - Un test runner tal como lo ve
dotnet test. Se admiten ambos runners; el runner se lee deglobal.json("test": { "runner": "Microsoft.Testing.Platform" }), y el predeterminado es VSTest.
Inicio rápido
GitHub Actions
La GitHub Action compila TestDetta por ti; no hay nada que instalar. Añade dos pasos a tu workflow: uno registra un mapa de cobertura en los push a tu rama predeterminada y el otro ejecuta solo las pruebas afectadas en las pull requests.
- if: github.event_name == 'push'
uses: <owner>/testdetta@<sha>
with:
mode: record
- if: github.event_name == 'pull_request'
uses: <owner>/testdetta@<sha>
with:
mode: test
El workflow completo, los permisos que necesita y todas las entradas están en GitHub Actions.
Otros sistemas de CI
GitLab CI, Jenkins, Azure DevOps, Bitbucket y las instalaciones on-premises ejecutan los mismos dos comandos, con una carpeta de mapas de cobertura por commit (--maps-dir) guardada en un disco compartido o en almacenamiento de objetos. Instala TestDetta como herramienta de .NET:
dotnet tool install --global <package>
El nombre del paquete se fijará en el lanzamiento. Hasta entonces, compila la herramienta desde el código fuente con dotnet build src/TestDetta.Cli -c Release -o testdetta-bin y llama a dotnet testdetta-bin/TestDetta.Cli.dll allí donde aparezca td.
Los pipelines para cada sistema están en Otros sistemas de CI.
Primeros comandos
Ejecútalos desde cualquier lugar dentro de tu repositorio. --base es origin/main de forma predeterminada.
# What does my branch affect, and why?
td affected --base origin/main
# Run only the affected tests (add --dry-run to print the dotnet test commands)
td test --base origin/main
# Run every test with coverage and write one map per test project to .testdetta/coverage
td record
Sin un mapa de cobertura, td test sigue funcionando: decide solo por nombre, lo cual es seguro pero selecciona más. En cuanto td record se haya ejecutado en la base de tu rama, la selección se vuelve precisa.
Añade .testdetta/ a tu .gitignore. Contiene mapas de cobertura y cachés, nunca nada que deba ir en un commit.
Comandos
| Comando | Qué hace |
|---|---|
td affected [--format text|json|paths|commands] | Muestra qué afecta un cambio y por qué. --tests-only lista solo los proyectos de pruebas afectados. |
td test [--dry-run] [--summary-file <path>] [-- <dotnet test args>] | Ejecuta solo las pruebas afectadas. --summary-file añade un resumen en Markdown, por ejemplo a $GITHUB_STEP_SUMMARY. Los argumentos después de -- se pasan a cada dotnet test, por ejemplo -- -c Release. |
td record [--project <csproj>]... [-c <configuration>] [-f <tfm>] [--parallel <n>] [--no-build] | Ejecuta todas las pruebas con cobertura y escribe un mapa por proyecto de pruebas en .testdetta/coverage. --parallel reparte las clases de prueba de cada proyecto entre n procesos de prueba; --no-build registra la salida de una compilación anterior con la misma configuración. |
td license status | Comprueba la licencia y muestra lo que cubre. |
td license install <license|file> | Guarda una licencia en ~/.testdetta/license, para máquinas donde ningún secreto de CI puede contenerla. |
Opciones comunes
| Opción | Significado |
|---|---|
--base <ref> | Ref de git con la que comparar. Predeterminado: origin/main. |
--repo <path> | Cualquier ruta dentro del repositorio. Predeterminado: el directorio actual. |
--max-map-age <n> | Usa mapas de cobertura registrados hasta n commits antes de la merge base, salvando los cambios intermedios. Predeterminado: 50; 0 usa solo mapas exactos. Consulta Cómo decide. |
--maps-dir <dir> | Mapas de cobertura guardados fuera del repositorio, una carpeta por commit: record los guarda ahí, y affected y test restauran el más reciente dentro de --max-map-age. Para sistemas de CI distintos de GitHub Actions. |
--drift-fallback <all|name> | Cuando los cambios desde un mapa más antiguo incluyen un archivo de compilación, configuración o un global using: ejecuta completos los proyectos de pruebas afectados (all, el predeterminado) o decide por nombre (name). |
-v, --verbose | Escribe registros de depuración en stderr: cada decisión que un usuario podría cuestionar, con su motivo. |
--log-level <level> | trace, debug, information, warning (predeterminado), error o none. |
Los registros van a stderr; stdout lleva la salida del comando y sigue siendo legible por máquinas.
Códigos de salida
| Código | Significado |
|---|---|
0 | Éxito. |
1 | El análisis falló. |
2 | Línea de comandos no válida. |
3 | Fallaron pruebas. |