Kendi sunucunuzda para hareketi yöneten bir yazılım çalıştırıyorsunuz. Bu sayfa “Poyra’nın bir sürümü gerçekten çalışıyor mu?” sorusunun kurulumunuzda nasıl yanıtlandığını anlatır — depoyu klonlayıp aynı doğrulamaları kendiniz de koşabilirsiniz.

Kendi kurulumunuzu doğrulama

Birim testleri ve mimari/PCI bekçileri; Docker gerektirmez, saniyeler sürer. Yükseltmeden önce koşulacak ilk şeydir.
Tüm katmanlar + kapsam raporu. Docker gerekir — entegrasyon testleri Testcontainers ile gerçek PostgreSQL 18 kaldırır, sahte bir veritabanıyla çalışmaz. Rapor artifacts/kapsam/index.html altına satır satır düşer.
Hepsi, kapsam ölçümü olmadan.

Dört katman, dört ayrı soru

1.197 test dört katmana ayrılır ve her katman farklı bir şeyi kanıtlar: Birkaç ayrıntı, çünkü bu katmanların değeri tam olarak oralarda:
  • Konnektör uyum kiti listesini DI kaydından okur. Yeni bir banka eklendiğinde ortak sözleşme testleri kendiliğinden o bankayı da kapsar — ayrıntı banka adaptörleri sayfasında.
  • Entegrasyon testleri üretimle aynı rol modelini kurar: migration’lar sahip rolüyle koşar, testler poyra_app rolüyle bağlanır. Böylece RLS gerçekten sınanır — işyerleri arası görünmezlik ham SQL ile doğrulanır, çapraz işyeri INSERT 42501 ile düşer, olay defterinde UPDATE/DELETE reddedilir.
  • E2E testleri uygulamaları gerçek Kestrel portlarında ayağa kaldırır; dışarıda ayakta duran bir servise bağımlılık yoktur. Sahte sağlayıcı sunucuları da artık rastgele port seçmez — rastgelelik ara sıra çakışıp testleri sebepsizce kırıyordu.

Yük profili: ölçek iddiası ayrı bir araçtır

Dört katman doğruluğu kanıtlar; “kaç işlem kaldırır” sorusu ayrı bir araca bırakıldı. tests/Poyra.Tests.Load bir konsol uygulamasıdır — dotnet test onu görmez, CI’ın normal akışına karışmaz; elle ya da ayrı bir workflow ile koşar:
Release şarttır: Debug’da JIT eniyilemesi kapalıdır ve mikrosaniyelik rota çekirdeği ölçümü tamamen anlamsızlaşır. Senaryo süzgeci, süre (--sure), eşzamanlılık (--es) ve ısınma (--isinma) parametreleri komut satırından verilir. Hazır bir yük aracı yerine araç elle yazıldı: NBomber kurumsal kullanımda ücretli aboneliğe bağlıdır ve paketi eklemek Poyra’yı self-host eden her kuruma aynı yükümlülüğü bindirirdi; k6 lisans açısından uygundur ama yalnız HTTP konuşur — rota karar çekirdeğinin süreç içi ölçümü onunla yazılamazdı. Bir geliştirici dizüstünde (Docker’da ayarsız PG 18, MockBank, yük üreteci uygulamayla aynı süreçte), 10 sn · 16 eşzamanlı: Okunuşu: rota kararı darboğaz değildir — ödeme başına bir kez koşan mikrosaniyelik bir iştir, toplam maliyette görünmez. Tam akış bu donanımda ~16 eşzamanlıda doyuma ulaşır; ötesinde gecikme büyür ama verim artmaz.
Bu rakamlar bir taahhüt değil, kendi donanımınızda tekrarlayacağınız bir ölçümün örneğidir. Araç, sonuçların yanına ölçüm koşullarını da basar: koşulsuz bir yük rakamı pazarlama cümlesidir, mühendislik verisi değil.

Kapsam bir hedef değil, gerileme kapısıdır

Ölçülen kapsam: satır %80,7 · dal %54,3 · metot %90. CI’daki eşikler bunun hemen altındadır (satır 80, dal 54) ve bilinçli olarak öyledir. Amaç yüksek bir rakama ulaşmak değil, testsiz kod eklendiğinde oranın düşüp PR’ın kırılmasıdır. Oran yükseldikçe eşik de yükseltilmelidir. Kendi çatalınızda eşikleri ortam değişkeniyle verirsiniz:
Betik, kapsam dosyası hiç üretilmediyse “yeşil” görünmez. vstest, bozuk bir runsettings dosyasını sessizce yok sayıp 0 ile çıkabiliyor; ölçüm yapılmadan geçen bir kapsam kapısı, hiç kapı olmamasından beterdir.

Mutasyon testi: “davranış gerçekten doğrulandı mı?”

Kapsam “kod çalıştı mı” der; mutasyon “davranış doğrulandı mı” der. Koda kasıtlı küçük hatalar (mutant) enjekte edilir ve testlerin bunları yakalayıp yakalamadığına bakılır.
İlk ölçüm çarpıcıydı: Installments modülünün satır kapsamı %95,6 ama mutasyon skoru %76,99 — 137 kasıtlı hatadan 35’i hiçbir testi kırmadan geçti, 17 mutant hiç kapsanmayan koda düştü. Yüksek kapsam, doğrulanmış davranış demek değildir. Mutasyon pahalıdır (proje başına dakikalar), bu yüzden her PR’da değil CI’da elle (workflow_dispatch) tetiklenir.

İki aşamalı boru hattı

Yük profili de CI’a bir kapı olarak eklenmedi: dakikalar sürer ve paylaşımlı runner’ın gürültüsünde rastgele kırmızı yanardı. Ne zaman ve hangi koşullarda koşacağına insan karar verir. Hızlı aşama kırmızıysa pahalı iş hiç başlamaz. Entegrasyon ile E2E ayrı işlere bölünmedi: kapsam ancak hepsi birlikte koştuğunda anlamlıdır, ayırmak iki runner’ın cobertura dosyalarını birleştirmeyi gerektirirdi — karşılığında kazanç yok. CI çıktıları artefakt olarak saklanır: kapsam raporu, E2E kanıtları (başarısız testin ekran görüntüsü ve izi) ve mutasyon raporu.

Sürüm yükseltme sırası

1

Değişiklikleri okuyun

Konnektör davranışını, hata kodu eşlemesini veya migration’ı etkileyen değişiklikler sürüm notlarında ayrıca işaretlenir.
2

Hızlı testleri koşun

./scripts/test-hizli.sh — Docker gerekmez, saniyeler.
3

Yedek alın

Yükseltme öncesi veritabanı yedeği; ayrıntı İşletim sayfasında.
4

Migration'ı ayrı işle koşun

Üretim kompozisyonunda migrate servisi bunu zaten yapar: şemayı sahip rolüyle kurar ve çıkar, uygulamalar ancak o bittikten sonra kalkar.
5

Sağlık uçlarını doğrulayın

GET /health/ready üç host için de 200 dönmeli. Açılışta sır doğrulaması ve RLS bekçisi zaten koşar — zayıf anahtarla ya da süper kullanıcı bağlantısıyla süreç hiç açılmaz.