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
- Record modu haritaları Actions önbelleğine
testdetta-coverage-<commit>anahtarıyla kaydeder. Pull request'ler base branch'lerinin önbelleklerini okuyabilir. - Bir pull request, merge base'inin haritasını ya da ondan en fazla
max-map-agefirst-parent commit önce kaydedilmiş en yeni haritayı kullanır. - Tam eşleşme olmayan bu en yeni haritayı bulmak için deponun önbellekleri listelenir; bunun için
actions: readgerekir. Bu izin olmadan yalnızca merge base'deki bir harita bulunur ve adım bunu bir notice ile bildirir. - Hiç harita olmadan da
mode: testçalışır; yalnızca isimlere göre karar verir.
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
| İzin | Neden |
|---|---|
contents: read | Depoyu checkout etmek. |
actions: read | max-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
| Girdi | Varsayılan | Açıklama |
|---|---|---|
mode | Pull request'lerde test (etkilenen testleri çalıştırır), varsayılan branch'te record (kapsam haritalarını kaydeder). Zorunlu. | |
base | PR'ın base branch'i | Test modunda karşılaştırılacak branch. Pull request'ler dışında bunu ayarlayın. |
configuration | Debug | Testleri derlemek ve çalıştırmak için derleme yapılandırması. |
projects | tüm test projeleri | Record modu: her satıra bir tane olmak üzere .csproj yolları. |
parallel | 1 | Record 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-build | false | Record modu: önceki bir adımın aynı configuration ile yaptığı derlemeyi kaydetmek için true. |
dotnet-test-args | Test modu: boşlukla ayrılmış ek dotnet test argümanları. | |
max-map-age | 50 | Test 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-fallback | all | Test 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-token | github.token | Test modu: en yeni haritayı bulmak için Actions önbelleklerini listeler (actions: read gerektirir). |
license | Test 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-dotnet | true | TestDetta'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.