paint-brush
Test Algoritmalarının Geliştirilmesi: Yazılım Testinde Matematiksel Yaklaşımlarile@shad0wpuppet
23,902 okumalar
23,902 okumalar

Test Algoritmalarının Geliştirilmesi: Yazılım Testinde Matematiksel Yaklaşımlar

ile Konstantin Sakhchinskiy7m2024/01/24
Read on Terminal Reader
Read this story w/o Javascript

Çok uzun; Okumak

Makale, kod kapsamını optimize etmede matematiksel modellerin rolünü vurgulayarak test metodolojilerini araştırıyor. Algoritmalar kullanarak mantıksal ifadelerin en aza indirilmesi, ikili testlerin optimize edilmesi ve değişen sistem durumlarının test edilmesi tartışılmaktadır. Temel sonuçlar, bu yöntemlerin minimum çabayla maksimum test kapsamına ulaşmadaki etkinliğini vurgulamaktadır. Bu algoritmaların farklı sistemlere uyarlanmasında zorluklar ve içgörüler vardır. Etkili testlerin teorik temellerini anlamak önemlidir.
featured image - Test Algoritmalarının Geliştirilmesi: Yazılım Testinde Matematiksel Yaklaşımlar
Konstantin Sakhchinskiy HackerNoon profile picture
0-item

Yeni test tasarım metodolojileri her zaman aynı anda ortaya çıkmaz. Modern test uygulamalarının önemli bir kısmı, matematiksel modellerin uyarlanmasındaki titiz teorik ve deneysel çalışmalarla gelişmiştir. İyi bir testçi olmak için matematikçi olmak gerekmese de test yöntemlerinin ardındaki teorik temeli anlamak faydalı olabilir.

Kapsamın Maksimuma Çıkarılması ve Test Senaryolarının Sayısının En Aza İndirilmesi

