Sunday, October 22, 2006

Software Testings

Yazılımı yazıyoruz ama testini yapıyor muyuz? Test etmek için kullanılan bir kaç felsefeyi buraya yazmayı uygun gördüm:

Regression Testinglar
Regression testing nedir? Bir yazılım sürecinde yazılımı geliştirdikçe bir yandan da ortaya çıkan hataları düzeltiriz. Bug olarak adlandırdığımız bu hatalar düzeltilmesine rağmen, yazılım geliştikçe yeni modüller eklendikçe yada başka hatalar düzeltikçe tekrara ortaya çıkabilir! Bunun için yazılımın belli anlarında, eskiden düzeltilmiş olan hatalar tekrar test edilmelidir. Eski bugların tekrar ortaya çıkma ihtimaline karşı yazılımı kontrol etmeliyiz. Regression testing bu amacı güder.

Unit Testing
Unit testing denilen test bicimi, yazılımın belirli modüllerini tüm test koşullarıyla test etmektir. Unit testing yazılımı oluşturan bağımsız modüllerin doğru bir şekilde çalıştığını göstermeyi hedefler.
Fakat unit testing yazılımdaki her hatayı bulamaz. çünkü sadece bireysel modülleri kendi başına test eder, bir modülün diğer modül ile olan bağlantısı test edilmez. Bir başka sorun da bir modülü test edebilmek için gerekli olan input sayısının sonsuza gitmesidir. Modüle verilecek giriş sayısı sonsuz olamayacağından unit testing hataların yokluğunu değil hataların varlığını gösterebilir.

Integration Testing
Bireysel modüllerimizi unit testing aşamasından geçirdik ama hayla modüller birlikte çalışırken düzgün çalışırlar mı bilemeyiz. Bunun için integration testing uygularız. Bu test in girişleri modüllerdir. Testin amacı modüllerin birlikte çalıştığını doğrulamakttır. Paylaşılan bellek bölgeleri, IPC ( inter process control ) gibi processlerin ortak kullandıkları yapılar test edilir. Integration testing, unit testingden sonra gelir ve yazılımı system testing için hazırlar. Integration testing yaparken uygulanacak test stratejileri bu testi kategorilere koyar. Bunlar: Big Bang, Top Down, Bottom Up, ve Back bone test stratejileridir.

System Testing
System testing, integration testing den sonraki aşamadır. Integrasyonluğu doğrulanmış modüller birleştirilip en son yazılım ortaya çıkarıldıktan sonra system testing uygulanır ve bu yıkıcı en son testdir. System testing uygularken black-box yaklaşımı kullanılır. Yani kod a bakılmaz inputlar verilir ve sistemin ayakta kalıp kalmadığına bakılır. Alpha ve beta olarak iki fazı vardır.

Acceptence Testing
Buraya kadar olan test metodları yazılımı üreten programcılar ve test takımları tarafından yapılıyordu. Yani yazılım şirketi kendi yazılımını test ediyordu. Acceptence testing de ise kullanıcılar ve diğer üreticler de yazılımı test ederler. Bu yazılım da black-box yaklaşımı ile çalışır.

Özetlersek, bir yazılımı test etmek için gerekli olan en temel testleri soyledik. Tabiki bu testlerden başka daha bir çok test de mevcuttur. Bunlar:
# Functional testing
# User interface testing
# Usability testing
# Compatibility testing
# Model based testing
# Error exit testing
# User help testing
# Security testing
# Capacity testing
# Performance testing
# Sanity testing
# Regression testing
# Reliability testing
# Recovery testing
# Installation testing
# Maintenance testing

olarak sayılabilir. Bir yazılım sürecinde bizim bahsettiğimiz testler şu sırada gerçekleşir.

Unit testing -> integration testing -> system testing -> acceptence testing.
ve regression testing ise her önemli değişiklikte eski hataları test etme biçiminde bütün yazılım sürecinde uygulanır.

Saturday, October 21, 2006

Kernel tipleri

Kernel işletim sisteminin bir parçasıdır. Process scheduling, memory management, thread management gibi management işleri ile uğraşır daha çok. Donanım( hardware ) ile kabuk ( shell ) arasında bağlantı oluşturur. Demek istediğim kullanıcılar direk olarak donanıma erişemezler. sistem çağrılarını kullanırlar. sistem çağrılarını kernele ulaşan fonksyonlar olarak düşünebiliriz.
"Kernel attack" linuxte handle edilemeyen errorleri belirtir. ( %30 ingilizce yazıyorum :) ) bir process te bir hata olduğu zaman eğer bu hata fatal ise kernel attack oluşur.
Günümüzde ki popüler işletim sistemlerine baktığımızda kernel i genel olarak 3 gruba ayırabiliriz ki bu grupların sayısı gerçekte daha fazladır.
1) Monolitik kernel: Tüm kernel kodu tek bir yerde bulunur. Bütün kernel, kernel space de çalışır. Bu kerneller çok yer kaplar ama hızlıdır. Linux gibi işletim sistemlerinde kernele modül eklemek mümkündür ancak bu ekelenen modüllerde kernel space de çalışmaktadır.
2) Mikrokernel: Kernel, kernel space de minumum tutulmuştur. genel olarak process scheduling memory management gibi hayati işleri ele alır. Sisteme modül eklenebilir dışardan. Bu eklenen modüller genel olarak user space te çalışır. Bu yüzden biraz daha yavaş kaçar. Çünkü user space ten OS hizmetleri system call lar aracılığı ile çalıştırılır.
3) Hybrid kernel: Bu da yukardaki iki maddenin karışımıdır. Windows NT nin nasıl bir kernel olduğu meçhuldür :) bu konuda ms de çalışanlarda tam emin değildir. Her nekadar ilk çıktığı sırada mikrokerneldir denildiyse de daha sonraları bu görüş değişti. Şu anda hybrid ve monolitik diyenlere rastlayabilirsiniz....