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

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

PermisoPor qué
contents: readHacer el checkout del repositorio.
actions: readListar 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

EntradaPredeterminadoDescripción
modetest en las pull requests (ejecutar las pruebas afectadas), record en la rama predeterminada (registrar mapas de cobertura). Obligatoria.
basela rama base de la PRRama con la que comparar en el modo test. Fuera de las pull requests, defínela.
configurationDebugConfiguración de compilación para compilar y ejecutar las pruebas.
projectstodos los proyectos de pruebasModo record: rutas de .csproj, una por línea.
parallel1Modo 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-buildfalseModo record: true para registrar la compilación que hizo un paso anterior con la misma configuration.
dotnet-test-argsModo test: argumentos adicionales de dotnet test, separados por espacios.
max-map-age50Modo 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-fallbackallModo 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-tokengithub.tokenModo test: lista las cachés de Actions para encontrar el mapa más reciente (necesita actions: read).
licenseModo 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-dotnettrueInstala 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.