Test (TR)
Bu sayfayı neden okuyorsunuz? Bu sayfa Intentum testlerinin neyi kapsadığını, nasıl çalıştırılacağını ve kendi testinizi nasıl ekleyeceğinizi anlatır. CI'da API anahtarı olmadan güvenilir test istiyorsanız doğru yerdesiniz.
Intentum testleri contract (sağlayıcıların ve çekirdek tiplerin doğru parse ve davranışı) ile çekirdek akışlara (BehaviorSpace → Infer → Decide) odaklanır. Testler mock HTTP ve bellek içi sağlayıcı kullanır; API anahtarı veya ağ olmadan çalıştırılabilir.
Bu sayfa neyin test edildiğini, testlerin nasıl çalıştırılacağını ve kendi testini nasıl ekleyeceğini anlatır. Coverage üretimi ve raporlar için Coverage.
Neden bu şekilde test?
- CI’da gerçek API çağrısı yok: Mock HTTP ve sabit cevaplar testleri hızlı ve kararlı tutar; secret gerekmez.
- Contract testleri: Her sağlayıcının API cevap şeklini (embedding dizisi, skor) doğru şekilde
IntentEmbedding’e parse ettiğini ve intent modeli ile policy engine’in beklenen şekilde davrandığını assert ediyoruz. - Çekirdek davranış: BehaviorSpace vektörleştirme, intent çıkarımı ve policy kararları kapsanıyor; refactor’lar ana akışı bozmaz.
Testleri nasıl çalıştırılır?
Reponun kökünden:
dotnet test tests/Intentum.Tests/Intentum.Tests.csproj
Ayrıntılı çıktı ile:
dotnet test tests/Intentum.Tests/Intentum.Tests.csproj -v n
Neler kapsanıyor?
| Alan | Neyi test ediyoruz |
|---|---|
| BehaviorSpace | Observe(actor, action) ile space oluşturma, olay sayısı, ToVector() boyutları; IntentumCoreExtensions (Observe, EvaluateIntent, IntentEvaluator.Normalize). |
| Intent çıkarımı | Mock sağlayıcı ve SimpleAverageSimilarityEngine ile LlmIntentModel: güven seviyesi ve skor, sinyaller; IntentConfidence (FromScore: Low/Medium/High/Certain). |
| Policy kararları | IntentPolicy ve IntentPolicyEngine: kural sırası, ilk eşleşen kural kazanır, eşleşen kural yok, boş policy; Allow, Observe, Warn, Block sonuçları; PolicyDecisionTypes (ToLocalizedString); RuntimeExtensions (DecideWithRateLimit / DecideWithRateLimitAsync, rate limit uygulanan/uygulanmayan). |
| Yerelleştirme | DefaultLocalizer: karar etiketleri (kültür, bilinen/bilinmeyen anahtarlar). |
| Options doğrulama | OpenAIOptions, AzureOpenAIOptions, GeminiOptions, MistralOptions Validate(): geçerli durum ve geçersiz (boş API key, embedding model, base URL) throw. |
| Sağlayıcı cevap parse | Her embedding sağlayıcısı (OpenAI, Gemini, Mistral, Azure OpenAI) için mock HttpClient ile sabit JSON cevabı; parse edilen embedding skorunu (veya non-200’de exception) assert ediyoruz. |
| Sağlayıcı IntentModel'leri | OpenAIIntentModel, GeminiIntentModel, MistralIntentModel, AzureOpenAIIntentModel ile MockEmbeddingProvider: infer beklenen confidence ve sinyalleri döndürür. |
| Clustering | AddIntentClustering kaydı; IntentClusterer (cluster Id, RecordIds, ClusterSummary ortalama/min/max). |
| Test yardımcıları | IntentAssertions (HasSignalCount, ContainsSignal), PolicyDecisionAssertions (IsAllow, IsBlock, IsNotBlock), TestHelpers.CreateModel. |
| Redis embedding cache | RedisEmbeddingCache: bellek içi IDistributedCache ile Get/Set/Remove; gerçek Redis yok. |
| Webhook / Events | WebhookIntentEventHandler: AddWebhook seçenekleri, HandleAsync mock HttpClient’a POST; AddIntentumEvents DI kaydı. |
| Experiments | IntentExperiment: AddVariant, SplitTraffic, RunAsync (mock model/policy ile). |
| Simulation | BehaviorSpaceSimulator: FromSequence, GenerateRandom (seed ile). |
| Explainability | IntentExplainer: GetSignalContributions, GetExplanation. IntentTreeExplainer: GetIntentTree (karar ağacı, eşleşen kural, sinyal düğümleri). |
| Policy observability | DecideWithExecutionLog: çalıştırma kaydı (eşleşen kural, intent adı, karar, süre, başarı, exception); DecideWithMetrics tutarlılığı. |
| Multi-tenancy | TenantAwareBehaviorSpaceRepository: SaveAsync TenantId ekler, GetByIdAsync tenant’a göre filtreler; bellek içi repo. |
| Versioning | PolicyVersionTracker: Add, Current, Rollback, Rollforward, SetCurrent; VersionedPolicy. |
Yani: gerçek API çağırmıyoruz; sahte JSON veya mock sağlayıcı kullanıyoruz ve sağlayıcı ile modelin beklenen Intent ve PolicyDecision ürettiğini kontrol ediyoruz.
Henüz kapsanmayanlar
| Alan | Durum |
|---|---|
| Intentum.Persistence.MongoDB | Test projesinde referans yok; MongoBehaviorSpaceRepository / MongoIntentHistoryRepository için unit veya integration test yok. |
| Intentum.Persistence.EntityFramework | Test projesinde referans yok; EF repository’ler veya PostgreSQL/SQL Server için test yok. |
| Intentum.Persistence.Redis | Test projesinde referans yok; Redis tabanlı behavior space veya intent history repository testi yok. |
| Gerçek Redis / MongoDB / PostgreSQL | Tüm mevcut testler bellek içi veya mock kullanıyor. Gerçek veritabanına karşı integration testler (örn. Testcontainers) yok. |
Persistence ekliyorsanız veya gerçek bir store’a karşı çalıştırıyorsanız, integration test (örn. MongoDB/PostgreSQL/Redis için Testcontainers) veya en azından aynı interface’i implement eden sahte repository ile contract test eklemeyi düşünün.
Hata senaryoları
- HTTP non-200: Sağlayıcılar HTTP cevabı başarılı değilse (örn. 401, 500) exception fırlatır. Testler 401/500 dönen mock client ile bunu simüle edip exception bekleyebilir.
- Boş embedding’ler: API boş embedding dizisi (veya embedding yok) döndürürse sağlayıcı skor 0 (veya eşdeğeri) döndürür; testler bunu kapsar, davranış öngörülebilir olur.
Test nasıl eklenir (mock HTTP)
Gerçek API çağırmadan bir sağlayıcıyı test etmek için:
- Sabit cevap döndüren bir
HttpClientoluştur (örn.new HttpClient(new MockHttpMessageHandler(json))veya test sunucusu). - Sağlayıcıyı options (örn. sahte API key) ve bu client ile oluştur.
provider.Embed("user:login")(veya benzeri) çağır veresult.Scoreveya beklenen exception üzerinde assert et.
Örnek kalıp (kavramsal):
var json = """{ "data": [ { "embedding": [0.5, -0.5] } ] }""";
var client = CreateMockClient(json);
var provider = new OpenAIEmbeddingProvider(options, client);
var result = provider.Embed("user:login");
Assert.InRange(result.Score, 0.49, 0.51);
Gerçek örnekler için repodaki ProviderHttpTests dosyasına bak. Coverage seçenekleri (CollectCoverage, OpenCover vb.) için Coverage.
Sonraki adım: Bu sayfayı bitirdiyseniz → Testler özeti veya Coverage.