Bir sistemin kod kapsamını optimize etmek için matematiksel mantık uygulanabilir. Koşulda iki dal ve uzun bir mantıksal formül içeren bir "if" ifadesini içeren basit bir örneği ele alalım:

 if ( (& a2) & (!(a2 || a4) ) || a3 ) { # action 1 } else { # action 2 }


Her iki dalı da kapsayacak şekilde formülün yapısını anlamak gerekir. İnsan şunu merak edebilir: Ne yapılabilir? Bu kod parçasını (mantıksal formül) her zaman kapsamlı bir şekilde test edebilirsiniz, sonuçta 16 test elde edilebilir. Ancak bu oldukça fazla ve test sayısının azaltılması için çaba gösterilmesi gerekiyor. Değiştirilmiş Koşul/Karar Kapsamı (MC/DC) yöntemi kullanılarak test sayısı azaltılabilir (11-12 test elde edilir). Şube kapsamı riskleri test etmek için yeterliyse yalnızca iki teste ihtiyaç vardır, ancak hangilerinin olduğu belli değildir.


Bu sorunu çözmek için mantıksal formüle boole cebiri uygulanabilir:

 if( (& a2) & (! (a2 || a4) ) || a3 ) = = ( (& a2) & ( (!a2 || !a4) ) || a3 ) = = ( a1 & a2 & !a2 & !a4 || a3 ) = = 0 || a3 = a3


Orijinal formülü dönüştürdükten sonra, yalnızca bir a3 değişkeninin gerçekte doğruluk değerini etkilediği ortaya çıkıyor. Sonuç olarak, test senaryolarının elde edilmesi daha basit hale gelir (biri a3 == false ile diğeri ise). Üstelik, yalnızca tek bir değişkene bağlı karmaşık bir mantıksal ifadeye sahip olmak tuhaf olduğundan, kodun optimize edilmediği açıkça ortaya çıkıyor. Maalesef bu tür durumlar gerçekte oldukça yaygındır ve verilen örnek nispeten basittir.


Sonuç olarak:

  • Kapsamlı test kullanılıyorsa 2 test

  • MC/DC yöntemiyle 2 test

  • Şube kapsamı uygulanıyorsa 2 test


Genel olarak mantıksal ifadeler cebir, matematiksel yöntemler ve algoritmalar kullanılarak basitleştirilebilir (küçültülebilir). En az üç benzer yöntem vardır. Yukarıda açıklandığı gibi boole cebirini kullanan doğrudan dönüşümler her zaman işe yarar. Yalnızca matematik ve mantığa değil aynı zamanda alanın özelliklerine de dayalı olarak belirli bir alanın özelliklerini dikkate alan ifade minimizasyonu yöntemleri bulunabilir ve uygulanabilir.

İkili Testi Optimize Etme

İkili test yöntemi, girdi parametrelerinin tüm olası kombinasyonlarını kapsamlı testler yoluyla test etmek yerine (ki bu zaman alıcı ve kaynak yoğun olabilir), test kümeleri, her parametre değeri diğer parametrelerle birleşecek şekilde tasarlanacak şekilde test kümeleri oluşturmayı içerir. test edilen diğer parametrelerin değeri en az bir kez. Bu, test senaryolarının sayısını önemli ölçüde azaltır.


Oldukça köklü ve sıklıkla kullanılan bir yöntemdir. Ancak ne yazık ki sistemler karmaşıklaştıkça bu yöntem her zaman işe yaramıyor. Şu soru ortaya çıkıyor: ikili test, çok sayıda giriş parametresine sahip karmaşık bir sistemi kapsamlı bir şekilde test etmek için yeterli midir? Bu soru, Amerika Birleşik Devletleri'ndeki Ulusal Standartlar ve Teknoloji Enstitüsü (NIST) dahil olmak üzere birçok test uzmanının ve araştırmacının ilgisini çekti.

  • Pairwise finds 65-97% of errors
  • 3-way finds 89-99% of errors
  • 4-way finds 96-100% of errors
  • 5-way finds 96-100% of errors
  • 6-way finds 100% of errors

Araştırmalara göre ikili test vakaların %65-97'sinde hata buluyor. Eğer parametre çiftlerini değil de üçlü veya dörtlüleri birleştirmeye başlarsak, yani k-yollu testi kullanırsak, daha fazla sayıda test elde ederiz ama aynı zamanda daha fazla hata yakalarız.


Örneğin, bir sistemin her biri üç değere sahip iki parametreye ve her biri iki değere sahip üç parametreye sahip olduğunu varsayalım:

  • Pairwise: 10 tests with 14% coverage
  • 3-way: 18 tests with 25% coverage
  • 4-way: 36 tests with 50% coverage
  • 5-way: 72 tests with 100% coverage

Tatmin edici düzeyde bir test kapsamı ve kabul edilebilir sayıda test senaryosu seçebilirsiniz.

Çiftli hesaplamanın temeli, eşit sayıda n-demet (çiftler, üçlüler, dörtlüler, ...) içeren ortogonal dizilerdir.


İkili ve k-yollu testlerin genel temeli OA(N, V^k, t) dir; burada:

  • N satır sayısıdır

  • k sütun sayısıdır

  • V, bir sütundaki farklı değerlerin sayısıdır

  • t güçtür (ikili için t=2)


OA'da, her t sütunu kümesi tüm t demetlerini eşit sayıda içerir.

Ortogonal matrisler yerine kaplama matrislerinin kullanılması daha iyidir. Bu matrisler, her bir değer kümesinin "eşit sayıda" değil, en az bir kez oluşması açısından dik matrislerden farklıdır. Bu durumda, biraz daha az test vardır. Matrislerin örtülmesiyle hatalı test senaryoları ortaya çıkabilir, ancak genel olarak test süreci çok daha hızlıdır. Böylece test süreci önemli ölçüde basitleştirilmiştir.

CA(N, V^k, t), burada:

  • N satır sayısıdır
  • k sütun sayısıdır
  • V, bir sütundaki farklı değerlerin sayısıdır
  • t güçtür (ikili için t=2)

CA'da her t sütunu kümesi, tüm t tuple'larını en az bir kez içerir. Kaplama matrislerinin kullanılması, test sayısını önemli ölçüde artırmadan ikili testten k-yollu teste geçmeyi sağlar.

Sistem Durumları ve Değişen Sistem Durumlarının Test Edilmesi

Genellikle (neredeyse her zaman), bir sistemin ikiden fazla durumu vardır: "çalışıyor" ve "çalışmıyor". Hisse senedi emri olan eyaletlerin bir kısmını ele alalım. Hisse senedi alma veya satma emrinin, işlemin tamamlanması için bir dizi aşamadan geçmesi gerekir. Önce emir oluşturulur, ardından borsa tarafından onaylanır, ardından çok sayıda küçük alım işlemi yapılır ve son olarak gerekli miktarda hisse senedi alınır veya satılır. Bir hisse senedi emrinin tüm durumları ticaret sistemlerine yansıtılır ve elbette tüm geçişlerin ve durumların test edilmesi gerekir.


Neredeyse her zaman ya tüm durumlar ya da tüm geçişler test edilir, ancak çoğunlukla her ikisi de doğrulanır. Tam kapsama ulaşılabilir ancak zaman alıcı, pahalı ve kaynak yoğun olacaktır.


Grafikler ve Sonlu Otomatlar

Gezgin satıcı (commi voyager) problemini ve de Bruijn algoritmasını ele alalım. Algoritmanın, bir grafiği tamamen kapsayacak şekilde bir grafikte geçilebilecek optimal veya yeterince optimal kısa yollar kümesinin elde edilmesine izin verdiğini anlamak yeterlidir (kesin olarak konuşursak, benzer bir şeyi başaran herhangi bir başka algoritma kullanılabilir veya biri icat edebilir). özel algoritma).

  • Öncelikle sistemin başlangıç durumlarını alın ve köşelerin orijinal grafikteki geçişlere karşılık geldiği yeni bir grafik oluşturun.
  • Daha sonra yeni grafiğin köşelerini, yani eski grafiğin geçişlerini işleyin.
  • Bazı yollar açıktır ve oldukça kısa olduğu ortaya çıkar (bu, sistemin durumlarını ve geçişlerini test etmek için çok uygundur).
  • Başka yollar inşa etmeye devam edin. Sonuç olarak, çok uzun olabilirler (ve bu iyi değildir).


