# VC-103 · Test çalışıyor ama beklenen sonucu doğrulamıyor veya hatalı sonucu onaylıyor

Test dosyası yeşil görünüyor fakat beklenen sonuçla gerçek sonuç karşılaştırılmıyor. Uygulamadaki yanlış davranış teste de kopyalanınca hata testten geçerek korunuyor.

- Önem: ORTA. Etkisi sınırlı. Her gün, sıradan kullanımda tetiklenir.
- Önem notu: Her çalıştırmada yanlış güven veren kontrol esas alınır. Etki doğrulanmayan davranışın iş değerine bağlıdır. Her test aynı ayrıntı düzeyini gerektirmez, yalnız çalışabilmeyi sınayan smoke testin amacı açık olmalıdır.
- Eksen ve kategori: Sağlamlık, 16 Sözleşmeler ve testler
- Yığın: Her yığın
- Yapay zekâ kodunda: ölçülmedi. Dayanak: uzman görüşü.
- Ne zaman bakılır: İlk yayından önce, Her ay
- CWE: yok. Testin yetersiz beklentiyle yazılması doğrudan tek bir kod zayıflığı değildir. Testin sakladığı kusur belirlenmeden CWE numarası atanmaz.
- Checklist ifadesi: Testler beklenen sonucu gerçekten kontrol ediyor ve hatalı kodda düşüyor.
- Son inceleme: 4 Ekim 2026, Komünite editörlüğü
- Adres: https://vibecheck.komunite.com.tr/madde/test-davranisi-dogrulamiyor-veya-hatayi-onayliyor

## 60 saniyelik kontrol

Yalnız kendi uygulamanda ya da yazılı izin aldığın sistemde dene. Bu bir sızma testi değildir.

1. Testte uygulama sonucunun hangi bağımsız beklentiyle karşılaştırıldığını bul.
2. Test edilen davranışı geçici bozunca kontrolün düştüğünü doğrula.
3. Beklenen değerin aynı hatalı işlevden hesaplanıp hesaplanmadığını incele.
4. Asenkron kontrolün beklendiğini ve atlanan test bulunmadığını kontrol et.

## Ne oluyor

Test takımı yeşil. Bu görüntü davranışın doğru olduğunu düşündürüyor. Oysa bir test yalnız işlevi çağırıp sonucu hiç incelemeyebilir. Daha yanıltıcı biçimde, yanlış çıktı beklenen değer olarak yazılmış olabilir. Uygulama ve test aynı hatada anlaşınca testin geçmesi iş kuralını doğrulamaz.

Bir assertion, yani beklenti denetimi bulunması da tek başına yeterli değildir. Gerçek değeri yine kendisiyle karşılaştırmak veya beklenen değeri test edilen işlevden hesaplamak çoğu hatayı görünmez kılar. Mock'un önceden ayarlanmış cevabını tekrar okumak, gerçek veri yolunun çalıştığını göstermeyebilir. Testte neyin yanlış olması halinde başarısızlık oluşacağı anlaşılmalıdır.

Örnekte indirim sonrası tutar negatif olamaz. Fakat normal indirim de uygulanmalıdır. Her çağrıda sıfır döndüren bir işlev ilk koşulu karşılar, işin tamamını karşılamaz. Bu yüzden hem normal örnek hem sınır hem geçersiz girdi gerekir. Testin değeri yalnız satır sayısıyla veya yeşil işaretle ölçülmez. Tanımlı sözleşmeyi bozan ilgili varyantı yakalayabilmesi gerekir.

## Gerçek olay

