# Bölüm 4 - SMART CONTRACT (Akıllı Sözleşmelerde Birim Testi Yapmaya Yönelik Yönergeler) - Ethereum
Bu yazı Smart Contract - Ethereum notlarının 4. bölümüdür. Temel Smart Contract veya neler olup bittiğini merak ediyorsanız önceki bölümleri bir göz atın. [Bölüm 3](https://hackmd.io/@yigitraphy/SJPULXJiC)
### Birim Testi
Birim testi, sözleşme ayrı ayrı değerlendirir ve her bileşenin doğru çalışıp çalışmadığını kontrol eder.
## 1- Sözleşmenin İş Mantığını ve İş Akışını Anla
Birim testlerini yazmadan önce bir akıllı sözleşmenin hangi işlevleri sunduğunu ve kullanıcıların bu işlevlere nasıl erişip kullanılacağını bilmek yardımcı olur.
Bir sözleşmenin operasyonel iş akışını anlamanın bir diğer faydası da yürütmenin gereksinimleri karşılayıp karşılamadığını kontrol eden birim testlerini yazmaya yardımcı olmasıdır.
## 2- Sözleşmenin Yürütülmesiyle İlgili Tüm Varsayımları Değerlendirin
Bir sözleşmenin yürütülmesiyle ilgili tüm varsayımları belgelemek ve tüm bu varsayımları geçerliliğini doğrulamak için birim testleri yazmak çok önemlidir. Savları test etmek, beklenmeyen yürütmelere karşı koruma sağlamanın yanı sıra sizi akıllı sözleşmelerin modelini kırabilecek işlemler hakkında da düşünmeye zorlar. Daha önce açıklanan açık arttırma sözleşmesi üzerinde çalışan bir geliştirici, negatif testler yapmadan önce kendi davranışı hakkında aşağıdaki **savlardan(bir sözleşmenin neleri yapıp, neleri yapamayacağını belirten basit ifade)**.
- Kullanıcılar, açık artırma başlamış veya bitmiş ise teklif veremezler.
- Açık artırma sözleşmesi, bir teklif kabul edilebilir sınırın altında ise geri döner.
- Teklifi kazanmayı başaramayan kullanıcılara fonları geri verilir.
NOT: Varsayımları test etmenin diğer bir yolu ise sözleşmedeki fonksiyon niteliyicileri, özellikle de **require, assert, if .. else** ifadelerini tetikleyen testler yazmaktır.
## 3- Kod Kapsamını Ölç
Kod kapsamı, kodunuzdaki testler esnasında çalıştırılan dal, satır ve ifade sayısını takip eden bir test metriğidir. Testler iyi kod kapsamına sahip olmalıdır; aksi takdirde, sözleşmenin tüm testleri geçtiği ama yine de kodunda açıklar(zaafiyetler) bulundurduğunu işsaret eden ***"yalancı negatifler"*** alabilirsiniz.
## 4- İyi Geliştirilmiş Test Çerçeveleri Kullanın
Akıllı sözleşme için birim testleri çalıştırmada kullanılan araçların kalitesi hayati önemdedir.
---
## Entegrasyon Testi
Birim testi izole edilmiş sözleşme işlevlerinde hata ayıklarken, entegrasyon testleri bir akıllı sözleşmenin tüm bileşenlerini bir bütün olarak değerlendirir. Entegrasyon Testi, sözleşmeler arası çağrılardan veya aynı akıllı sözleşmedeki farklı işlevler arasındaki etkileşimlerden kaynaklanan sorunları tespit edebilir.
## Özellik Tabanlı Test
Özellik tabanlı test, bir akıllı sözleşmenin tenımlanmış bir özelliği karşılayıp karşılamadığının kontrol edildiği bir süreçtir. Özellikler, farklı senaryolarda doğru kalması beklenen bir sözleşme davranışı hakkındaki gerçekleri ortaya koyar. Statik Analiz ve Dinamik Analiz, özellik tabanlı test yürütmenin iki yaygın tekniğidir.
### Statik Analiz
Bir statik analiz, bir akıllı sözleşmenin kaynak kodunu girdi olarak alır ve sözleşmenin bir özelliği karşılayıp karşılamadığını belirten sonuçları çıktı olarak verir. Dinamik analizin aksine, statik analiz bir sözleşmenin doğruluğunu analiz etmek amacıyla yürütülmesini kapsamaz. Statik analiz bunun yerine bir akıllı sözleşmenin yürütme esnasında takip edebileceği olası tüm yolları anlamaya çalışır.
Lingting ve statik test sözleşmeler üzerine statik analiz çalıştırmanın yaygın yöntemleridir. İkisi de derleyiciden çıktı olarak alınan ***Abstract Syntax Tree*** (Soyut Sözdizimi Ağaçları) ve ***Control Flow Grap*** (Kontrol Akışı Grafikleri) gibi sözleşme yürütmesinin düşük seviye gösterimlerinin analiz edilmesini gerektirir. **Ancak statik analizatörler, genelde daha derin güvenlik açıklarını tespit etme konusunda güvenilmezdir ve aşırı sayıda yalancı pozitifler üretebilirler.**
#### Abstract Syntax Tree (AST)
AST, bilgisayar bilimlerinde bir programın veya kod pasajının yapısını temsil etmek için kullanılan bir veri yapısıdır.

### Dinamik Analiz
Dinamik Analiz, herhangi bir hata izinin belirli özellikleri ihlal edip etmediğini görmek için bir akıllı sözleşmenin fonksiyonlarında sembolik girdiler veya somut girdiler (örneğin bulandırma) oluşturur.
Bulandırma, akıllı sözleşmelerde ki rastgele özellikleri doğrulamak için kullanılan dinamik bir analiz tekniği örneğidir. Bir bulandırıcı, tanımlı bir girdi değerinin rastgele veya hatalı biçimlendirilmiş varyasyonlarıyla birlikte hedef sözleşmedeki fonksiyonları çağırır. Akıllı sözleşme bir hata durumuna girerse (örneğin, bir savın başarısız olduğu durum), sorun işaretlenir ve yürütmeyi hassas yola sokan girdiler bir raporda gösterilir.
#### Kaynak Kodu Doğrulaması
Kaynak kodu doğralaması, sözleşme oluşturma sırasında farklılıklar ortaya çıkarmak için kullanmak üzere sözleşmenin kaynak kodu ile derlenmiş bit kodu karşılaştırmaktır.
#### Tam Doğrulama (Full Verification)
Kaynak kodunu, yorumlar ve değişken adları gibi derlenmiş bit kodunu etkilemeyen bazı bölümleri vardır.
Meta veri dosyası, sözleşmenin derlemesiyle ilgili kaynak kodları ve kodların karmalarını da içeren bilgileri barındırır.
Meta veri karmasından yararlanan bu tür doğrulamaya ***tam doğrulama*** denir. Meta veri karmaları eşleşmiyorsa doğrulamada dikkate alınmıyorsa buna, şu anda sözleşmeleri doğrulamanın daha yaygın yolu olan ***"kısmi eşleşme"*** (partial match) denir.

Notların Devamı: [Bölüm 5 - Akıllı Sözleşmeleri Yükseltmek](https://hackmd.io/@yigitraphy/S16BV6loA)