24 Şubat 2014 Pazartesi

JUnit

Birim Testi (Unit Test) Çapraz Yapılabilir mi ?
Bu konuda yapılmasının iyi olduğu yönünde bazı yazılar var ancak ben bu yöntemi kullanırken bazı eksiklikler gördüm. Çalıştığım projede çapraz testin stajyerlerce yapılmasını istendi.

Stajyerler, birim testi yazarken kodu tamamen anlayıp gerçek içeriğe yönelik test yerine, sadece kapsama yüzdesini artıracak testleri yazdılar. Birim testi yapan kişi, kodu geliştiren kişi ile birebir çalışan birisi değilse, test istenildiği kadar verimli olmayabilir.

Kodu geliştiren kişi birim testini kendi yazmayınca, kodun ne kadar test edilebilir olduğunu tam kavrayamıyor. Bu konuda da eksiklik olduğunu düşünüyorum.

Büyük Yazılımlarda Birim Testleri Nasıl Yönetmeli
Yazılım büyüdükçe birim test sayısı da artıyor. Çok fazla testi bir arada koşturmak, hatanın bulunmasını zorlaştırır. Bu yüzden birim testleri de kendi içinde bölümlemek gerekebilir.

Birim Testi İle Tümleyim (Integration) Testinin Farkı Nedir?
Sorunun cevabını ben de bilmiyorum. Tek anladığım tümleyim testleri bir veya daha fazla birimin bir araya getirilerek yapılması gerektiği. Hangi araçlar kullanılır ve seviyesi ne olmalıdır bilmiyorum.

Tümleyim testi için "big bang" yöntemi en kolay yöntem. Bottom up veya top down yöntemlerde birleştirilmesi gereken bileşenlerin sırasının belirlenmesi ve her birleşimi besleyecek kod ve araç geliştirilmesi gerekebiliyor.

Birim Testi Dışarıdan Bir Dosyayı Yükleyerek Yapılabilir mi ?
Dışarıdan dosya yüklemenin amacı eğer çok fazla sayıda olasılığı denemek ise makul sayılabilir. Ancak amacın birim testi yerine tümleyim testine doğru kaymamasına dikkat etmek lazım.

GUI Testi Nasıl Yapılır?
GUI uygulamalarının işlevsel testleri (functional test) bir test otomasyon aracı ile yapılırsa daha iyi olur.

Test Yöntemleri
Tüm test yöntemleri test için kullanılacak verinin rastgele değil de belli prensiplere göre seçilmesini amaçlar. Böylece testin etkinliği artırılarak

Equivalance Class Partitioning
Equivalance Class Partitioning - Türkçesi denklik sınıfı test tekniği  - yönteminde, test için kullanılacak girdi kümelere ayrılır ve her kümeden birer örnek denir. Böylece azami test kapsaması sağlanır. Aşağıdaki şekilleri buradan aldım.

Eğer girdi aralık ise ve aralığın dışında değerler yoksa
Örnekte ASCII aralığını büyük karaktere çevirmek için tablo hazırlanmış. Bu tabla ASCII karakterleri 3 aralığa bölmüş ve aralıkların dışında değer olmadığı varsayılmış. Bu durumda 4 tane test yapmak yeterli.


Eğer girdi aralık ise (range) ve aralığın dışında değerler de varsa
Aralık sürekli (continuous) veya kesikli (discrete) olabilir. Aralığa dahil olan mavi kümeden bir, dahil olmayan kırmızılar kümesinden de birer örnek denenir.
Eğer girdi nokta ise
Noktanın sabit değeri , ve nokta dışındaki kümeden bir değer denenir.
Boolean değerler de nokta gibi düşünülebilir. Yani bir true bir de false girdi denenmelidir.

Eğer girdi küme ise
Kümenin içindeki bir girdi, ve kümenin dışındaki bir girdi denenir.

Boundary Value Testing
Boundary Value Testing - türkçesi uç nokta test yöntemi - yukarıdaki denklik sınıfı yöntemine çok benziyor.  Aradaki en büyük fark kümeden girdi seçerken, tam uçtaki, ucun bir altındaki ve bir üstündeki değerleri kullanmak. Yani biraz daha fazla test yazılması anlamına geliyor. Eğer 3'ten fazla test yazılması gerekiyorsa girdiyi equivalence gruplarına ayırırken bir hata yapıldığı anlamına gelen bir yazı gördüm ancak tam ne demek isteniyor bilmiyorum.

Eğer girdi aralık ise (range)
Aralık sürekli (continuous) veya kesikli (discrete) olabilir. Aşağıdaki aralık örneğinde, a -1 , a ve a+1 ayrıca b -1 , b , b+1 değerlerini kullanarak 6 test yazılıyor. Örneğin bir büyüklüğü 10 olan array veri yapısı için indeksleri test ediyor olsaydık, -1,0,1 ve 8,9,10 indeks değerlerini kullanmamız gerekirdi. Kırmızı ile işaretli girdiler içinse , hata almayı beklerdik.
Eğer girdi nokta ise
Noktanın kendisi, bir eksiği ve bir fazlası için test yazılıyor. Boolean değerler de nokta gibi düşünülebilir. Yani bir true bir de false girdi denenmelidir.

Eğer girdi küme ise
Bu durumda mümkünse kümedeki tüm elemanların ve küme dışındaki bir elemanın denenmesi isteniyor.
Yine denklik sınıfı test tekniğine göre biraz daha fazla test yazılıyor.


JUnit
JUnit ile aldığım bazı notlar aşağıda

TestSuite Sınıfı
Bu sınıf koşturulacak Test nesnelerini içerir. @RunWith (AllTests.class) anotasyonu ile suite içindeki Test sınıfından türeyen testler koşturulur. Örnek:


Exception atılmasının test edilmesi
@Test (expected =IllegalArgumentException.class)
 public void testIllegal1() {
 }
Testin Çalışmaması
@Ignore anotasyonu ile bir testin çalışmaması sağlanabilir.

static import
Static import yaparak bir sınıfın public static metodları sınıf ismini belirtmeden kullanılabilir. JUnit ile bu yüzden static import yapılıyor. Örnek'te Math.min metodu yerine sadece min kullanılmış. Bir başka örnek ise burada.
assertEquals
Verilen iki nesnenin eşitliğini a.equals(b) şeklinde test eder.

assertFalse ve assertTrue
Verilen metodun false/true döndürdüğünü test eder.
Örnek :
assertFalse (a == b);
assertTrue  (a == b);

CPPUnit
Aşağıda CPPUnit ile ilgili bazı notlarım var.

Örnek Test
-----------------------
header dosyası
 #include "cppunit/TestFixture.h"
 #include "cppunit/extensions/HelperMacros.h"

class MyTester : public CPPUNIT_NS::TestFixture {
public:
 void testMethod1();

CPPUNIT_TEST_SUITE (MyTester);
CPPUNIT_TEST (testMethod1);
CPPUNIT_TEST_SUITE_END();
};

-------------------
cpp dosyası

CPPUNIT_TEST_SUITE_REGISTRATION(MyTester);

void MyTester::testMethod1(){
}

CPPUNIT_ASSERT
Verilen koşulun doğruluğunu dener.

CPPUNIT_ASSERT_EQUAL
Verilen iki aynı tipteki değişkenin değerlerinin eşitliğini kontrol eder.

CPPUNIT_ASSERT_DOUBLES_EQUAL
Verilen iki kayan nokta sayının belli bir aralıkda yakın olup olmadığını dener.

Hiç yorum yok:

Yorum Gönder