Bobcat ile akış tabanlı specification yazımı
Jeremy D. Miller, Bobcat kütüphanesinin akış tabanlı test yaklaşımını JasperFx portalındaki deneme lisansı özelliği üzerinden anlatıyor. Mevcut xUnit ve Alba testleri, iş kurallarını düz yazı gibi okunacak şekilde yeniden yazılıyor; her adım bir helper metoda, her helper da bir Given/When/Then satırına dönüşüyor. Yazı ayrıca başarısız bir spec'i AI agent'ın okuyabileceği mesaj aktivitesi tablosuyla birlikte nasıl raporladığını gösteriyor.
Kilit noktalar
- Bir Bobcat spec'i birden fazla act içerebiliyor; Then adımları yalnızca son act'i değerlendiriyor, öncekiler precondition oluyor.
- WhenTracked, act'i Wolverine tracked session içinde çalıştırıp ThenHandled<T>() ve ThenMessageScheduled<T>() için tüm handler'ların bitmesini bekliyor.
- Helper içindeki Shouldly assertion'ları ayrı bir doğrulama dili gerektirmeden başarısız adımın hücresi olarak render ediliyor.
- Başarısız spec'in altında mesaj aktivitesi tablosu basılıyor: gönderilen mesajlar, deneme sayıları, correlation ve causation id'leri.
- SpecAssert.Gather() ile bir adımdaki tüm uyuşmazlıklar tek koşuda toplanabiliyor; düz Shouldly ilk hatada duruyor.
- Microsoft.Testing.Platform 2 için global.json'a test runner ayarı ekleniyor ve mevcut xUnit 2 projesi xUnit v3'e taşınıyor.
Bobcat, tek bir act üzerine kurulu arrange/assert testlerinin yetmediği akışları hedefliyor: bir spec birden fazla kez act edebiliyor, önceki act'ler state hazırlıyor ve Then adımları yalnızca son act'i yargılıyor. Örnekte bir prospect formu dolduruyor, doğrulama e-postası gidiyor, linke tıklanınca hesap, contact, lisans, oturum çerezi ve bildirimler tek işlemde oluşuyor. Razor sayfalarını sürmek, fake outbox'tan token okumak gibi mekanik işler base class'taki step helper'lara taşınıyor; helper'ın attribute metni render edilen spec'te görünüyor, içindeki Shouldly assertion'ları ise başarısız adımın hücresi olarak raporlanıyor.
Cascading act'ler WhenTracked ile Wolverine tracked session içinde çalıştırılıyor, böylece ThenHandled<T>() ve ThenMessageScheduled<T>() handler'lar bitmeden değerlendirilmiyor. Başarısız bir spec, adım ağacının altında mesaj aktivitesi tablosu basıyor: hangi mesaj gönderildi, hangi handler kaç denemede bitti, correlation ve causation id'leri ne. Miller bunu AI agent'lar için kritik buluyor, çünkü agent breakpoint koyamıyor; critterstack-sdd-bobcat-troubleshooting skill'i bu çıktıyı okuyup hatayı teşhis ediyor. Yazı ayrıca pürüzleri de sayıyor: helper içindeki Shouldly ilk hatada duruyor ve Razor sayfasının commit ettiği event'ler WhenTracked tarafından görülmüyor.
Gerçek dünyada kullanımı
- E-posta doğrulaması, hesap açma ve lisans atama gibi çok adımlı bir kayıt akışını uçtan uca spec olarak yazmak.
- Aynı kişinin veya şirketin ikinci kez deneme alamadığı gibi red kurallarını, ikinci act'in hiçbir şey yapmadığını gösteren akışlarla test etmek.
- CI'da kırmızıya düşen bir spec'i AI agent'a devretmek ve agent'ın adım ağacı ile mesaj aktivitesi tablosundan hipotez kurmasını sağlamak.
- Mevcut xUnit ve Alba test paketini silmeden, iş kurallarını pull request'te okunur kılacak şekilde kademeli olarak yeniden yazmak.
Neden önemli
Akış tabanlı spec'ler iş kurallarını kod okuyarak değil, baştan sona okunan bir hikâye olarak incelenebilir hale getiriyor; hata çıktısı da insan ve agent için aynı yerden okunabiliyor.
Benzer haberler
- Event Sourcing'de AggregateRoot yerine Decider deseni tercih edilmeliJeremy D. Miller (The Shade Tree Developer)5 gün önce
- Mevcut xUnit.Net testlerini Bobcat'e taşımakJeremy D. Miller (The Shade Tree Developer)1 gün önce
- Alba 9 yolda: paralel integration test için host pooling ve yeni assertion'larJasperFx (Critter Stack) Blog1 gün önce