Kısaca Test Türleri

Hatice Ergün
6 min readNov 29, 2020

--

Bu yazıda, test türlerinden ve hangi projelerde hangi testler nasıl uygulanıyor bunlardan bahsedeceğim.

Çalıştığım şirkette PHPUnit ile birim test yazıyoruz. Bazen backend ekibi olarak, ‘şu an gerçekten birim testi yazmış olmuyoruz galiba bağımlılık var bu fonksiyonda, bağımlılık varsa entegrasyon testi olur dmi’ gibi karmaşalar yaşayabiliyoruz. Bizim projemizde gerçekten birim test yazmak yeterli mi? entegrasyon testlerine mi daha çok ağırlık vermeliyiz? hangi tür projeler için hangi testler daha uygundur? gibi konular üzerine düşünmeye başladım. Test türleri nelerdir, amaçları nelerdir, hangileri hangi durumlarda kullanılır, tüm test türlerini uygulamak doğru mudur yoksa test için ayırılan zamanı daha mı işlevsel kullanmak gerekir, sadece ihtiyaç olan test türlerini mi kullanmak lazım gibi sorulara yanıt aramaya başladım. Araştırmalarımı not haline getirip burada paylaştım.

Test Türleri

Test için ayrılan zamanı doğru şekilde değerlendirmek gerekir. Eğer test için oldukça zaman ayırabiliyorsanız, birkaç testin aynı proje içinde uygulanması mümkündür. Projenin türüne bağlı olarak, hangi testleri uygulayacağınız hangilerini tercih edeceğiniz sizin projenizin önemli olan özelliklerine göre belirlenmelidir. Zaman, kaynak gibi dinamikler de göz önüne alınarak tercihler yapılmalıdır.

Test türleri 4 başlıkta inceleniyor.

  1. Unit Test (Birim Testi)
  2. Integration Test (Entegrasyon Testi)
  3. Functional Test (Fonksiyonel Testi)
  4. Acceptance Test (Kabul Testi)

1. Unit Test (Birim Testi)

Birim, projenin en küçük yapısına denir. Projeye göre, en küçük yapı; fonksiyon, metod, sınıf veya bir uygulama olabilir. Amaç, projeyi olabilecek en küçük birimlere ayırmak, bağımlılıklardan kurtarmak ve test etmek. Birim testi diğerlerinden ayıran en önemli özellik; herhangi bir bağımlılık olmadan sadece ilgili kod parçasını test ediyor olmasıdır.

Doğrudan proje içerisinde birim test yazmak için programlama dillerinin test frameworkleri vardır. Örneğin,
PHP için; PHPUnit, Behat, PHPSpec vs.
Java için; JUnit, Hamcrest, AssertJ vs.
.Net için; NUnit
NodeJs için; Mocha, Chai
Bunların hepsi temelde aynı prensiple çalışır. Amaç projenin birimlerini test etmektir. Daha önce yazdığım Kısaca PHPUnit yazısından PHPUnit için detaylı bilgi alabilirsiniz.

Peki hangi tür projelerde unit test yazılır hangilerinde yazılması çok işlevsel olmaz?

Tek bir amaçla üretilen projelerde, eğer projenin fonksiyonları bağımlılıklar içermiyorsa, başka servislerle entegre bir şekilde çalışmıyorsa ve önemli olan projenin birimlerinin doğru çalışması ise; evet unit test yazılması işlevseldir. Örneğin framework’ler; Kendi içindeki fonksiyonların kullanılmasını amaçlayan projelerdir. Belli bir amaç için farklı projelerle entegrasyonu minumum seviyede olacak şekilde geliştirilirler. Bu kapsamda framework projelerinin birim testinin yazılması oldukça önemli ve akıllıca bir tercihtir. Ancak birbiriyle entegre bir şekilde çalışan bir sürü bağımlılığı olan bir projede Entegrasyon testi yazmak çok daha akıllıca olabilir.

2. Integration Test (Entegrasyon Testi)

İki ya da daha fazla bağımlılık içeren kodların birlikte çalışmasını test etmektir. Test ortamı gerçek ortama göre hazırlanır ve bir bütün olarak test yapılır. Birim testi yazılmış olan bir projeye entegrasyon testi uygulanıyorsa da aynı şekilde yazılan kodlar test ortamına gönderilir ve entegrasyon testi bu aşamada yapılır. Eğer bir projede, sayfaların doğru çalışması ve entegre olan yazılımların sağlıklı çalışıyor olması çok daha önemliyse; Entegrasyon testlerine ağırlık vermek daha avantajlıdır.

Bir projede entegrasyon testleri yazmak için birim test frameworklerini kullanabilirsiniz. Buna ek olarak her bir deploy işleminde sürekli entegrasyon testinin yapılıyor olması için CI/CD uygulanır. Travis-CI veya Gitlab CI/CD gibi araçlar size yardımcı olacaktır.

3. Functional Test (Fonksiyonellik Testi)

