GitHub Actions
Registra un mapa por cada commit de la rama predeterminada y deja que las pull requests ejecuten solo las pruebas que sus cambios afectan. La acción compila TestDetta por sí misma y guarda los mapas en la caché de Actions.
Workflow
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
actions: read # lets pull requests find the newest coverage map in the Actions cache
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7 # pin to a commit SHA
with:
fetch-depth: 0 # TestDetta compares with the merge base
persist-credentials: false
- uses: actions/setup-dotnet@v6 # pin to a commit SHA
with:
global-json-file: global.json
# Also the full test run of main. Leave out projects that cannot run here, such as
# integration tests that need a database; they are then decided by name on pull requests.
- if: github.event_name == 'push'
uses: <owner>/testdetta@<sha>
with:
mode: record
projects: |
tests/Shop.Tests/Shop.Tests.csproj
- if: github.event_name == 'pull_request'
uses: <owner>/testdetta@<sha>
with:
mode: test
dotnet-test-args: --logger trx
license: ${{ secrets.TESTDETTA_LICENSE }}
Se necesita el historial completo. La acción se detiene con un error en un clon superficial (shallow). Haz el checkout con fetch-depth: 0.
Cómo llegan los mapas a las pull requests
- El modo record guarda los mapas en la caché de Actions con la clave
testdetta-coverage-<commit>. Las pull requests pueden leer las cachés de su rama base. - Una pull request usa el mapa de su merge base, o el más reciente registrado hasta
max-map-agecommits de primer padre (first-parent) antes de ella. - Para encontrar ese mapa más reciente que no es exacto se listan las cachés del repositorio, lo que requiere
actions: read. Sin ese permiso, solo se encuentra un mapa en la merge base, y el paso lo indica con un aviso. - Sin ningún mapa,
mode: testsigue funcionando y decide solo por nombre.
Cuando fallan pruebas durante el registro, el mapa se guarda igualmente antes de que falle el job, así que las pull requests siguen teniendo un mapa con el que trabajar.
Permisos
| Permiso | Por qué |
|---|---|
contents: read | Hacer el checkout del repositorio. |
actions: read | Listar las cachés de Actions para encontrar el mapa más reciente dentro de max-map-age. |
Con persist-credentials: false, un repositorio privado no se puede volver a descargar más adelante en el job; fetch-depth: 0 ya trae todas las ramas, así que la rama base está disponible.
Entradas
| Entrada | Predeterminado | Descripción |
|---|---|---|
mode | test en las pull requests (ejecutar las pruebas afectadas), record en la rama predeterminada (registrar mapas de cobertura). Obligatoria. | |
base | la rama base de la PR | Rama con la que comparar en el modo test. Fuera de las pull requests, defínela. |
configuration | Debug | Configuración de compilación para compilar y ejecutar las pruebas. |
projects | todos los proyectos de pruebas | Modo record: rutas de .csproj, una por línea. |
parallel | 1 | Modo record: procesos host de prueba por proyecto de pruebas; cada uno sigue ejecutando sus pruebas de una en una. El conjunto de pruebas debe tolerar varios procesos de prueba a la vez. |
no-build | false | Modo record: true para registrar la compilación que hizo un paso anterior con la misma configuration. |
dotnet-test-args | Modo test: argumentos adicionales de dotnet test, separados por espacios. | |
max-map-age | 50 | Modo test: cuántos commits puede estar un mapa por detrás de la merge base; los cambios intermedios se salvan con el drift bridge. 0 usa solo un mapa exacto. |
drift-fallback | all | Modo test: cuando los cambios desde un mapa más antiguo incluyen un archivo de compilación, configuración o un global using, all ejecuta completos los proyectos de pruebas afectados; name decide por nombre (más rápido, pero ciego a las llamadas hechas mediante configuración o reflexión). |
github-token | github.token | Modo test: lista las cachés de Actions para encontrar el mapa más reciente (necesita actions: read). |
license | Modo test: la cadena de licencia, desde un secreto del repositorio o de la organización como TESTDETTA_LICENSE. Los repositorios públicos no la necesitan. Sin una licencia válida se ejecutan todas las pruebas; el job nunca falla por ello. | |
working-directory | . | Cualquier directorio dentro del repositorio que se vaya a analizar. |
setup-dotnet | true | Instala el SDK de .NET 10 sobre el que se ejecuta TestDetta. Ponlo en false si el job ya lo tiene. |
Job summary
En el modo test, TestDetta escribe su selección en el job summary: los archivos modificados y la base con la que comparó, cada proyecto de pruebas indicando si se ejecutó filtrado, completo o no se ejecutó y por qué, los resultados de las pruebas y el estado de la licencia cuando importa. Las rutas, los nombres de clase y los motivos procedentes del repositorio se escriben como código, para que los nombres de archivo de una pull request no puedan inyectar enlaces ni menciones en la página.
Registrar solo una parte del conjunto de pruebas
El registro ejecuta una vez todo el conjunto de pruebas con cobertura, lo que en la rama predeterminada es también tu ejecución completa de pruebas. Excluye con projects los proyectos que no pueden ejecutarse en el runner, como las pruebas de integración que necesitan una base de datos. Las pull requests deciden entonces esos proyectos por nombre.
Si un paso anterior ya compiló la solución con la misma configuración, define no-build: true. Para un conjunto de pruebas que tolera varios procesos de prueba a la vez, parallel reparte las clases de prueba de cada proyecto entre esa cantidad de procesos.