Çalışmalar · OT Güvenliği

Read in English →

Testler Yeşil, Davranış Ters

Bir test paketinin tamamının geçmesi rahatlatıcıdır. Fakat testler yalnızca sordukları soruların cevabıdır. Kod ve test aynı sözlüğü, aynı sabiti veya aynı yanlış varsayımı kullanıyorsa sistem kendi içinde kusursuz biçimde tutarlı—ve dış dünyaya göre yanlış—olabilir.

Bu, özellikle protokol mühendisliğinde tehlikelidir. Bir mesaj doğru uzunlukta olabilir, bütünlük kontrolünden geçebilir ve ayrıştırıcı tarafından kabul edilebilir. Yine de “başlat” sandığınız değer gerçekte “durdur” anlamına gelebilir.

Kod ile testin aynı varsayımı paylaşması ve harici doğrulama

Üç ayrı doğruluk iddiası

Bir protokol testinin neyi kanıtladığını ayırmak gerekir:

  1. Sözdizimsel doğruluk:* Mesaj beklenen yapıya ve uzunluğa sahip mi?
  2. Semantik doğruluk:* Alanlar standartta tanımlanan anlamı gerçekten taşıyor mu?
  3. Operasyonel etki:* Hedef sistem mesajı beklenen biçimde yorumlayıp beklenen sonucu üretti mi?

Birinci katmandaki başarı, ikinci ve üçüncü katmanları otomatik olarak kanıtlamaz. Sağlam bir bütünlük değeri, yanlış anlamı yalnızca hatasız biçimde taşımış olabilir.

Aynalı hata nasıl oluşur?

Basit bir örnek düşünelim. Uygulamada A = başlat, B = durdur şeklinde bir tablo var. Test de beklenen sonucu aynı tablodan üretiyor. Gerçek protokol tanımı bunun tersiyse test geçer; çünkü uygulama ile test aynı hatayı paylaşır.

Bu sorun tek dosyayla sınırlı kalmaz. Aynı protokol gerçeği istemciye, paket oluşturucuya, ayrıştırıcıya ve tespit kuralına ayrı ayrı kopyalandığında dört farklı doğruluk kaynağı oluşur. Birini düzeltmek diğerlerini düzeltmez.

Aynı protokol gerçeğinin dört kopyaya ayrışması

Yetkili protokol geliştirme çalışmalarında karşılaştığımız örüntü tam olarak buydu: bir bileşen mesajı üretirken başka bir bileşen ona anlam veriyor, test ise ikisinin ortak varsayımını onaylıyordu. Sorun tek bir programlama hatası değil, kanıt mimarisi* sorunuydu.

İç döngüyü kıran harici oracle

“Oracle”, beklenen sonucun ne olması gerektiğini söyleyen bağımsız otoritedir. Protokol semantiğinde tek bir kaynağa güvenmek yerine üç kanıtı kesiştirmek daha güçlüdür:

Bu üçü aynı şeyi söylüyorsa güven artar. Ayrışırlarsa başarısız testten daha değerli bir sonuç elde ederiz: hangi varsayımın araştırılması gerektiğini biliriz.

Daha güçlü testler için beş uygulama

Bekleneni uygulamadan türetmeyin.* Test vektörleri, üretim kodunun sabitlerini aynen yeniden kullanmamalı.

Alan anlamını açık yazın.* “Değer 2 olmalı” yerine “değer 2, standarttaki X davranışını temsil etmeli” deyin ve kaynağı işaretleyin.

Golden capture kullanın.* Beklenen paket, uygulamadan bağımsız elde edilmiş ve kaynağı bilinen bir yakalamayla karşılaştırılmalı.

Karşı örnek ekleyin.* Yalnız doğru değerin kabulünü değil, ters anlamın reddini veya farklı etki oluşturmasını da sınayın.

Gerçeği tek yerde yönetin.* İstemci, builder, dissector ve tespit içeriği ortak bir şemadan üretilebiliyorsa semantik drift alanı küçülür. Yine de o şemanın kendisi bağımsız kanıtla doğrulanmalıdır.

Yeşil rengin doğru yorumu

“Tüm testler geçti” bir sonuç değil, eksik bir cümledir. Devamı şöyle olmalıdır: hangi davranış, hangi bağımsız kaynağa karşı, hangi ortamda doğrulandı?*

Yeşil test değerlidir. Ancak yalnızca gerçekten ölçtüğü şey için kanıttır.

Kaynaklar