Durumu analiz etmek için aşağıdaki örneği ele alalım:

Üç testçi var. Birincisi birinci testi, ikincisi ikinci testi, üçüncüsü üçüncü testi yapacak. İlk ikisi, ilk iki testi oldukça hızlı tamamlayacak çünkü yollar kısa (üçüncüye kıyasla, ilk iki yol kısa olduğu için), ancak sonuncusu çok uzun zaman alacak (üçüncü yol çok uzun olduğu için) uzun).

De Bruijn algoritması uygulanırsa, üçüncü dizi birkaç daha kısa diziye "kesilebilir" ve tüm testlerin yürütülmesi verimli bir şekilde paralelleştirilebilir.


Daha fazla test elde edebiliriz ancak paralel yürütme durumunda testler daha kısa olduğundan testler çok daha hızlı tamamlanır.


Üstelik daha fazla testle bunların uygulanmasında daha fazla esneklik sağlanır. Tüm testler aynı anda yürütülebilir veya ilgi çekici olmayan ve daha az önemli testler kaldırılabilir. Sistemin en önemli durumlarından geçen testlere daha yüksek öncelikler atanabilir. Algoritmanın sonuçlarından yararlanmanın birçok yolu vardır.


Bir artı olarak, algoritma alana özgü şeyleri kullanmaz; sistemin kesinlikle soyut durumları ve geçişleriyle çalışır.


Bu teknikte çoğu şey algoritmanın nasıl kullanıldığına bağlıdır. En uç durumda, test uzmanları durumlar arasındaki geçişlerin ardındaki mantık hakkında hiçbir şey bilmeyebilir. Böyle bir durumda, uzun durum geçişleri zinciri, algoritma tarafından birkaç kısa parçaya "kesilecektir". Bu zincirlerden bazıları anlamsız çıkabilir. Bu nedenle elde edilen zincirlerin makul olup olmadığı ve test için önemli ve anlamlı olanların değerlendirilmesi gerekmektedir. Anlamsız ve önemsiz ama sistemin durumlarını değiştirmenin olası yolları, sistemin hangi kısmının değişikliğe ihtiyacı olduğunun anlaşılmasını sağlayabilir ve tam olarak hangi kısmının belli olduğunu ortaya koyabilir.


Temel sonuçlar şu şekilde değerlendirilebilir:


  • Mantıksal ifadeleri en aza indirmeye yönelik algoritmalar, minimum çabayla maksimum test kapsamı sağlar. Minimizasyon algoritmalarını kullanmak her zaman gerekli değildir; bazen bu zaman kaybıdır; evrensel yaklaşımlar mevcuttur.
  • Paralelleştirilmesi, otomatikleştirilmesi, esnek ve bağımsız olması kolay küçük bir dizi kısa test senaryosu ile tam test kapsamı elde edilebilir.
  • Gerçek koşullarda uygulama kullanımına ilişkin istatistiklerin analizi, mevcut test tasarım tekniklerinin optimize edilmesine ve uyarlanmasına ve gerekli test kapsamının elde edilmesine olanak tanıyarak uygulama kalitesini garanti eder.
  • İkili testin değiştirilmesi, standart algoritmalara göre daha geniş test kapsamına sahip ve neredeyse aynı kaynaklarla daha kapsamlı testlere olanak tanır.
  • Standart test tasarım tekniklerinin daha az verimli olduğu durumlarda bazı algoritmalar etkili olabilir.
  • Kombinatoryal test tasarım tekniklerinin başarısızlıklarında bazı zorluklar vardır.
  • Elde edilen algoritmalar farklı sistemlere kolaylıkla uyarlanabilmekte ve alana ilişkin özel bilgi gerektirmemektedir.


Küçük dezavantajlara gelince, şunu belirtmekte fayda var:


  • Bazı algoritmalar her durum için etkili ve alakalı değildir; birçok durumda standart test tasarım teknikleri eşit derecede veya bazen daha da etkilidir.
  • Algoritmaların uygulanması, bazı matematiksel bilgiler ve bazen daha fazla zaman gerektirir; dolayısıyla birçok durumda hayati bir faktör haline gelebilir.

Bir QA uzmanı olarak bu nüansları anlamak önemlidir. Bazı durumlarda teorik olsa da, kombinatoryal test tasarım tekniklerinin karmaşıklığını anlamak, QA profesyonellerinin uygulamaların karmaşık iş mantığını etkili bir şekilde test etmesine ve kullanıcılarına yüksek kaliteli yazılım sunmasına olanak tanır.