Fonksiyonel test bir özelliğin çalışmasını test ederken sonuç odaklı çıkarımlar yapmayı hedefler. Amaç işlevin çalışıp çalışmadığını test etmektir. İşlevin çalışması için gerekli olan bilgilerin dataların vs. doğruluğunu önemsemez. Örneğin bir sayfada yorum gönder butonuna basıldığında yorum gönderildi bilgisinin alınması testi bir fonksiyonel testtir. Gerçekten yorumun gönderilip veritabanına kaydedilip kaydedilmediği ile ilgilenmez. Yorum gönderildi mi kaydedildi mi veritabanına eklendi mi vs gibi sorular entegrasyon testinin görevidir.

Projenize fonksiyonel test eklemek istiyorsanız; HP UFT, JMeter gibi test araçlarını kullanabilirsiniz.

4. Acceptance Test (Kabul Testi)

Son kullanıcı testi olarak kabul edilir. Son kullanıcı proje hakkında hiçbir şey bilmez ve projeyi kendi kendine belli amaçlar doğrultusunda kullanmaya çalışır. Sistem istenilen ihtiyaçlara cevap veriyor mu test edilir. Tüm pencereler, butonlar, açılır menüler vs. çalışıyor mu kontrol edilir. Bunun yanı sıra ekleme çıkarma silme gibi işlemler de test edilir. Son kullanıcının projeyi kullanabilmesi yeteneği gözlemlenir.

Kabul testlerini uygulamak için UAT Testi oluşturulur ve ilgili süreçler takip edilir.

Testler ayrıca türlerine göre sınıflandırılırlar;

Test Sınıflandırması

Testler, functional (Fonksiyonel) ve non-functional ( Fonksiyonel Olmayan) olarak ikiye ayrılırlar.

Functional Testing (Fonksiyonel Test)

Fonksiyonel testlerin amacı kodun çalıştığını test etmektedir. Burada fonksiyonel testler neler bunlardan bahsedeceğiz. Bu testlerin her biri ayrı bir ihtiyaç için kullanılmaktadır. Fonksiyon testleri kod olarak aynı şekilde yazılırlar. Yazılan test kodunun türü, kullanılan yöntem ve yaklaşımlara göre değişiklik gösterir.

Projenize fonksiyonel test uygulamak için kullanabileceğiniz araçlar; Micro Focus UFT, Selenium, JUnit, soapUI, Watir vs.

  • Unit testing (Birim test)
  • Integration testing (Entegrasyon testi)
  • System testing (Sistem testi) ; Yük, performans, güvenilirlik ve güvenlik testlerini içerir. Amaç, tüm sistem gereksinimleri karşılıyor mu tespit etmektir. Sistem testi için; Cucumber, Protractor, Jasmine, Karma araçlarını inceleyebilirsiniz.
  • Sanity testing (Doğruluk testi) ; Herhangi bir hatadan sonra, o hata giderildikten sonra yapılan testlerdir. Amaç projenin bir sonraki teste hazır olup olmadığını tespit etmektir.
  • Smoke testing (Duman testi) ; Tüm sistemin genel olarak çalışyor olup olmadığını test eder. Önemli özelliklerin çalışıyor olmasını kontrol eder. Kapsamlı bir test değildir. Proje çalıştığında projeden duman çıkmıyorsa sonraki test için proje hazır, denir.
  • Interface testing (Arabirim testi) ; Kullanıcı arayüzü testleridir. Projenin son kullanıcı tarafından görünen tüm fonksiyonlarının doğru bir şekilde çalışıp çalışmadığını test eder. Bu testler test otomasyonları tarafından yapılır. Selenium, Cypress, Ghost Inspector, WatiN, Appium gibi araçlarla bu testler yapılabilir.
  • Regression testing (Tekrar testi) ; Yapılan değişikliklerin sistemi bozup bozmadığını kontrol eder. Yeni eklenen özellikler sonrasında tüm sistemin çalışması tekrar testi ile kontrol edilir.
  • Acceptance testing (Kabul testi) ; Projenin müşteri tarafından kabul edilip edilmeyeceğini test etme aşamasıdır. Amaç hata bulmak değil projenin canlı ortama alınması için hazır olduğunu teyit etmektir. Bu testler müşteri veya son kullanıcı tarafından yapılır. Alfa ve Beta testleri bu kategoride yer alır.

Non-functional Testing (Fonksiyonel Olmayan Test)

