Nasıl karar verir
TestDetta seçimi adım adım ve yalnızca kanıtı olan yerlerde daraltır. İzleyemediği her şeyde daha fazlasını çalıştırmaya geri döner.
Daha fazlasını seç, asla daha azını değil
Kaçırılan bir test bir hatadır; fazladan bir test yalnızca CI süresine mal olur. Aşağıdaki her kural bundan çıkar. Analiz, bir değişikliğin bir projeyi ya da sınıfı etkileyip etkilemediğinden emin olamadığında onu etkilenmiş sayar ve gerekçe çıktıda görünür.
Beş adım
1. Projeler
Değişen dosyalar ait oldukları projelere eşlenir ve ProjectReference'lar üzerinden onlara bağımlı her projeye kadar izlenir. Directory.Build.props, global.json ve .editorconfig gibi derlemenin geneline etki eden dosyalar altlarındaki her projeyi etkiler.
2. Semboller
C# dosyalarında eski ve yeni söz dizimi ağaçları karşılaştırılır. Yorum ve boşluk değişiklikleri hiçbir şey seçmez; diğer durumlarda TestDetta hangi tiplerin ve üyelerin değiştiğini bilir.
3. Kapsam
td record çalıştıktan sonra, base commit'te kaydedilmiş ve hangi test sınıfının hangi metodu çalıştırdığını gösteren bir harita, değişen metotlar, property'ler ve constructor'lar için test sınıflarını doğrudan verir.
4. İsimler
Yeni kod, alanlar ve sabitler gibi kapsam verisinin göremediği şeyler, test sınıflarına ya da kapsam haritasının bildiği koda ulaşana kadar kaynak kodda isimleriyle izlenir.
5. Geri dönüşler
Bir değişiklik izlenemediğinde test projesinin tamamı çalışır:
- bir projedeki C# dışı dosyalar, örneğin
appsettings.json,.csprojya da bir.resx; - global using'ler ve assembly attribute'ları;
- bir framework'ün reflection ile keşfettiği tipler, örneğin controller'lar, mesaj handler'ları ve EF yapılandırmaları.
Filtre öz denetimi
TestDetta, seçilen bir projeyi test sınıfları üzerinde bir filtreyle çalıştırır. Hiçbir testle eşleşmeyen bir filtre TestDetta içinde bir hata olarak ele alınır: proje filtresiz olarak yeniden çalıştırılır.
Kapsam haritaları
td record tüm testleri kapsam ölçümüyle çalıştırır ve her test projesi için bir harita yazar. Haritaları en iyisi branch'inizin merge base'inde kaydetmektir; CI'da ise varsayılan branch'teki her commit için bir harita kaydedersiniz.
Eski haritalar ve drift bridge
Merge base'den en fazla 50 commit önce kaydedilmiş bir harita yine kullanılır (--max-map-age, varsayılan 50; 0 yalnızca merge base'de kaydedilmiş bir haritayı kullanır). Aradaki kod değişiklikleri haritanın bilmediği çağrılar oluşturmuş olabilir; bu yüzden TestDetta, o zamandan beri değişmiş ve sizin değişikliğinize ulaşabilen herhangi bir üyeyi çalıştırmış sınıfları da seçer ve yeni kodu isimle izler.
Aradaki bir şey üyelerle ifade edilemediğinde, örneğin bir derleme dosyası ya da appsettings.json, etkilenen test projeleri tamamen çalışır. --drift-fallback name ise bunun yerine, harita yokmuş gibi isimlere göre karar verir: daha hızlıdır, ancak yapılandırma ya da reflection ile bağlanan çağrıları göremez.
Harita olmadan
Kurulumdan sonraki ilk pull request'ler ya da çok geride kalanlar, erişilebilir mesafede bir harita bulamaz. TestDetta bu durumda yalnızca isimlere göre seçer; bu güvenlidir ama daha fazlasını seçer ve bunu logunda belirtir. td record varsayılan branch'te çalıştıktan sonra seçim isabetli hale gelir.
Nedenini görmek
td affected ve td test --dry-run, etkilenen her test projesini filtreli mi, tamamen mi yoksa hiç mi çalışacağının gerekçesiyle birlikte yazdırır; td affected --format json her test sınıfı için verilen kararı da ekler. -v her kararı stderr'e yazar; örneğin bir projenin neden etkilendiğini ya da bir sınıfın hangi değişikliği çalıştırdığını.
$ td test --dry-run --base origin/main
td: 1 changed file(s), 2 affected test project(s).
Tests to run:
filtered tests/Shop.Tests/Shop.Tests.csproj (3 of 41 test class(es) run or reference the changed code)
skip tests/Api.Tests/Api.Tests.csproj (no test class runs or references the changed code)