6 Aralık 2014 Cumartesi

Birim Testi - Unit Test

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.

Birim Testi Gözden Geçirilir mi ?
Bence gözden geçirilmemesi lazım çünkü birim testleri canlı kod parçalarıdır. Sürekli değişirler. Kapsama ölçümü almak yeterli. Ama bazı firmalar birim testlerinin de gözden geçirilmesini süreçlerine dahil ediyorlar.

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 Testleri Kod Dokümantasyonu Olabilir mi ?
Özellikler çevik süreçlerde birim testinin dokümantasyon olarak kullanılabileceği yönünde görüş birliği var.

Arrange-Act-Assert pattern
Açıklaması şöyle. Arrange kısmı setup() gibidir. Test için gerekli hazırlıklar yapılır. Act kısmında test edilecek şey çağrılır. Assert kısmında testin sonucu dığrulanır
Arrange: In this section, we perform the setup and initialization required for the test. This usually involves creating data required for a test case and/or setting up mocks,

Act: In this section, we take the actions required for a test case. This means calling the method under test.

Assert: In this section, we verify that our test case did what was expected from it. This usually involves asserting the response of the method under test and/or verify that invocations were made on mock objects.

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.

Bazen birim testi yapmak, integration testi yapmaktan daha zor olabiliyor. Özellikle birim testi için girdiyi hazırlamanın zor olduğu durumlarda yalıtılmış birim testi yerine integration testi yapılabilir deniyor.  Örnekte birim testi için bir tree hazırlanması gösterilmiş.
ar input = new AssignStatement(
  new Variable("x"),
  new BinaryExpression(
    new Constant(2),
    BinaryOperator.Plus,
    new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a"))));
Bu girdiyi hazırlamak gerçekten uzun sürebilir. Bunun yerine integration testi gibi başka bir sınıfın girdi hazırlaması kabul edilebilir.
var input = new Parser().ParseStatement("x = 2 + 3 * a");

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.

Yük (Load) Testi
Yük testi sonucunda sistemde çalışması gereken normal senaryolar denenir ve yük sonucu işle kaybı olup olmadığı görülür.

Birim Testi Anti Pattern'ları
Burada birim testinde yapılan yanlışlıklar verilmiş. En çok puan alan anti pattern Free Ride/Piggback. Yeni özelliği test etmek için baştan test yazmak yerine mevcut testin biraz değiştirilmesi.

Her Bug veya Yeni Kod İçin Birim Testi
Düzeltilen her bug veya yeni eklenen her özellik için birim testi yapmak gerekir. Birim testinin Free Ride olmamasına dikkat edilmelidir.

Birim Testi Production Ortamıyla Aynı Olmalıdır
Birim testleri production ortamıyla mümkün olduğunca aynı olmalıdır. Buradaki örnekte production ortamında UTC saat dilimi kullanılırken birim testlerde yerel saat kullanıldığı için hataların yakalanmadığı anlatılıyor.

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
Denkli Sınıfı Testi yazısına taşıdım.

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.



CPPUnit
Konuyu CPPUnit başlıklı yazıya taşıdım.

Hiç yorum yok:

Yorum Gönder