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.
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 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:
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.
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.
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).
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:
Küçük dezavantajlara gelince, şunu belirtmekte fayda var:
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.