Análisis de impacto de pruebas para .NET

Ejecuta solo las pruebas que tu cambio puede romper.

TestDetta lee tu diff, lo sigue a través de proyectos, símbolos y cobertura registrada, y ejecuta solo las clases de prueba que pueden observarlo. Cuando no puede estar seguro, ejecuta más, nunca menos.

$ td test --base main -- -f net10.0td: 1 changed file(s), 1 affected test project(s).Tests to run:  filtered src/Spectre.Console.Tests/Spectre.Console.Tests.csproj    (14 of 141 test class(es) run or reference the changed code, 0.6 s of 3.0 s (80% saved))Recorded test time: 0.6 s of 3.4 s (83% saved).Passed!  - Failed: 0, Passed: 156, Total: 156 - Spectre.Console.Tests.dlltd summary:  passed  src/Spectre.Console.Tests/Spectre.Console.Tests.csproj  (14 class(es), 4.6 s)1 project(s) run, 0 failed, 0 skipped.# un cambio real en Spectre.Console: ver la ejecución completa

Medido en código real, no en demos

Cambiamos miembros de bibliotecas .NET de código abierto populares, uno a uno, y comprobamos que cada clase de prueba que falla sea una que TestDetta seleccionó.

41repositorios de código abierto, cada uno con su propio framework de pruebas, test runner y particularidades de compilación
2,941cambios que rompieron al menos una prueba
3 pasadas por alto, todas corregidascada caso pasado por alto recibe una prueba que falla sin la corrección, y su repositorio se vuelve a ejecutar hasta quedar limpio

Un cambio en un solo miembro ejecutó una mediana del 28% de las clases de prueba. Mira una ejecución real, del diff al job summary →

Cómo decide

Cada paso reduce la selección solo cuando tiene pruebas de ello. Todo lo que no puede rastrear recurre a ejecutar más.

1

Proyectos

Los archivos modificados se asignan a proyectos y siguen sus ProjectReference. Los archivos que afectan a toda la compilación, como Directory.Build.props, afectan a todo lo que está por debajo de ellos.

2

Símbolos

Se comparan los árboles de sintaxis de C#, así que los cambios en comentarios y espacios en blanco no seleccionan nada, y TestDetta sabe qué miembros cambiaron.

3

Cobertura

Un mapa registrado en tu rama predeterminada indica qué clase de prueba ejecutó qué método, así que los métodos modificados seleccionan sus clases directamente.

4

Nombres

El código nuevo, los campos y las constantes se rastrean por nombre a través del código fuente hasta llegar a clases de prueba o a código que el mapa conoce.

5

Alternativas seguras

Archivos de configuración, global usings, tipos descubiertos por reflexión: cuando un cambio no se puede rastrear, se ejecuta el proyecto de pruebas completo.

6

Autocomprobaciones

Un filtro que no coincide con ninguna prueba se trata como un error de TestDetta, y el proyecto se vuelve a ejecutar sin él.

Dos pasos en GitHub Actions

Registra un mapa de cobertura en cada push a tu rama predeterminada. Las pull requests restauran el mapa más reciente y ejecutan solo las pruebas afectadas, con un job summary que explica por qué se ejecutó u omitió cada clase.

Guía de GitHub Actions →
GitLab CI, Jenkins, Azure DevOps, Bitbucket →

- 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
    license: ${{ secrets.TESTDETTA_LICENSE }}

Hecho para equipos que no pueden permitirse pasar por alto una prueba

Tu código se queda contigo

TestDetta se ejecuta dentro de tu CI. Ni el código fuente, ni la cobertura, ni los resultados de las pruebas salen de tus máquinas; los correos de los autores de commits solo se cuentan localmente.

Todos los frameworks que usas

xUnit v2 y v3, NUnit, MSTest y TUnit, tanto con VSTest como con Microsoft.Testing.Platform, incluida su propia paralelización.

Nunca bloquea una compilación

Sin una licencia válida se ejecutan todas las pruebas, como antes. Un problema de licencia cuesta tiempo de CI, nunca una compilación en rojo.

Gratis para repositorios públicos. 30 días gratis para los privados.

Después, $15 por committer activo al mes. Sin tarjeta para la prueba.