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.

23 Şubat 2014 Pazar

Gabya Sınıfı Fırkateyn ve 3D Radar

Hangi Gemilere Takılıyor
Gabya sınıfı fırkateynlerdeki hava arama radarıın 2 boyutlu olduğunu içeren "Gabya Sınıfı Fırkateyn" yazısından sonra bazı gemilere (F494 Gökçeada, F495 Gediz, F496 Gökova, F497 Göksu) "Thales Smart-S MK2" 3 boyutlu hava arama radarı takılma projesi başlatıldı.

F246 SalihReis MEKO sınıfı bir fırkateyn olmasına rağmen bu gemilere de aynı radar takılıyor. Burada radar görülebilir.. Diğer MEKO'larda ise AWS-9 radarı bulunuyor.

Bu radar aynı zamanda Kolombiya donanmasındaki FS-1500 fırkateynlerinde de kullanılıyor. Endonezya donanması bu radarın yanında yine Thales ürünü Variant radarını da kullanıyor.

 Smart-S MK2 Radarı

Radarın tanıtım videosunu aşağıda bulabilirsiniz.

Radarın dönüşünü gösteren bir diğer video ise yine aşağıda.

Bu radar gemide bulunan Genesis-GSYS (Genesis-Gabya Savaş Yönetim Sistemi) sistemine de entegre edilecek. Radar deniz yüzeyini yalayarak gelen Mach 3+ hızındaki füzeleri ve 70 dereceden fazla açılarla yaklaşan cisimleri tesbit edebiliyor. SMART-S MK2 radarı 160 adede kadar hava hedefi ve 40 adede kadar deniz hedefini aynı anda izleyebilir.

Not : Aynı radar Milgem projesinde de kullanıldı. "Milgem ve 3D Radar"başlıklı yazıyı okuyabilirsiniz.

Proje neticesinde bazı yazılarda modernizasyona tabi tutulan bu gemilere Gökçeada sınıfı, tutulmayan diğer gemilere ise Gaziantep sınıfnı dendiğini gördüm ancak resmi olarak böyle bir ayrım henüz yok.

Bu radar S bandında çalışıyor. Geleneksel ve yeni bant isimlendirmesi için buraya bakınız. Yeni isimlendirmeye göre bu radar F bandına düşüyor ancak ben bu yazıda geleneksel bant isimlerini kullandım.

Radarın menzili 250 km ve muhtemelen L bandında çalışan AN/SPS-49 radarına göre daha fazla enerji çekiyordur.
 AN/SPS-49 Radarı

Radarın bandı
S bandında çalışan radarların L band radarlara göre idamesi biraz daha güç olmasına rağmen bu radarın üreticisi "solid state" teknolojisi kullandığını ve "high availability" sağladığını söylüyor. S bant radarların L radarlara göre dalga boyu daha küçük olduğu için daha küçük bir anten gerektiriyorlar. Buna ek olarak S band radarlar meteorolojik şartlardan daha az etkilenirler. Ayrıca bu radar kıyılarda (littoral) çalışmak üzere optimize edilmiş.

Radarın Üretimi
Cihazların üretimi konusunda Thales Türkiye ve Endonezya'da benzer bir model izliyor. İlk iki radarı kendi üretiyor kalanları ise satış yaptığı ülkede monte ediliyorlar. Endonzeya LCS gemilerinde uygulanan bu modeli burada görebilirsiniz.

ESSM
Bu modernizasyon programı kapsamında ayrıca gemilere Lockheed Martin tarafından üretilen MK 41 dikey lançerleri de takılmış. Bir çok füze çeşidini fırlatabilen bu sistemle beraber füze ve hava hedeflerine karşı koruma sağlayan ESSM (Evolved Sea Sparrow Missile) füzeleri de alınmış.ESSM radar güdümlü bir öz savunma füzesi. Hatta Roketsan ESSM füzesinin  uçuş sonlandırma biriminin tasarım, test ve üretimini gerçekleştiriyor.

ESSM ve SM-1'in amacı ve görevi farklıdır.ESSM geminin kendini koruması için tasarlanmıştır ve 4'lü gruplar halinde atılırlar. SM-1 ise daha uzun menzilli bir hava savunma füzesidir. Gemi kendini korumak için aşağıdaki sırayı izler.
  1. Daha uzun menzilli olan SM-1 füzesi.
  2. Daha kısa menzilli olan ESSM füzesi.(supersonik ve seyir füzelerini de avlayabliyor)
  3. Nokta savunması sağlayan Phalanx veya RAM 
