GitHub Actions

Varsayılan branch'teki her commit için bir harita kaydedin ve pull request'lerin yalnızca değişikliklerinin etkilediği testleri çalıştırmasını sağlayın. Action TestDetta'yı kendisi derler ve haritaları Actions önbelleğinde tutar.

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 }}

Tam geçmiş gereklidir. Action, shallow clone'da hata vererek durur. Checkout'u fetch-depth: 0 ile yapın.

Haritalar pull request'lere nasıl ulaşır

Kayıt sırasında testler başarısız olduğunda harita, job başarısız olmadan önce yine kaydedilir; böylece pull request'lerin kullanabileceği bir harita kalır.

İzinler

İzinNeden
contents: readDepoyu checkout etmek.
actions: readmax-map-age sınırı içindeki en yeni haritayı bulmak için Actions önbelleklerini listelemek.

persist-credentials: false ile özel bir depo job'un ilerleyen adımlarında yeniden fetch edilemez; fetch-depth: 0 zaten tüm branch'leri getirdiği için base branch mevcuttur.

Girdiler

GirdiVarsayılanAçıklama
modePull request'lerde test (etkilenen testleri çalıştırır), varsayılan branch'te record (kapsam haritalarını kaydeder). Zorunlu.
basePR'ın base branch'iTest modunda karşılaştırılacak branch. Pull request'ler dışında bunu ayarlayın.
configurationDebugTestleri derlemek ve çalıştırmak için derleme yapılandırması.
projectstüm test projeleriRecord modu: her satıra bir tane olmak üzere .csproj yolları.
parallel1Record modu: test projesi başına test host süreci sayısı; her süreç testlerini yine birer birer çalıştırır. Test paketinin aynı anda birden fazla test sürecini kaldırabilmesi gerekir.
no-buildfalseRecord modu: önceki bir adımın aynı configuration ile yaptığı derlemeyi kaydetmek için true.
dotnet-test-argsTest modu: boşlukla ayrılmış ek dotnet test argümanları.
max-map-age50Test modu: bir haritanın merge base'in kaç commit gerisinde olabileceği; aradaki değişiklikler köprülenir. 0 yalnızca tam eşleşen haritayı kullanır.
drift-fallbackallTest modu: daha eski bir haritadan bu yana yapılan değişiklikler bir derleme dosyası, yapılandırma ya da global using içerdiğinde, all etkilenen test projelerini tamamen çalıştırır; name isimlere göre karar verir (daha hızlıdır, ancak yapılandırma ya da reflection üzerinden yapılan çağrıları göremez).
github-tokengithub.tokenTest modu: en yeni haritayı bulmak için Actions önbelleklerini listeler (actions: read gerektirir).
licenseTest modu: TESTDETTA_LICENSE gibi bir depo ya da organizasyon secret'ından gelen lisans dizesi. Açık depolar lisansa ihtiyaç duymaz. Geçerli bir lisans olmadan tüm testler çalışır; job bu yüzden asla başarısız olmaz.
working-directory.Analiz edilecek, depo içindeki herhangi bir dizin.
setup-dotnettrueTestDetta'nın üzerinde çalıştığı .NET 10 SDK'yı kurar. Job'da zaten varsa false yapın.

Job summary

Test modunda TestDetta seçimini job summary'ye yazar: değişen dosyalar ve karşılaştırdığı base, her test projesinin filtreli mi, tamamen mi yoksa hiç mi çalıştığı ve nedeni, test sonuçları ve önemli olduğunda lisans durumu. Depodan gelen yollar, sınıf adları ve gerekçeler kod olarak yazılır; böylece bir pull request'teki dosya adları sayfaya link ya da mention enjekte edemez.

Test paketinin yalnızca bir kısmını kaydetmek

Kayıt, tüm test paketini kapsam ölçümüyle bir kez çalıştırır; bu, varsayılan branch'te aynı zamanda tam test koşunuzdur. Runner üzerinde çalışamayan projeleri, örneğin veritabanı gerektiren entegrasyon testlerini, projects ile dışarıda bırakın. Pull request'ler bu projeler için isimlere göre karar verir.

Önceki bir adım solution'ı aynı yapılandırmayla zaten derlediyse no-build: true ayarlayın. Aynı anda birden fazla test sürecini kaldırabilen bir test paketi için parallel, her projenin test sınıflarını o sayıda sürece dağıtır.