Archi-Civilarchi-civil.com
Savunabileceğiniz Hesaplar · HES-01  |  Güven: A

Ana Sayfa / Yazılar / Savunabileceğiniz Hesaplar HES-01

Testler Neden Yanlış Değeri Onaylar?

Bu sitenin hesap motorlarında bir denetim sırasında beş hesap hatası bulundu. Hepsinin testi vardı ve hepsi testlerden geçiyordu. Bu yazı, bir testin bir hatayı nasıl "onaylayabildiğini" ve bunun nasıl önleneceğini anlatıyor.

Güven: A Motor: engine/statics.js Test: tests/statics.test.js Okuma: ~11 dk Son doğrulama: 2026-10-21 English: read in English
Hesap aracını aç →Sonraki yazı → Tüm yazılar →

1. Bir itiraf

archi-civil.com'un sloganı "savunabileceğiniz hesaplar". Ekim 2026'da sitenin hesap motorları sistematik olarak denetlendi ve beş hesap hatası bulundu. Bu yazı o hataları saklamak yerine anlatıyor, çünkü her biri, mühendislik yazılımında doğruluğun nasıl sağlanmadığına dair genel bir ders taşıyor. Hepsi düzeltildi ve hepsi artık hatayı yakalayan testlerle korunuyor.

2. Beş hata, beş test

HataBelirtiTestler neden yakalamadı?Düzeltildi
Güneş azimutuÖğlede 180°, doğrusu 0°Test, öğlede 180° bekliyorduv565
Kinetik cepheGüney cephe yaz öğlesinde "güneş arkada"Test, güney cepheyi 180° ile temsil ediyorduv566
Kafes çubuk kuvvetleriHer kuvvet çubuk boyuna bölünmüşTestler yalnızca tepkileri denetliyorduv569
Cross yöntemiİki eşit açıklıkta 45 yerine 15 kNmTek doğru çıkan durum, dağıtma gerektirmeyen simetrik durumv570
Cross örnek çözümü"M_B = −qL²/8 = −18" (qL²/8 = 54; doğrusu 36)Doğrulama tablosu doğru hesabı yanlış beklenenle karşılaştırıyorduv570

Dikkat çekici olan şu: Beş hatanın hiçbiri test edilmemiş bir koddan çıkmadı. Hepsinin testi vardı ve hepsi geçiyordu.

3. Kâhin sorunu

Bir test iki şeyden oluşur: kodun ürettiği sonuç ve doğru sonucun ne olduğu bilgisi. Yazılım mühendisliğinde ikincisine "kâhin" (oracle) denir. Test, ancak kâhini kadar iyidir. Kâhin yanlışsa, test yanlış sonucu onaylar ve bunu güvenle, her seferinde yapar. Beş hatanın her biri, kâhinin bir biçimde bozulduğu bir durumdu.

4. Kalıp 1: beklenen değer koddan kopyalandı

Güneş azimutu testinde öğle vakti beklenen değer 180° olarak yazılmıştı. Oysa sayfanın kendi etiketi "güney = 0°" diyordu; öğlede güneş tam güneydedir ve doğru değer 0°'dir. Büyük olasılıkla test yazılırken kod çalıştırılmış, çıkan değer beklenen değer olarak teste kopyalanmıştı. Böyle bir test, kodun değişmediğini denetler; doğru olduğunu değil. Kinetik cephe testi de aynı kalıptaydı: Güney cepheyi kodun kuralına göre 180° ile temsil ediyordu.

Ders: Beklenen değer koddan değil, koddan bağımsız bir kaynaktan gelmelidir: elle çözüm, bir ders kitabı örneği, bir fiziksel gerçek ("öğlede güneş güneydedir").

5. Kalıp 2: yanlış şey denetlendi

Kafes motorunun testleri mesnet tepkilerini dikkatle denetliyordu, işaretleri bile. Ama kullanıcının asıl gördüğü çubuk kuvvetlerine hiç bakmıyordu. Hata da tam oradaydı: Rijitlik matrisi ile kuvvet hesabı farklı varsayımlarla yazılmıştı ve her çubuk kuvveti çubuk boyuna bölünmüş çıkıyordu. Tepkiler kendi içinde tutarlı olduğu için doğruydu.

Ders: Kullanıcıya gösterilen her çıktı denetlenmelidir. Denetimde bu kalıbı bulmak için sayfaların gösterdiği alanlarla testlerin başvurduğu alanlar otomatik olarak karşılaştırıldı.

6. Kalıp 3: kolay durum denetlendi

Cross yöntemi motoru, iki ucu ankastre simetrik bir kirişte doğru sonuç veriyordu. Bu durumda orta düğüm başlangıçta zaten dengededir; yani motor hiç dağıtma ve taşıma yapmaz. Hata tam da bu adımdaydı: Taşıma, aynı çubuğun karşı ucu yerine komşu açıklıklara yapılıyordu. Yalnızca kolay durum denetlendiği için hata görünmez kalmıştı.

Örnek sayfası ise başka bir biçimde bozuktu: "Analitik" çözüm hem aritmetik olarak (qL²/8 = 54, 18 değil) hem mekanik olarak (simetride orta mesnet dönmez, doğru değer qL²/12 = 36) yanlıştı. Sayfanın doğrulama tablosu doğru hesabı bu yanlış değerle karşılaştırıyor ve %200–300 sapma gösteriyordu.

Ders: Testler, algoritmanın bütün adımlarını çalıştıran durumları içermelidir. En güçlü yöntem, rastgele üretilmiş çok sayıda durumu bağımsız bir yöntemle karşılaştırmaktır.

7. Ne işe yaradı?

Bir sonraki yazı, aynı denetimin ikinci dersini anlatıyor: Bir hesabı okumak ile doğrulamak arasındaki fark.

Kaynaklar

  1. archi-civil.com sürüm notları (README), v565–v572: her hatanın belirtisi, nedeni, düzeltmesi ve eklenen testler.
  2. Barr, E. T., Harman, M., McMinn, P., Shahbaz, M. ve Yoo, S. (2015). The Oracle Problem in Software Testing: A Survey. IEEE Transactions on Software Engineering, 41(5), 507–525.
  3. Jia, Y. ve Harman, M. (2011). An Analysis and Survey of the Development of Mutation Testing. IEEE Transactions on Software Engineering, 37(5), 649–678.

Yazıdaki sayılar sitenin motorlarıyla üretilmiştir; yönetmelik değerleri kaynak madde numarasıyla verilmiştir.

archi-civil.com — Testler Neden Yanlış Değeri Onaylar? · HES-01 ·