ESSM ile SM-1 füzesinin beraber kullanılması durumu ise şu linkte açıklanmış. Böylece gemiye kademeli bir koruma sağlanıyor. ESSM'in en büyük avantajı sahip oldugu INS + X veya S band up-link ile, sadece terminal safhada aydinlatma radarina ihtiyac duymasi.
Özet olarak  "Thales Smart-S MK2" radarı yeni ESSM füzesini güdümlemek için de kullanılıyor.

SMART-L
Bu yazıyı yazdıktan sonra SMART-S Mk2 radarını müteakip SMART-L radarının çıktığını farkettim. Bu radar çok daha uzun menzilli.

Anlaşıldığına göre SMART-S radarının ilk ismi sadece SMART iken bu radarın çıkmasıyla beraber ismi SMART-S olarak değiştirilmiş.
 

SMART-L radarı

Bu radar yapılan bir yazılım güncellemesiyle ortaya çıkan Smart-L ELR (Extended Long Range) modelinin 400 km öteden ateşlenen bir balistic füzeyi tesbit edebildiği yazılıyor. 2012 yılında çıkan Royal Netherlands Navy and Thales Sign SMART-L Early Warning Capability Contract başlıklı yazıya göre balistik füze tesbit edebilme yeteneği Hollanda donanmasında kullanılmaya başlanmış.

Buradan aldığım şekilde Smart-L radarının yayın yeteneği ile ilgili bir şekil görebilirsiniz.
Yükseliş açısı (Elevation angle) hakkında bilgi almak için Radar Temelleri başlıklı yazıyı okuyabilirsiniz.

Main metodu

Not :  Konu ile ilgili Komut Satırı Parse Etme başlıklı yazıya göz atabilirsiniz.

Main metodu

Hangi programlama dili olursa (C, C++, Java) derlediğimiz program çalışmaya başlamadan önce - yani main metodumuzdan önce - kullandığımız dile ait runtime kütüphanesi bazı hazırlıklar yapar.

Örneğin Windows üzerindeki C runtime kütüphanesi _mainCRTStartup gibi fonksiyonları çağırır ki böylece main metodumuz uygulamamıza geçilen argümanlar parse edilmiş olarak başlayabilsin.

C
Main metodu parametreli veya parametresiz yazılabilir. Örnek:

int main() şeklinde yazılması bu metodun sınırsız sayıda parametre alacağını gösterir.
Eğer int main (void) şeklinde yazarsak bu metodun hiç parametre almayacağını belirtiriz. Bu durumda compiler bizim için küçük bir değişiklik yapar.

