Alba 9 yolda: paralel integration test için host pooling ve yeni assertion'lar
JasperFx'in ASP.NET Core integration test kütüphanesi Alba, 9.0 sürümüne hazırlanıyor; 25 Ekim'de çıkan RC3 son release candidate. Sürümün en büyük yeniliği, paralel testlerde IHost ve veritabanı kurma maliyetini azaltan host pool; buna route adıyla senaryo yazma, JSONPath ve problem details assertion'ları, endpoint kapsam/authorization denetimleri, sahte TimeProvider ile zaman yolculuğu ve server-sent events desteği eşlik ediyor.
Kilit noktalar
- Host pool, test başına yeni IHost ve veritabanı kurma yerine kiralanan host'ları yeniden kullanıyor; `MaxHosts` varsayılanı işlemci sayısı
- `OnCreated`, `OnRent` ve `OnReturn` kancalarıyla her test sonrası veri temizliği yapılıyor; hata olursa host atılıp aynı slotta yenisi başlatılıyor
- `RouteNamed`/`ToRouteNamed` senaryoları URL yerine route adıyla yazıyor, bilinmeyen isim istek gitmeden hata veriyor
- `JsonPath(...)` tek bir JSON değerini doğruluyor, `ShouldReturnProblemDetails` ve `ShouldReturnValidationProblem` RFC 9457 yanıtlarını kontrol ediyor
- `EndpointCoverage.NotExercised()` hiç test edilmemiş endpoint'leri, `EndpointsAllowingAnonymous()` kimlik doğrulaması olmadan erişilebilen endpoint'leri raporluyor
- `TimeProviderOverride` ile `FakeTimeProvider` enjekte edilip `Advance`/`SetUtcNow` ile zaman ileri alınabiliyor
Alba, gerçek uygulamayı bellekte `AlbaHost` ile ayağa kaldırıp HTTP isteğini ASP.NET Core pipeline'ından geçirerek yanıtı assertion olarak yazmanızı sağlıyor. 9.0'ın merkezinde `Alba.Pooling` namespace'indeki host pool var: havuz, ihtiyaç duydukça bir factory çağırıp host üretiyor, her host'a `AlbaHostSlot.Index` üzerinden kendi veritabanı verilebiliyor. Test host'u `RentAsync` ile kiralayıp `await using` ile bırakıyor; `OnCreated`, `OnRent` ve `OnReturn` kancalarıyla testler arası veri temizliği yapılıyor, `MaxHosts` varsayılan olarak işlemci sayısı.
Diğer yenilikler: senaryoların endpoint'i route adıyla (`WithName()`, MVC `Name`, Wolverine `RouteName`) hedefleyip URL'i uygulamanın routing'ine ürettirmesi; tüm gövdeyi deserialize etmeden `JsonPath(...)` ile tek değer doğrulama ve RFC 9457 problem details assertion'ları; hiç test görmemiş endpoint'leri ve anonim erişime açık endpoint'leri listeleyen denetimler; `TimeProviderOverride` ile `FakeTimeProvider` üzerinden zamanı ileri alma. Alba 8'den geçerken changelog'daki breaking change'leri okumak gerekiyor.
Gerçek dünyada kullanımı
- Yüzlerce integration testi olan ve CI süresi şişen bir ASP.NET Core API'sinde testleri paralel koşturmak
- Her testin kendi veritabanı şemasına ihtiyaç duyduğu Marten veya EF Core tabanlı bir uygulamada slot başına ayrı veritabanı vermek
- Güvenlik incelemesi öncesi eksik `[Authorize]` attribute'larını CI'da failing test'e dönüştürmek
- Abonelik bitişi, cache süresi veya zamanlanmış mesaj gibi zamana bağlı davranışları sahte saatle test etmek
Neden önemli
Host pool, paralel integration testlerin en büyük maliyeti olan host ve veritabanı kurulumunu test başına ödemekten kurtarıyor; endpoint denetimleri de kapsam ve yetkilendirme boşluklarını CI'da görünür hale getiriyor.