Test ve Kalite
Yazılım testi konusuna detaylı giriş yapmadan önce bir temelin oluşması için bu bölümde önemli kavramlara değineceğiz.
Test Nedir?
Yazılım test konusu uygulama yaşam döngüsünün (life cycle) temel taşlarından biridir. Türk Dil Kurumu’na ait Büyük Türkçe Sözlük’e göre; bir kimsenin, bir topluluğun doğal veya sonradan kazanılmış yeteneklerini, bilgi ve becerilerini ölçmeye ve anlamaya yarayan sınama anlamına gelmekle birlikte bilişim sektörünü ilgilendiren kısmıyla test; ürün kalitesinin değerlendirilmesi, üzerindeki kusur ve problemleri belirleyerek iyileştirilmesi ve geliştirilmesi için yapılan bir sınama çalışmasıdır.
Test aktivitesinin amacı ortaya konan ürünün kalitesini ortaya çıkarabilmek ve üzerindeki kusurları tespit etmektir. Peki, tanımda üzerinde durulan kalite ve kusur ( İng. defect, T. defekt) nedir? Yazılım testine geçmeden önce bu kavramların anlaşılması faydalı olacaktır.
Kalite Nedir?
Fransızca kökenli olan kalite, nitelik demektir. Soyut bir kavram olsa da genel bir tanım olarak, bir hizmetin veya ürünün istenilen ihtiyaçları karşılayabilmesi için gereken özellikleri ve yetkinlikleri haiz olma durumudur. Farklı kişiler tarafından amaçlanan kullanıma uygunluk, gereksinimlere uygunluk ya da nesnenin tabiatında var olan özelliklerin gereksinimleri karşılama derecesi olarak da tanımlanmıştır.
Yazılım Kalitesi
Yazılım kalitesi ise IEEE tanımına göre;
- Bir sistemin, bileşenin ya da bir sürecin belirtilen şartları karşılama derecesi.
- Bir sistemin, bileşenin ya da sürecin müşteri ya da kullanıcı beklenti veya gereksinimlerini karşılama derecesidir.
Software Quality – IEEE Definition:
- The degree to which a system, component, or process meets specified requirements.
- The degree to which a system, component, or process meets customer or user needs or expectations.
Bu iki tanım, modern kalite güvencesi kurucuları Philip B. Crosby ve Joseph M. Juran tarafından düzenlenen, yazılım kalitesinin iki alternatif tanımını sunar:
- Kalite gereksinimlere uygunluk anlamına gelir.
- Kalite, müşterilerin ihtiyaçlarını karşılayan ve böylece ürün memnuniyeti sağlayan ürün özelliklerinden oluşur. Kalite eksikliklerden kurtulmaktan ibarettir.
- “Quality means conformance to requirements” (Crosby, 1979).
- “Quality consists of those product features which meet the needs of customers and thereby provide product satisfaction. Quality consists of freedom from deficiencies” (Juran, 1988).
Bir diğer tanım da Pressman’dan; yazılım kalitesi açıkça belirtilen işlevsel ve performans gereksinimlerine, açıkça belgelendirilmiş geliştirme standartlarına ve profesyonelce geliştirilmiş yazılımlardan beklenen kapalı özelliklere uygunluk demektir.
- Software quality is defined as: Conformance to explicitly stated functional and performance requirements, explicitly documented development standards, and implicit characteristics that are expected of all professionally developed software. (Software Quality – Pressman’s (Pressman, 2000, sec. 8.3) Definition.)
Yazılım Kalite Güvencesi yazımızda yazılımda kaliteyi, süreçlerini ve yapılan aktiviteleri inceleyebilirsiniz.
Defect (Kusur)
Defect/kusur genel olarak koşullardan veya gereksinimlerden sapma demektir. Daha geniş tanımıyla; bir öğenin eksiksiz, istenen, etkili, güvenli ya da haklı olmasını engelleyen ya da arızalanmasına ya da amacına ulaşmamasına neden olan kırılganlık ya da eksiklik olarak tanımlanabilir. Bir yazılım kusuru, bir yazılım ürününde bir yazılım gereksinimini (gereksinim özelliklerinde belirtildiği gibi) veya son kullanıcı beklentilerini karşılamayan bir durumdur. Yazılım kusuru, bir programın arızalanmasına veya hatalı / beklenmedik sonuçların üretilmesine neden olan kodlama veya mantıksal bir hatadır. Bu, donanım, yazılım, ağ, performans, biçim veya işlevsellik ile ilgili olabilir.
Yazılım testi altındaki birçok alan IEEE 610 ve IEEE 982 standartları kapsamında ele alınmıştır. Defect kavramının da yazılım dünyasında daha anlaşılır olması için IEEE 610.12-90 (IEEE Standard Glossary of Software Engineering Terminology) standardı hazırlanmıştır. Bu tanımlar:
- Hata (error): Hesaplanan sonuç ile doğru sonuç arasındaki fark.
- Yanlışlık, hata, kusur (fault): Bir bilgisayar programında yanlış bir adım, işlem veya veri tanımı.
- Başarısızlık (failure): Bir hatanın [yanlış] sonucu.
- Hata (mistake): Yanlış bir sonuç üreten bir insan eylemi.
Genel olarak “defect” terimi ile “fault” anlamı kastedilmektedir.
Özet olarak kalite, müşteri tatminini sağlayabilme vasfı; “defect” ise müşteri ihtiyacının karşılanamamasına sebep olacak şekilde gereksinimlerden sapma olarak açıklanabilir.
Bug
Yazılım dünyasında “bug” kelimesi de hatalar için kullanılmaktadır ve defect’le eşanlamlı olduğu düşünülebilir ancak İngilizce’de “böcek” anlamında kullanılan bu tabir bir bilgisayar programında kodlama hatası olarak kullanılmaktadır. Bu terim, 1947 yılında Harvard’da Hesaplama Laboratuar’ında Mark II isimli bilgisayarda iki elektrikli röle arasında gerçek bir böceğin -bir güve olduğu söylenmektedir- hataya yol açmasından sonra bilgisayar dünyasında ilk “bug”ın gerçek bir böcek tarafından kaynaklanmasından sonra kullanılmaya başlanmıştır. Grace Hopper (programlama dili için ilk derleyiciyi yapan Harvard Mark II çalışanı) “o andan itibaren, bilgisayarda bir şey ters gittiğinde bunun içinde bug olduğunu söyledik” der. Bu durum kayıt (veya seyir) defterine de aşağıdaki gibi kaydedilmiş:
Yazılım Testi
Giriş: Yazılım Testi Nedir?
Yazılım testi nedir? Yazılım testi verilen girdi ile beklenen çıktı arasındaki farklı saptayarak yazılım ürününü ve özelliklerini değerlendirme işlemidir. Yani yazılım kalitesini araştıran ve değerlendiren bir dizi işlemdir. Bu çalışma yazılım ürününün teknik, iş, fonksiyonel ve kullanıcı gereksinimlerine göre oluşturulmasını sağlar. Yazılım testi, birbirine bağlı çeşitli süreçleri içeren geniş bir süreçtir.
IEEE’nin yazılım mühendisliğinin bilgi alanlarını tanımlamak için oluşturduğu ve uluslararası bir standart olan (ISO/IEC TR 19759:2005) “Software Engineering Body of Knowledge – SWEBOK” kılavuzunda testin tanımı şu şekilde yapılmıştır:
“SWEBOK Software Testing Definition: Software testing consists of the dynamic verification of the behavior of a program on a finite set of test cases, suitably selected from the usually infinite executions domain, against the expected behavior.”
Yani bir yazılım ürününün, sınırsız sayıda uygulama/çalışma alanından uygun şekilde seçilen davranışın, sınırlı sayıda test noktaları ile beklenen davranışa karşı dinamik olarak doğrulanması sürecidir. Yukarıdaki tanımda, italikleştirilmiş kelimeler, “Yazılım Testinin Bilgi Alanı”nı tanımlamadaki kilit konulara karşılık gelmektedir. Bunları şimdi ayrı ayrı inceleyelim:
- Uygun şekilde seçilme: Burada gerekli risk analizlerin yapılıp olası riskleri göz önünde bulundurarak uygun davranışın bir şekilde seçilmesidir. En uygun seçim, belirleme verilen koşullar altında çok karmaşık bir sorundur. Dolayısıyla burada risk analizi teknikleri ve test mühendisliği uzmanlığının uygulanması gerekmektedir.
- Sınırlı sayıda test: Basit programlarda bile, teorik olarak sınırsız sayıda test noktası çıkarılabilir. Kapsamlı testler de aylar hatta yıllarca sürebilir. Sınırsız kaynak olmadığı için test yapılacak alanların kritiklik seviyeleri çıkartılarak yeterli seviyede testin yapılması ve bu şekilde bir dengenin sağlanması gerekmektedir.
- Beklenen davranış: Gözlemlenen sonuçlarının kabul edilebilir olup olmadığı, gereksinim ve beklentilere göre beklenen davranışların cevap verip veremediği kontrol edilmelidir.
- Dinamik olarak doğrulanma: Yazılım çalıştırılarak test edilmesi gerekmektedir. Yazılımın türüne göre test aşamasında farklı yöntemler uygulanabilir.
Software Engineering Body of Knowledge (SWEBOK) ile ilgili daha detaylı bilgiyi https://www.computer.org/education/bodies-of-knowledge/software-engineering adresinden edinebilirsiniz.
Yazılım Testinin 3 Temel Kuralı
Yazılım testi de test başlığı altında belirtitğimiz amaçlar doğrultusundaki sınama çalışmasıdır. Yazılımda testin 3 ana hedefi vardır:
- Testin amacı kusurları / defect’leri tespit etmektir.
- Test sadece beklenen senaryoları değil (sunny day scenarios) aynı zamanda beklenmeyen senaryoları da (rainy day scenarios) kapsamalıdır.
- Test gereksinimlerle birlikte başlar. Yani başta senaryolara bakılarak gereksinimlerin ne olduğu öğrenilmelidir ve kullanıcı perspektifinin sağlanmasıyla defect’ler bulunmalıdır.
Testi Kim Yapar?
Proje sürecine ve projenin ilgili paydaşlarına bağlı olmakla birlikte genel olarak IT sektöründe kurumsal şirketlerin yazılım gereksinimlerini değerlendiren bu iş için ayrılmış ekipleri bulunur. Geliştiriciler birim testi adı verilen testleri yürütürler. Kullanıcı kabul testiyle birlikte son kullanıcı da ürünü test eder. Bu test faaliyetine proje lideri de katılabilir.
Yazılım Test Uzmanı / Mühendisi
Yazılım test mühendisleri, yazılım programlarının amaçlandığı gibi çalışmasını sağlamak için test prosedürleri tasarlamaktan ve uygulamaktan sorumludur. Genellikle yazılım geliştirme şirketleri tarafından ürünlerin ortaya çıkmasından önce spesifikasyonlara uygun performans gösterdiğinden emin olmak için işe alınırlar.
Kalite güvence (quality assurance) veya kalite kontrol (quality control) ekipleri olarak veya bu ekiplerle koordineli çalışma sürecine katılabilirler. Diğer yazılarımızda bulunan test teknikleri, süreçleri ve metodolojileri incelendiği takdirde test uzmanının genel faaliyetleri konusunda genel bir kanı oluşacaktır. Ancak buradan yazılım test uzmanının genel aktivitelerini şu şekilde sıralayabiliriz:
- Öncelikle planlamayı yaparak test faaliyetlerini tanımlamak.
- Test faaliyet durumu ve bug çıktılarıyla ilgili rapor hazırlamak.
- Müşterilerle gerekli etkileşimi sağlamak (kullanıcı kabul testinde olduğu gibi.)
- Gereli tüm belgeleri incelemek ve neyin test edilmesi gerektiğini anlamak.
- Test senaryoları geliştirmek.
- Tüm test senaryolarını yürütmek ve kusurları bildirmek, her bir kusur için önem ve öncelik tanımlamak.
- Test ve proje ölçümlerini iyileştirmek.
Yazılım Testi Süreci Ne Zaman Durdurulur?
Testin ne zaman durdurulacağını belirlemek ya da kestirebilmek zordur. Hiç kimse testin %100 test edildiğini iddia edemez! Ancak test sürecini durdurmak için aşağıdaki hususlar göz önüne alınabilir:
- Testin planlanan son bitiş tarihi.
- Test durumlarının çalıştırılmasının tamamlanması.
- Belirli bir noktaya kadar fonksiyonel ve kodla ilgili tüm kısımların tamamlanması.
- Hata ve defect oranlarının belirli bir seviyenin altına düşürülmesi ve yüksek öncelikli defect tespit edilmemesi.
- Yönetim kararı.
Yazılım Testi Neden Önemlidir?
- Bir kusurun/defect’in ürün müşteriye teslim edilmeden önce tespit edilmesi ve yazılımın kalitesinin garanti alınması gerekmektedir.
- Tespit edilerek ortadan kaldırılmayan bir kusur kritik iş kayıplarına sebep olabilir.
- Yazılım testi yazılımı daha güvenilir ve kullanımı kolay kullanıcı dostu yapar.
- İyi test edilmiş yazılımlar düşük maliyetle oluşturulan verimli bir ürün kullanımı sağlar.
- İyi test uygulaması ile yazılım testleri daha düşük bakım maliyeti sağlar.
- Defect veya bug’ların geliştirmenin ilk evrelerinde tespit edilebilir, daha sonraki aşamalarda tespit edilmesi çok daha maliyetli olacaktır.
Kullanıcı deneyimi, piyasaya bazı ürünler koyarken önemli bir faktördür. Genelde yazılımın basit, anlaşılır ve kullanımı kolay olması gerekir. Bunu da test edenler sağlayabilir. İyi bir kullanıcı deneyim konusunda yazılımın beklendiği gibi tasarlanması için iyi bir yazılım test hizmeti almak gerekir. Yazılım testine temel bir giriş yaptıktan sonra Yazılım Test Süreçleri ve Yazılım Test Teknikleri konuları ile devam edebilirsiniz.