<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Bir Gömülü Yazılım Bileşeninde Birim Testlerin Google Birim Test Aracı'yla Ana Sistemde Yürütülmesi</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Özgür KIZILAY</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Yuşa ÖZ</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>REHİS Elektronik Harp Görev Yazılımları Müdürlüğü, ASELSAN A.Ş.</institution>
          ,
          <addr-line>Ankara</addr-line>
          ,
          <country country="TR">Türkiye</country>
        </aff>
      </contrib-group>
      <fpage>48</fpage>
      <lpage>53</lpage>
      <abstract>
        <p>Execution of unit tests on target platform in embedded software has been a problematic issue due to the causes such as limited ready made test frameworks for embedded platforms, unpractical compile-linkrun loop and dependence to the target platform. If the software component to be tested fulfills necessary conditions, it may be possible that unit tests can be executed on host system instead of target platform and this may be considered as a more practical method. In this paper, using Google Test which is an open source unit test tool, unit tests of an embedded software component are executed on host system and gained experiences are introduced.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        yazılımların da bu gereksinimleri karşılaması gerekmektedir. Gereksinimler,
fonksiyonel ve fonksiyonel olmayan gereksinimler olmak üzere iki gruba ayrılabilir.
Hesaplamalar, teknik detaylar, veri idaresi ve işlemesi fonksiyonel gereksinimlerin
kapsamında ele alınır [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Fonksiyonel olmayan gereksinimler ise daha çok
işleyişi etkileyen gereksinimlerdir [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Örneğin en kötü işletim zamanları ve kaynak
kullanım kısıtlarını belirten gereksinimler fonksiyonel olmayan gereksinimlerdir.
      </p>
      <p>Fonksiyonel olmayan gereksinimlerden kaynak kullanımıyla ilgili olanların
karşılanması çoğu zaman yazılımın üzerinde koştuğu platforma bağlıdır.
Dolayısıyla eğer bu gereksinimler test yapılarak doğrulanacaksa bu testlerin nihai hedef
platformda yürütülmesi gereklidir. Fonksiyonel gereksinimlerin testlerle
doğrulanması için ise gereksinimlerin gerçeklenme yöntemlerine bağlı olmakla birlikte
çoğu zaman testlerin hedef platformda yürütülmesi gerekli değildir. Bu durum,
fonksiyonel gereksinimlerin testlerinin ana sistemde yürütülmesine olanak
sağlamaktadır.</p>
      <p>
        Fonksiyonel gereklerin karşılandığının tespiti birim testlerle
yapılabilmektedir. Birim test, yazılımda belli bir işlevi yerine getiren kaynak kod birimlerinin
bu işlevi yerine getirdiğinin test edilmesi ve kullanıma hazır olduğunun
tespitidir [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Gömülü yazılımlarda birim testlerin yürütülmesi sorunlu bir konu olarak
karşımıza çıkmaktadır. Bu durumun sorunlu olarak nitelendirilmesindeki ilk
neden, genel amaçlı bilgisayar platformları (Örnek:PC) için bulunan hazır birim
test çerçevelerinin gömülü platformlar için bulunmasının zor olmasıdır. Gömülü
platformlarda derleme-bağlama-koşturma döngüsünün pratik olmaması da ikinci
neden olarak karşımıza çıkmaktadır. Birim testlerin hedef platformda
yürütülmesinin sorunlu olarak değerlendirilmesine neden olan son sebep olarak hedef
platforma bağımlı kalınması gösterilebilir. Bazı projelerde gömülü yazılımın
üzerinde koşacağı platform, gömülü yazılımın geliştirilmeye başlamasından daha
sonra hazır hale gelebilir. Böyle durumlarda yazılım testlerinin yürütülmesi
gecikecek ve yazılım doğrulanmadan geliştirilmeye devam edecektir.
      </p>
      <p>Bir gömülü yazılım bileşeni için oluşturulan birim testlerin yukarıda anlatılan
muhtemel sorunların yaşanmaması için ana sistemde yürütülmesi sonucu
edinilen tecrübeler ve kazanımlar bu bildirinin esas konusudur. İlerleyen bölümlerde
Google Test Aracı tanıtılmış, neden bu aracı seçtiğimizden bahsedilmiş, test
edilen gömülü yazılım bileşeni hakkında bilgi verilmiş, test yöntemi aktarılmış ve
son olarak bu yöntemle elde edilen kazanımlardan bahsedilmiştir.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Google Birim Test Aracı Nedir?</title>
      <p>
        Google birim test aracı [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], C++ programlama dili için ‘xUnit’ mimarisine
dayanan bir birim test kütüphanesidir. ‘C’ ve ‘C++’ kaynak dosyalarında,
modifikasyon gerekmeksizin birim test yapılabilmesine imkan vermektedir. Google birim
test aracının testleri nasıl gerçekleştirdiği aşağıda kısaca anlatılmıştır. T EST ()
makrosu, Google birim test aracına bir test yazıldığını belirtmektedir ve Google
birim test aracında test edilecek birimler T EST () makrosunun içine
yazılmaktadır. Örnek bir test makrosu örnek olarak aşağıda verilmiştir.
TEST(CarpmaTest, CarpimDogruMu)
{
      </p>
      <p>EXPECT_TRUE(carp(3,3) == 9);
EXPECT_FALSE(carp(4,3) == 12);</p>
      <p>EXPECT_EQ(10, carp(3,3));
}
carp(x; y) fonksiyonunun aldığı iki argümanı çarparak işlem sonucunu
döndüğünü kabul edersek, verilen örnekte, çarpım işlemlerinin doğruluğunu test eden
bir test durumu oluşturulmuştur. T EST () makrosunun içine yazılan ilk
argüman test durumunun adı, ikinci argüman ise testin adıdır. EXP ECT _T RU E(),
içinde yazılan ifadenin doğruluğunu test etmekte ve bir sonraki cümleye
geçmektedir. EXP ECT _F ALSE() cümlesi ise EXP ECT _T RU E() cümlesinin
mantıksal olarak tam tersi şeklinde işlemekte, test cümlesinde içine
yazdığımız ifadenin yanlışlığı kontrol edilmekte ve bir sonraki cümleye geçilmektedir.
EXP ECT _EQ() cümlesi de aldığı iki argümanın birbirine eşit olup olmadığını
kontrol etmektedir. İlk argüman beklenen değer, ikinci argüman ise gerçek
değerdir. Bu cümleden sonra test bitmektedir. Google birim test aracı, test etme
işleminde kaç tane test durumunun çalıştırıldığını ve kaç tane testin başarılı
olup kaç testin başarısız olduğunu sonuç olarak göstermektedir. Başarılı testler
"P ASSED" olarak, başarısız testler ise "F AILED" olarak gösterilmektedir.
Testlerin içinde bulunan başarısız test cümleleri için beklenen ve gerçek değer
ekranda gösterilerek kullanıcıya yol gösterilmektedir. Ayrıca Google birim test
aracı, test durumlarını koşturmadan önce test durumuna özel test koşullarının
oluşturulması için kullanıcıya bir “fixture” sınıfı sunmaktadır. Bu sınıfta SetU p()
ve T earDown() fonksiyonları sunulmuştur. SetU p() fonksiyonu ilgili test
koşmadan hemen önce ve T earDown() fonksiyonu ise testin bitmesinden hemen
sonra otomatik olarak çağrılmaktadır. Bu fonksiyonların içi kullanıcı tarafından
doldurulmaktadır. Kullanıcı “fixture” sınıfı yardımıyla test için gerekli bağlamı
yaratmakta ve test bittikten sonra da teste özel yarattığı bağlamı
temizlemektedir.</p>
      <p>Google birim test aracı, yukarıdaki testin içine yazılmış test cümleleri dışında
birçok test cümleleri barındırmaktadır ve her test cümlesinin test
planlamasındaki etkisi farklıdır. Örneğin; ASSERT _EQ() fonksiyonu iki argüman alır ve
bu iki argümanın birbirine eşit olup olmadığını kontrol eder. Bu iki argüman
birbirine eşit değil ise test başarısız olur ve diğer hiçbir test yapılmadan tüm
test planlaması bitirilir. Bu gibi değişik işlevleri olan test cümlelerinin varlığı,
kullanıcının yapacağı testlere işlevsellik katmakla beraber geliştiricinin özgün ve
çeşitli test planlaması yapmasına olanak sağlamaktadır.
3</p>
    </sec>
    <sec id="sec-3">
      <title>Neden Google Birim Test Aracı?</title>
      <p>
        Birim testlerimizde Google birim test aracını seçmemizdeki nedenlerden ilki
Google birim test aracının ücretsiz ve açık kaynaklı bir kütüphane olmasıdır.
Ücretsiz olması, yazılım geliştiricisini ekonomik bir yükten kurtarmaktadır.
Kütüphanenin açık kaynaklı olması ise kütüphaneye erişimi ve kullanımı
kolaylaştırmaktadır. Google birim test aracını seçmemizdeki diğer bir neden ise güvenilir
bir birim test aracı olmasıdır. Google dahil dünyanın birçok büyük teknoloji
ve bilişim firması birim testleri için bu aracı kullanmaktadır. Chrome
tarayıcısının ve Chrome işletim sisteminin arkasındaki Chromium projeleri, LLVM
derleyici, OpenCV kütüphanesi gibi projelerde Google birim test aracı
kullanılmaktadır [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Bu durum da Google birim test aracının güvenilir olduğunun bir
göstergesidir. Google birim test aracı, Linux, MAC OS X, Symbian gibi birçok
platform üzerinde koşmaktadır. Bu özelliği ile değişik işletim sistemine sahip
ana platformlar üzerinde de birim test işlemi gerçekleştirilebilmektedir. Ayrıca,
XML test raporu üretebilmesi, parametrelerin değeri veya tipi için test
yapabilmesiyle Google birim test aracı, birim testler için tercih edilen bir yazılım
haline gelmiştir [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Google birim test aracında testleri çalıştırmak da oldukça
kolaydır. Google birim test aracının kendi kütüphanesinde önceden tanımlı olan
RU N _ALL_T EST S makrosu ile tüm testler koşturulabilmektedir. Testleri
kolayca koşturma özelliği sayesinde yazılım geliştiricileri tarafından tercih sebebi
olmaktadır [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
4
      </p>
    </sec>
    <sec id="sec-4">
      <title>Test Edilen Yazılım Modülü</title>
      <p>Birim testlerinin ana sistemde yürütülmesi deneyimlenen yazılım bileşeni olan
veri yönetimi bileşeni, büyük bir elektronik harp projesinin elektronik taarruz
alt sistemi gömülü kontrol biriminde yer alan ve özel formatlı veri tablolarının
yazılımdaki organizasyonundan sorumlu olan yazılım bileşenidir. Veri yönetimi
bileşeni veri tablolarının okunması, saklanması ve veri tabloları üzerinde
sorguların yürütülmesi işlevlerini yerine getirir. Bu bileşen 40’a yakın farklı tablo
tipini ve birden fazla tabloyu girdi olarak alabilen 40’a yakın sorguyu
barındırmaktadır. Bu bileşenin birim testlerini ana sistemde yürütmeyi tercih etmemizin
sebepleri; bu bileşenin içerdiği veri tabloları okuma ve sorguların hataya açık
kısımlar olmakla birlikte yoğun birim testlere tabi tutulmaları gerekliliği, bileşenin
modüler yapıda olması ve bileşenin hedef platforma bağlı olmamasıdır.
5</p>
    </sec>
    <sec id="sec-5">
      <title>Birim Test Ortamı</title>
      <p>Veri yönetimi bileşeni açık kodlu Eclipse geliştirme ortamında C++ diliyle
geliştirilmiştir. Eclipse için Aselsan bünyesinde geliştirilmiş bir eklenti, kaynak
kodlarımızı hedef platformda kullandığımız gerçek zamanlı işletim sistemi olan
VxWorks araç zinciriyle kolayca derlememizi sağlamaktadır. Bu eklentinin
yardımıyla aynı geliştirme ortamında hem hedef platform için hem de ana sistem
olarak kullandığımız Windows işletim sistemine sahip bilgisayar için derleme
yapma yeteneğine sahip olmaktayız. Aynı çalışma alanında yer alan
projelerden veri yönetimi bileşeni projesi hedef platform için derlenmekte, veri yönetimi
birim test projesi ise ana sistem için derlenmektedir. Birim test projesine,
bileşenin kaynak kodları referans olarak eklenmektedir. Böylece orijinal kaynak kodlar,
müdahale riski olmadan ana sistem için derlenebilmektedir. Bileşen bünyesinde
geliştirilen fonksiyonlar test için hazır hale geldikçe geliştirmeye paralel olarak
testler de yürütülmüştür.
6</p>
    </sec>
    <sec id="sec-6">
      <title>Kazanımlar</title>
      <p>Veri yönetimi bileşeninin birim testlerinin hedef platform yerine ana sistemde
yürütülmesi, biz geliştiricilere çeşitli faydalar sağlamıştır. Sağlanan en büyük
fayda zaman kazancı olmuştur.</p>
      <p>Bir gömülü sistem yazılımında derleme-bağlama ana sistemde yapılmakta,
koşturma hedef platformda yapılmaktadır. Derleme-bağlama sonucu oluşan
yürütülebilir dosyalar hedef platforma yüklenir ve hedef platformda yürütülür.
Yazılım, hedef platform üzerinde istenilen şekilde çalışmıyorsa hatalar giderildikten
sonra hedef platformda tekrar yürütülmelidir. Gerek birim testler yürütülürken
gerekse de birim test sonuçları uyarınca tespit edilen hataların takibi/düzeltmesi
yapılırken kod defalarca derleme-bağlama-koşturma döngüsüne girmektedir. Bu
döngü sırasında platform değiştirmenin getirdiği zaman kaybı, bu döngünün
birçok kez tekrarlandığı göz önüne alındığında ciddi boyutlara ulaşmaktadır. Veri
yönetimi bileşeni birim testlerinde kullanılan yöntem, bizi bu maliyetten
kurtararak bize zaman kazandırmıştır. Birim testlerin yürütülmesi için yaşanan
derlemebağlama-koşturma döngüsü bütünüyle ana sistemde yapılmıştır.</p>
      <p>Birim testlerin hedef platform yerine ana sistemde koşturulmasının zaman
kazancından başka getirdiği bir avantaj ise hata ayıklama kolaylığıdır. Gömülü
sistemler üzerinde çalışan yazılımlarda hata ayıklamak çoğu geliştirme ortamında
mümkün olmamaktadır. Birim testler yürütülürken, PC ortamındaki geliştirme
ortamlarında sunulan hata ayıklama işlevleri kullanılarak verimli bir hata tespit
etme süreci gerçekleştirilmiştir.</p>
      <p>
        Birim testlerin ana sistemde yürütülmesinin bize kazandırdığı en büyük
faydalardan biri de test edilen kodun işletim kapsamını, yani test edilen kodun hangi
kısımlarının koşturulduğunu, görmeye olanak sağlamasıdır. Özellikle çok fazla
koşul ve döngü kısımları içeren uzun kodlarda her bir koşulun veya döngünün
koşturulduğunu anlamak zor olmaktadır. Ana sistemde kullandığımız geliştirme
ortamı olan Eclipse aracına entegre bir şekilde çalışan GCov [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] eklentisi, bize
koşulun hangi kısımlarına girildiğini göstererek hazırladığımız testler ile kodun
uygulanmasını beklediğimiz kısımların gerçekten uygulanıp uygulanmadığını
bilmemize olanak sağlamaktadır. Ayrıca bu eklenti yardımıyla kodun işletim
kapsamının yüzde bilgisi de kullanıcıya sağlanmaktadır. Böylece projenin ne kadarlık
bir oranının teste tabi tutulduğu görülebilmektedir.
7
      </p>
    </sec>
    <sec id="sec-7">
      <title>Sonuç</title>
      <p>Birim testlerinin ana sistemde yürütülmesi 6. bölümde anlatılan faydalar göz
önüne alındığında verimli bir pratik olarak tecrübe edilmiştir. Kullanılan
yöntemle, gömülü yazılımlarda birim test süreci hem daha kolay uygulanır bir hale
gelmekte hem de süreç daha az zaman almaktadır. Böylece gömülü yazılım
geliştiricilerinin uygulamaktan imtina ettikleri birim test süreci uygulanabilir hale
gelmekte ve bu sürecin uygulanması yazılımın kalitesini arttıran bir faktör
olarak yazılım sistemine katkı sağlamaktadır. Bu tecrübemiz sonrasında ekibimiz
bünyesinde geliştirilen gömülü yazılımlarda, bu pratiğin uygulanmasına karar
verilmiştir.</p>
      <p>Bu çalışmadaki sonraki adım, hedef platforma bağlı kodlar bulunduran
gömülü yazılım bileşenlerine ait birim testlerin de ana sistemde yürütülebilmesi
için bir hedef platform soyutlama katmanının yazılmasıdır. Bu soyutlama
katmanıyla, hedef platforma özel fonksiyonlar ana sistem ortamında taklit edilerek
aynı işlevsel sonucu vermiş olacaklardır. Bu çalışmanın sonucu olarak birim
testlerin ana sistemde yürütülmesi için bileşenlerin hedef platforma özel kod
bulundurmaması gereği ortadan kalkmış olacaktır.</p>
    </sec>
    <sec id="sec-8">
      <title>Kaynaklar</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>S.</given-names>
            <surname>Edwards</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Lavagno</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Lee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            ,
            <surname>Sangiovanni-Vincentelli</surname>
          </string-name>
          ,
          <string-name>
            <surname>A.</surname>
          </string-name>
          :
          <article-title>Design of Embedded Systems: Formal Models, Validation and Synthesis</article-title>
          .
          <source>In: Proceedings of the IEEE</source>
          . vol.
          <volume>85</volume>
          , pp.
          <fpage>366</fpage>
          -
          <lpage>390</lpage>
          (
          <year>1997</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>United</given-names>
            <surname>States Government US</surname>
          </string-name>
          <article-title>Army: Systems engineering fundamentals</article-title>
          .
          <source>(PDF)</source>
          ,
          <source>ISBN 978-1484120835</source>
          (
          <year>2001</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Nixon</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chung</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yu</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mylopoulos</surname>
          </string-name>
          , J.:
          <source>Non-Functional Requirements in Software Engineering</source>
          . Springer US (
          <year>2000</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>A.</given-names>
            <surname>Kolawa</surname>
          </string-name>
          , D.Huizinga:
          <source>Automated Defect Prevention: Best Practices in Software Management</source>
          , p.
          <fpage>426</fpage>
          . Wiley-IEEE Computer Society Press,
          <source>ISBN 0-470-04212-5</source>
          (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>Google</given-names>
            <surname>Test</surname>
          </string-name>
          (accessed May 30,
          <year>2016</year>
          ), https://github.com/google/googletest
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>A</given-names>
            <surname>Quick</surname>
          </string-name>
          <article-title>Introduction to the Google C++ Testing Framework (accessed May 30,</article-title>
          <year>2016</year>
          ), http://www.ibm.com/developerworks/aix/library/augoogletestingframework.html
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>GCov - A Test Coverage</surname>
          </string-name>
          <article-title>Program (accessed June 8,</article-title>
          <year>2016</year>
          ), https://gcc.gnu.org/onlinedocs/gcc/Gcov.html
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>