Bu madde belirli bir AI test üretim ölçümünü kullanmıyor. Node.js assertion belgesi, eşitlik ve hata beklentilerinin nasıl doğrulandığını açıklıyor. Asenkron hata denetimi bir Promise döndürdüğünden tamamlanmasının beklenmesi gerekir. [Assertion API'si](https://nodejs.org/api/assert.html)

NIST rehberi de beklenen davranıştan türetilen testlerle kod yapısından türetilen testleri ayrı ele alıyor. Önceki hataları yakalayan regresyon kontrollerinin yeniden kullanılmasını öneriyor. [Doğrulama yöntemleri](https://www.nist.gov/itl/executive-order-14028-improving-nations-cybersecurity/software-supply-chain-security-guidance-3) Buradan çıkan editoryal ölçüt, testin uygulama koduna bakmadan tarif edilebilen bir beklenti taşımasıdır. Test dosyasının varlığı veya başarılı çalıştırılması bu beklentinin doğru olduğunu tek başına kanıtlamaz. Eksik test niteliğine doğrudan bir CWE numarası atamıyoruz, saklanan kod hatası varsa ayrıca değerlendiriyoruz.

## Yapay zekâ bunu neden üretiyor

**Model mevcut çıktıyı sözleşme sayabilir.** Ajan test yazarken uygulamayı çalıştırır ve aldığı sonucu beklenen değer olarak kaydeder. Bu yöntem bazı karakterizasyon çalışmalarında yararlıdır, fakat mevcut hatayı doğru davranış diye sabitleyebilir. İş kuralı ayrıca okunmadığında yanlış sonuç teste taşınır. Beklentinin kaynağının ürün kararı mı yoksa yalnız mevcut çıktı mı olduğu belirtilmelidir.

**Yeşile dönme hedefi anlamı gölgeleyebilir.** Başarısız test gösterildiğinde ajan uygulama yerine beklentiyi değiştirebilir. Yeni beklentinin iş sözleşmesine uygunluğu incelenmezse hata sessizce kabul edilmiş olur. Test güncellemek kendi başına yanlış değildir. Davranış gerçekten değiştiyse yeni beklenti gerekir. Ancak değişikliğin gerekçesi yalnız komutun başarılı çıkması olmamalıdır. Beklenen davranış önce açıklanmalıdır.

**Mock kolaylığı gerçek yolu örtebilir.** Ajan dış bağımlılığı taklit ederken incelemek istediği işlevin kendisini de sahte sonuçla değiştirebilir. Test bu durumda önceden ayarlanmış cevabı geri alır. Uygulama kodunun filtre, sıralama veya hata yolu hiç çalışmaz. Hangi katmanın gerçek, hangisinin taklit olduğu açık yazılınca kanıtın sınırı daha kolay anlaşılır. Dış bağımlılığı taklit etmek bütün testi değersiz yapmaz.

**Asenkron iş bitmeden kontrol tamamlanabilir.** Sonucun beklenmediği bir deneme, doğrulama yürütülmeden bitmiş görünebilir veya geç gelen hatayı yanlış yere bağlayabilir. Ajan test biçimini örnekten kopyalarken bu yaşam döngüsünü atlayabilir. Kontrolün gerçekten tamamlandığını sınamak gerekir. Bu açıklamalar olası mekanizmalardır. Belirli bir modelin ürettiği testlerin hangi oranının zayıf olduğunu ölçtüğümüz anlamına gelmez.

## Etki

Hata test tarafından korunmaya başlayabilir. Sonraki geliştirici doğru davranışı eklediğinde mevcut test düşer ve değişikliği yanlış sanabilir. Böylece testin amacı tersine döner. İş kuralı ile beklenen çıktının kaynağı belirsiz kaldıkça inceleme de zorlaşır.

Eksik beklenti daha basit bir yanlış güven yaratır. Test çalışır, fakat davranış bozulduğunda hiçbir sinyal vermez. Öte yandan yalnız modülün açılmasını sınayan smoke testin amacı farklıdır. Böyle bir kontrol yararlıdır, yeter ki bütün iş davranışını doğruladığı iddia edilmesin. Önem notu bu kapsam farkını korur.

## Nasıl anlarsın

Her test için şu soruyu cevapla. Hangi sözleşme ihlali bu testi düşürür? Cevap yalnız işlev hata atarsa ise dönen değerin ve yan etkinin kontrolünü ara. Beklenen değeri test edilen işlevden veya aynı formülün kopyasından üretip üretmediğini incele.

Örnekte test yordamının kendisi sınanır. Doğru fiyat işlevi geçer. Negatif sonuç veren, indirimi yok sayan, her durumda sıfır döndüren ve geçersiz girdiyi kabul eden varyantlar aynı yordamdan geçemez. Bu küçük bozmalar testin hangi hataları yakaladığını somutlaştırır. Bütün olası hataları kapsadığını göstermez.

## Nasıl düzeltirsin

1. **Sözleşmeyi yaz.** Girdi, beklenen çıktı ve geçersiz durumun davranışını ürün dilinde belirle. Mevcut sonuç tek başına kaynak olmasın.
2. **Gözlenebilir sonucu seç.** Dönen değer, kalıcı kayıt veya dış çağrı gibi iş açısından anlamlı bir şeyi doğrula. Yalnız testin iç değişkenlerini sayma.
3. **Sınırları ekle.** Normal indirim, tam tutar kadar indirim, tutarı aşan indirim ve geçersiz tutar farklı beklentilerdir.
4. **Kontrolü bozarak dene.** İlgili hatayı geçici varyantta yeniden oluştur. Test hâlâ geçiyorsa neyi kaçırdığını incele.
5. **Tamamlanmayı bekle.** Asenkron denetimleri bekle ve atlanan testleri rapordan saklama. Koşucunun sonucunu gerçekten oku. [Node test koşucusu](https://nodejs.org/api/test.html)

## Bir daha olmasın

Test değişikliğini uygulama değişikliği kadar gerekçelendir. Beklentinin iş kuralını mı yoksa mevcut davranışı mı kaydettiğini açık tut.

## Sınır

Her testte aynı sayıda assertion bulunması gerekmez. Smoke, performans ve entegrasyon kontrolleri farklı kanıtlar üretir. Küçük bozuk varyantları yakalamak tam doğruluk ispatı değildir. Örnek tutarları tam sayı birimindedir, gerçek para birimi, vergi veya yuvarlama sözleşmesi kurmaz. Yetkinin reddedilmesi gereken yollar ve test kanıtının aday sürüme bağlanması ayrı maddelerde ele alınır.

## Düzeltme kodları

### Node.js: Sözleşme ve bozuk sürüm karşılaştırması

Önce:

```js
// fiyat/sozlesme.js, açıklama amaçlı. Test yordamının kendisi örnekleniyor.
import assert from 'node:assert/strict';
export function verifyDiscount(net) {
  const actual = net(100, 20);
  // Uygulama çıktısı beklenen değer yerine yine kendisiyle karşılaştırılıyor.
  assert.equal(actual, actual);
  // Sadece hata atmadan çağrılabilen yol yeşil olur.
  net(20, 30);
}
// Sözleşme: tutar ve indirim negatif olmayan tam sayı birimindedir.
// İndirim tutarı aşınca sonuç sıfırdır, negatif fatura olmaz.
// Normal indirim de uygulanmalıdır, her durumda sıfır dönmek doğru değildir.
// Geçersiz değer reddedilir.
// Bu beklentilerin hiçbiri kötü sürümde gerçekten doğrulanmıyor.
// Deney gerçek ödeme veya fiyatlandırma hizmeti çağırmaz.
```

Sonra:

```js
// fiyat/sozlesme.js, açıklama amaçlı. Test yordamının kendisi örnekleniyor.
import assert from 'node:assert/strict';
export function verifyDiscount(net) {
  assert.equal(net(100, 20), 80);
  assert.equal(net(20, 30), 0);
  assert.equal(net(20, 20), 0);
  assert.equal(net(100, 0), 100);
  assert.equal(net(0, 0), 0);
  assert.throws(() => net(-1, 0));
  assert.throws(() => net(10, -1));
  assert.throws(() => net(1.5, 0));
  assert.throws(() => net(NaN, 0));
}
// Beklenen tutarlar bağımsız iş kuralından gelir, net ile hesaplanmaz.
// Her durumda sıfır, indirimi yok sayma ve negatif sonuç ayrı hatalardır.
```

Düzeltmeyi kanıtlayan test:

```js
// fiyat/sozlesme.test.mjs, açıklama amaçlı. Doğru ve bilerek bozuk varyantlar.
import test from 'node:test';
import assert from 'node:assert/strict';
const { verifyDiscount } = await import(process.env.ORNEK_DOSYA);
const validInput = (price, discount) => {
  if (![price, discount].every(Number.isSafeInteger) || price < 0 || discount < 0) {
    throw new Error('INVALID_AMOUNT');
  }
};
const correct = (p, d) => { validInput(p, d); return Math.max(0, p - d); };
test('test yordamı doğru sürümü geçirir, sözleşme ihlallerini yakalar', () => {
  assert.doesNotThrow(() => verifyDiscount(correct));
  const mutants = [
    (p, d) => { validInput(p, d); return p - d; },
    (p, d) => { validInput(p, d); return p; },
    (p, d) => { validInput(p, d); return 0; },
    (p, d) => Math.max(0, p - d),
  ];
  for (const mutant of mutants) {
    assert.throws(() => verifyDiscount(mutant), { code: 'ERR_ASSERTION' });
  }
});
```

## Ajan kuralı (AGENTS.md)

```md
## Yeşil test davranışı sınamıyor (vibecheck VC-103)
- Beklenen sonucu iş sözleşmesinden türet.
- Gerçek çıktıyı veya gözlenebilir yan etkiyi doğrula.
- Asenkron beklentileri await ile bekle.
- İlgili hatayı yeniden koyunca testin düştüğünü göster.
- Yalnız yeşile dönsün diye beklentiyi değiştirme.
```

## Kaynaklar

1. [Node.js Assert API](https://nodejs.org/api/assert.html), Node.js
2. [Node.js Test Runner](https://nodejs.org/api/test.html), Node.js
3. [Recommended Minimum Standard for Vendor or Developer Verification of Code](https://www.nist.gov/itl/executive-order-14028-improving-nations-cybersecurity/software-supply-chain-security-guidance-3), NIST, 7 Ekim 2021

---

vibecheck · Komünite editörlüğü. Metin CC BY 4.0, prompt ve kural parçaları MIT-0. Kaynak: https://vibecheck.komunite.com.tr/madde/test-davranisi-dogrulamiyor-veya-hatayi-onayliyor