Main'den Önce Çağrılabilecek Metodlar
Gcc ile __attribute__((constructor) olarak işaretli bir metod main'den önce çağrılabilir. Örnek:

#include <stdio.h>

void beforeMain (void) __attribute__((constructor));

void beforeMain (void)
{
printf
("\nThis is before main\n");
}

int main ()
{
printf
("\nThis is my main \n");
return 0;
}


21 Şubat 2014 Cuma

Reflection ile Field'lara Erişmek

Java
Class Sınıfı
getDeclaredField - Verilen isme sahip public olan veya olmayan Field'a erişir
Bu metod ile verilen sınıfa ait public veya non-public tüm field'lara erişilebilir. Ancak kalıtım ile gelen üst sınıfların alanlarına erişilemez. 

Hiyerarşideki tüm field'lara erişmek için buradaki yazıya bakınız.

getField - Verilen isme sahip public Field'a erişir

Bu metod ile kalıtımla gelen veya sıfın için tanımlanmış olan tüm public field'lara erişilebilir. Burada getField() ve getDeclaredField() arasındaki farklara değinilmiş. Ayrıca burada da örnekler mevcut.
Field sınıfı Object döndürür. Döndürülen nesneyi istenilen tipe çevirmek gerekir. Örnek:

getFields - Tüm field'lara erişir
Bu metod ile tüm Field'lara bir Field[] olarak erişilebilir.

C#
FieldInfo Sınıfı
Type sınıfından ismi bilinen bir field hakkındaki bilgiler FieldInfo sınıfı ile alınır. Örnek'te private olan calls alanına erişiliyor:

Private alana erişmek
var field = GetType().GetField("calls", 
                                                  BindingFlags.NonPublic | BindingFlags.Instance);

Public Static alana erişmek
FieldInfo field = typeof (MyClass).GetField ("myField",
                                                       BindingFlags.Public | BindingFlags.Static);
if (field != null)
{
  int value = (int) field.GetValue (null);
}

DropDownList'e bulunulan ayın günlerini basan extension method

Merhaba arkadaşlar yine bir faydalı bir extension method paylaşıyorum. Herhangi bir dropdownliste bulunduğunuz ayın günlerini basan extension method
 public static bool Gun(this DropDownList drpGun)
        {
            List<ListItem> gunler = new List<ListItem>();
            DateTime bugun = DateTime.Now;
            for (int i = 1; i <= DateTime.DaysInMonth(bugun.Year, bugun.Month) + 1; i++)
            {
                if (i == 1)
                {
                    gunler.Add(new ListItem { Text = "Gün", Value = "sec" });
                }
                else
                {
                    gunler.Add(new ListItem { Text = (i - 1).ToString(), Value = (i - 1).ToString() });
                }
            }
            drpGun.DataSource = gunler;
            drpGun.DataBind();
            return true;
        }
Kullanımı...
  drpGunler.Gun(); //Şeklinde yapılırsa bulunulan ayın günleri dropdownliste bağlanıcaktır. 

C# Cümledeki kelimelerin baş harfleri büyüten extension method

Merhaba arkadaşlar faydalı olabilecek bir extension method daha paylaşıyorum sizlerle.
Kulandığınız string cümledeki kelimelerinin baş harflerini büyüten bir extension method

 public static string GrowfirstCharacter(this string Text)
        {
            string yeniKelime = ""; //Yeni oluşacak cümle
            if (Tex.Contains(" ")) //Boşluk içeriyorsa
            {
                string[] words = Text.Split(' '); //Boşluğa göre split edip string diziye atıyorum
                for (int i = 0; i < words.Length; i++)
                {
                    yeniKelime += words[i].Substring(0, 1).ToUpper() + words[i].Substring(1, words[i].Length - 1).ToLower() + " "; //ilk harfi büyütüp yeni cümleyi oluşturuyorum.
                }
                Tex = yeniKelime.TrimEnd(' '); //Sonda oluşan fazlalık boşluğu siliyorum
            } //Boşluk içermiyorsa
            else
            {
                Tex = Tex.Substring(0, 1).ToUpper() + Tex.Substring(1, Tex.Length - 1).ToLower();
            }
            return Tex;
        }
Kullanımı....
            Kullanım 1 (Direk string ifade üzerinden)
            string cumle = "bu bir cümledir".GrowfirstCharacter();
            
Çıktısı:  Bu Bir Cümledir
            Kullanım 2 (Extension class'ı üzerinden)
           string cumle = ExClass.GrowfirstCharacter("bu bir cümledir");
Çıktısı:  Bu Bir Cümledir

18 Şubat 2014 Salı

Singleton

Gang of Four
Tasarım örüntülerinin amaçlarından bir tanesi low coupling, high cohesion'a sahip kodlama yapmak.

High Coupling Örneği
Örnekte bir sınıf değişince bir başka sınıfın da etkilenmesi gösteriliyor. Bu durum high coupling için tipik bir sonuç.


Singleton

Singleton kavram olarak çok basit olmasına rağmen, farklı bir çok şekilde yaratılabiliyor. Aşağıda gördüğüm örnekleri toplamaya çalıştım.

C++

Static Metod Değişkeni Olarak
Bu örnekte, singleton nesnesi statik olarak getInstane metodu içinde tanımlanıyor.
Örnekte copy constructor C++11 yöntemiyle etkinsizleştirilmiş. Dolayısıyla aşağıdaki gibi kullanılması engellenmiş.
Object singleton = Object::instance(); //Hata verir
Object& singleton = Object::instance (); //Ok
Java
Lazy Singleton
İlk örnek en basit olanı.

Bu örnekte ise class loader kullanılarak, singleton sınıfının  bir defa yüklenmesi sağlanıyor.

Aşağıdaki örnekte Singleton'mış gibi görünen ancak gerçekte Factory olan tuhaf bir kullanım şekli var. Tam anlamıyla bir anti-pattern diye düşünüyorum.


Enum şeklinde Singleton
Bu alışılageldik bir yöntem değil. JVM'in kendi içinde kullandığı bir kilit ile bu nesneyi yarattığı dolayısıyla thread-safe olduğu belirtilmiş.
Örnek:
public enum UserActivity {
INSTANCE
;

public void dostuff() {
...
}
}

// use it as ...
UserActivity.INSTANCE.doStuff();
C#
Örnek'te bir ata sınıftan kalıtma gösterilmiş:
Ata sınıf:
public abstract class Singleton<ClassType> where ClassType : new()
{
static Singleton()
{
}

private static readonly ClassType instance = new ClassType();

public static ClassType Instance
{
get
{
return instance;
}
}
}
Kalıtan sınıf:
class Example : Singleton<Example>
{
public int ExampleProperty { get; set; }
}
Kullanım:
public void LameExampleMethod()
{
Example.Instance.ExampleProperty++;
}