Projenin işlevsel olmayan, doğrudan kod’la alakalı olmayan kısımlarını test etmeyi amaçlar. Kullanıcı memnuniyetine yönelik testler yapılır. Fonksiyonel olmayan testler, fonksiyonel testlerden sonra yapılır. Bu aşamada, proje bitmiştir ve artık projenin farklı şartlar altında nasıl çalıştığı test ediliyordur.

  • Performance Testing (Performans testi) ; Projenin iş yükü karşısında ne kadar hızlı ve kararlı çalıştığını test eder. Projenin kaynakları kullanırkenki performansını ölçer. Load testing (Yük testi), Stress testing (Stres testi), Volume testing (Hacim testi), Reliability testing (Güvenilirlik testi) gibi testler bu kategoride yer alır. Performans testleri için kullanılabilecek araçlar; WebLOAD, LoadView, NeoLoad, LoadNinja, Appvance, LoadRunner, Apache JMeter, Loadster, LoadImpact, Testing Anywhere, SmartMeter.io, Tricentis Flood, Rational Performance Tester, LoadComplete.
  • Security testing (Güvenlik testi) ; Projenin herhangi bir güvenlik açığı olup olmadığını tespit etmek amacıyla bu testler yapılır. Kullanılabilecek araçlar; Grabber, Arachni, Iron Wasp, Nogotofail, SQLMap, W3af, Wapiti, Wfuzz, Zed Attack Proxy.
  • Compatibility testing (Uyumluluk testi) ; Projenin farklı donanım cihazlarında, farklı tarayıcılarda veya farklı işletim sistemlerinde çalışmasını test eder.
  • Install testing (Yerelleştirme testi) ; Eğer ilgili proje bilgisayara kurulan bir projeyse genellikle bu test uygulanır. Kurulan makinenin zaman dilimi, klavye özellikleri, dil, sembol gibi bileşenlerin farklılıklarını test eder.
  • Recovery testing (Kurtarma testi) ; Herhangi bir hata sonucu sistem çalışmaz, donanımsal veya ağ kaynaklı bir sorun yaşarsa; sistem işlem eksikliği olmadan adımlara devam edebiliyor mu? testi yapılır.
  • Usability testing (Kullanılabilirlik testi) ; Projenin; kolay anlaşılır, kullanıcı kitlesine uygun ve kolay öğrenilebilir bir sistem olup olmadığı testidir. Kullanıcı kitlesine uygun kişi test yapar. Test ederken sesli bir şekilde düşüncelerini söylemesi istenir. Kullanılabilecek araçlar; Optimizely, Qualaroo, Crazy Egg, Usabilla, Clicktale, Five Second Test, Chalkmark.

Peki hangi durumlarda hangi testleri uygulamamız gerekiyor?

Tabii ki bu başta da söylediğimiz gibi tamamen projenin dinamikleriyle alakalı bir durum. Ancak örnek vermek gerekirse; çok fazla trafik alan bir projeniz varsa yük testi yapmanız uygun olacaktır. Global bir şirketseniz ve projeleriniz farklı ülkelerde kullanılıyorsa veya bilgisayarlara kurulum gerektiren bir proje yapıyorsanız yerelleştirme testi uygulamanız akıllıca olabilir. Projeniz belirli bir kullanıcı kitlesine hitap ediyorsa (Görme engelli kişiler için bir proje yaptığınızı düşünün) kullanılabilirlik testi sizin için çok önemli demektir.

Bunların yanı sıra; bu testlerin alt kategorileri de var. Her biri kendi içinde oldukça detaylı yöntemlere sahip. İhtiyacınız olan test için detaylı araştırma yapmaya başladığınızda alt kategorilerdeki test türlerini de görebilirsiniz.

Testler metodolojilerine göre de ikiye ayrılmaktadır.

Yazılım Test Metodolojileri

White-box ve Black-box test metotları olarak ikiye ayrılır.

White-Box Testi

Hataların bulunup düzeltilmesi aşamasıdır. Amaç kod hatalarını bulmaktır. Birim test, Statik ve dinamik analizler, kod içi açıklamalar, performans testi, stres testi, kurtarma testi, uyumluluk testi ve doğruluk testi bu test metoduna bağlı olarak uygulanır. Bu testleri uygulayan kişi doğrudan kodları düzenler. Dolayısıyla bunlar yazılımcıların bilmesi gereken testlerdir.

Black-Box Testi

Amaç projenin koddan bağımsız olarak işlevselliğini test etmektir. Burada test yapan kişinin projenin kod kısmını bilmesine gerek yoktur. Fonksiyonellik testi, kullanılabilirlik testi, performans testi, stres testi, yükleme testi, duman testi, güvenlik testi ve kabul testi bu test metoduna bağlı olarak uygulanır.

Umarım genel olarak öğrendiklerimi aktarabilmişimdir. Yanlış ifade ettiğim yerler varsa benimle iletişime geçerseniz çok sevinirim.

İyi çalışmalar.

Kaynakça:

https://www.atlassian.com/continuous-delivery/software-testing/types-of-software-testing
https://www.softwaretestinghelp.com/types-of-software-testing/
https://www.guru99.com/types-of-software-testing.html
https://hackr.io/blog/types-of-software-testing
https://ozguradem.net/turkish/coding/2017/04/23/test-turleri-ve-arasindaki-farklar/
https://medium.com/@orhunbegendi/unit-test-turleri-neler-ve-hangileri-isine-yarar-a187a4fbb094
https://kadertarlan.wordpress.com/2019/01/15/test-metedojileri/
http://www.kurumsaljava.com/2009/03/03/yazilimda-degisik-test-turleri/

--

--