<!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>YAZILIM ÜRÜN HATTINDA YETENEK TABANLI YAZILIM BİLEŞENLERİNİN DOĞRULANMASI</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Mert Burkay ÇÖTELİ</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Mehmet Emre ATASOY</string-name>
          <email>2eatasoy@aselsan.com.tr</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Anahtar Kelimeler: Yazılım Ürün Hattı</institution>
          ,
          <addr-line>Yetenek ağacı, Doğrulama Yöntemi, Birim Seviyesinde Testler, Yazılım Bileşeni</addr-line>
        </aff>
      </contrib-group>
      <fpage>315</fpage>
      <lpage>322</lpage>
      <abstract>
        <p>Özet. Yazılım ürün hattı (YÜH), belirli bir çalışma alanının ihtiyaçlarını karşılamak için, bileşen ve ürün seviyesinde yetenek ağacıyla uyumlu ortak yazılım bileşenleriyle hızlı bir şekilde ürün çıkartmaya dönük bir yazılım geliştirme yöntemidir. Yazılım ürün hattı yaklaşımında yazılım geliştirmeye dönük farklı çalışmalar bulunmakta olup, bileşen seviyesinde doğrulama, geçerli kılma açısından çok fazla çalışma bulunmamaktadır. Bu çalışma kapsamında, ilk aşamada her bileşen için ürün ağacı kullanılarak olası varyasyon kümeleri oluşturulmuştur. Sonrasında, birim seviyesinde testler bu varyasyon kümeleri yardımıyla tanımlanmış ve her bir varyasyon elemanı için test tanımları çıkartılmıştır. Bu sayede yazılım bileşeninin nihai ürünlerde kullanılacak farklı tipleri oluşturulan testlere göre doğrulanmış ve birim seviyesinde otomatik test tanımlarının koşturulması amaçlanmıştır.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>GİRİŞ
YAZILIM BİLEŞENLERİNİN KODLANMASI VE BİLEŞEN TABANLI
DOĞRULANMASI
Yazılım ürün hattında yazılım bileşenlerinin kodlanması normale göre farklıdır.
Yazılım ürün hattı yaklaşımı alan analizine dayalı olarak oluşturulan bir alt yapıdır. Bu
bağlamda bileşenler de alan analizine göre çeşitlilik gösterir. Yazılım bileşenleri
çeşitli varyasyonlardan oluşmaktadır. Bu varyasyonların seçimine göre çalışan yazılım
birimlerinin yetenek yönetimi yetenek ağacı kullanılarak yapılır [2].</p>
      <p>Yazılım bileşenleri, yetenek ağacından seçilecek varyasyonlara göre farklı şekilde
çalışmaktadır. Yazılım yetenek ağacının örnek bir parçası aşağıda verilmiştir.</p>
      <p>Şekil -1 Ürün yetenek ağacı
Aslında yazılım bileşeni birbirine alternatif olarak çalışan yeteneklerin hepsini
içermektedir. Ancak nihai sistemde bu yetenekler aynı anda çalışmayacaktır. Beraber
çalışacak yetenekler birer küme oluşturmakta olup her bir küme ayrı ayrı nihai
ürünlerde kullanılacaktır. Bu durum, yazılım bileşeninin bütün yeteneklerinin aynı anda
doğrulanmasını gereksiz ve etkisiz kılmaktadır. Yazılım bileşeni zaten bu yetenek
kümelerini içermektedir.
Bir yazılım sistemindeki hataları (bug) bulmak birim testler ile mümkün değildir.
Çünkü birim testlerin yaptığı iş yazılımın en küçük parçalarını kendi içerisinde test
etmektir. Bu küçük parçaların kendi içlerinde çalışıyor olması, yazılımın gerçek
kullanıcılar tarafından kullanılmaya başladığı zaman bir bütün olarak çalışacağını
göstermez. Bir yazılım sistemi, onu oluşturan parçaların toplamından çok daha fazlasıdır.
Dolayısıyla bu bütünü test etmek için farklı yöntemler kullanmak gerekir.
Fonksiyonel test ve entegrasyon testi bunlara örnek verilebilir. Ancak birim testler, yazılım
birimlerini birim seviyesinde doğrulamak ve yine birim seviyesinde hataları bulmak
için kullanılır.</p>
      <p>Standart birim test yaklaşımında yazılım biriminin belli bir oranı kapsanacak şekilde
birim testler yazılmaktadır. Ancak yazılım ürün hattı yaklaşımında önce de
bahsettiğimiz gibi yazılım birimi birden çok varyasyonda bulunmaktadır. Yazılım biriminin
bir varyasyonu diğerinin çalışmasını pozitif ya da negatif yönde etkileyebileceği için
birim testlerin yetenek modeli düşünülmeden koşturulması anlamlı olmayacaktır. Bu
çalışma kapsamında birim testlerin varyasyon kümelerine göre gösterdikleri
değişkenliklerden bahsedilecektir.</p>
      <p>Yetenek ağacına göre yazılım geliştirme aşamasında, yazılım birim testlerinin de
yetenek ağacı baz alarak gerçeklenmesi gerekmektedir. Birim test yazılan her bir
fonksiyonun olası girdileri yetenek ağacından elde edilen varyasyonlara göre
oluşturulur. Bu varyasyonlar dışında herhangi bir birim test kapsamasına gerek yoktur.
Varyasyon kümesinin her bir elemanı için birim test kümeleri oluşturulur. Bu birim test
kümeleri sadece ilgili varyasyonu kapsamaktadır. Nihai sistemde kullanılması
mümkün her bir varyasyon bu sayede birim seviyesinde doğrulanmış olur.</p>
      <p>Bu yöntemdeki amaçlar
1)
2)</p>
      <p>Nihai ürünlerde beraber çalışacak yeteneklerin birbirlerine yan etkilerini
ortaya çıkarmak: Klasik birim test yaklaşımında bu bilgi elde edilmemektedir.
Çünkü, bütün yetenekler beraber test edilmektedir ve her bir testin yan etkisi
ortaya çıkarmaktadır. (bu yan etkiler: ortak bellek kullanımı, veri tabanı
erişimi, işletim sistemi kaynakları kullanımı vb olabilir)
Aslında hiçbir zaman oluşmayacak hatalarla uğraşılmasının engellenmesi:
Klasik yaklaşımda rastgele birim test koşturulan ve birbirlerine yan etki
yaratan iki yetenek nihai üründe beraber çalışmayabilir. Bu iki yeteneğin
birbirlerine karşı yan etki yaratması olası ve kabul edilen bir durum olabilir.
Nihai üründe hiçbir zaman beraber çalışmayacak ve birbirinin alternatifi olan
bu iki yeteneği beraber doğrulamak anlamsızdır.
2.2</p>
      <p>YETENEK AĞACININ KULLANILMASI
Ürün ağacı farklı bileşen ağaçlarının birleştirilmesi yardımıyla oluşturulmaktadır.
Alan mühendisliğindeki genel yetenek ağacının ୢ olduğu düşünülürse uygulama
mühendisliğinden çıkacak her bir ürünün yetenek ağaçları ( ଵୟ ǡ ଶୟ ǡ ଷୟ ǥ ୬ୟ ) ǡ ୢ
üzerinden türetilebilir. ୢ ise alan mühendisliğinde türetilen tüm bileşenlerin ürün
ağaçlarının birleşimi ile oluşturulmaktadır. ୩ୢ bileşene ait yetenek ağacını
göstermektedir.</p>
      <p>ܷ ௗ ൌ ܤ ଵௗ ׫ ܤ ଶௗ ׫ ܤ ଷௗ ׫ ǥ ׫ ܤ
ௗ௞
Uygulama mühendisliğinde geliştirilecek bir ürün için ilk olarak alan
mühendisliğindeki bileşenlerin ürün ağacı kullanılarak ürüne özgü yetenek ağaçları
tanımlanmaktadır. Bu aşamada, ܤ ௡ௗ üzerinden varyasyonlar oluşturulmakta ve her ürünün yetenek
ağacı çıkartılmaktadır. Bileşen üzerinde varyasyon oluşturma işlemi ß olarak
tanımlanırsa uygulama mühendisliğindeki nihai ürün ağacının oluşturulma yöntemi
matematiksel olarak aşağıdaki gibi ifade edilebilir.</p>
      <p>é ௡ ሺܷ ௗ ሻ = é ௡ ܤሺ ௗଵ ׫ ܤ ௗଶ ׫ ܤ ଷௗ ׫ ǥ ׫ ܤ</p>
      <p>
        ௗ௞ ) = ܷ ଶ௔
= é ௡ ሺ ܤ ଵௗ ሻ ׫ é ௡ ሺ ܤ ଶௗ ሻ ׫ é ௡ ሺ ܤ ଷௗ ሻ ׫ ǥ ׫ é
௡ ሺ ܤ ௗ௞ ሻ = ܷ ௡௔
(
        <xref ref-type="bibr" rid="ref1">1</xref>
        )
(
        <xref ref-type="bibr" rid="ref2">2</xref>
        )
(
        <xref ref-type="bibr" rid="ref3">3</xref>
        )
YÜH ‘da ürüne dönük yetenek ağacı oluşturma yöntemi Şekil – 2 ‘de görülmektedir.
      </p>
      <p>Şekil -2 Ürün yetenek ağacı oluşturma yöntemi
Her bir bileşen için ܰ ௞ farklı varyasyon olacağını düşünürsek alan mühendisliğindeki
yetenek ağacı kullanılarak çıkartılabilecek olası ürün sayısı aşağıdaki şekilde ifade
edilebilir [1].</p>
      <p>
        ܰ ௦௞௔௠
ൌ ς ଵ௞ ܰ ௞
(
        <xref ref-type="bibr" rid="ref4">4</xref>
        )
Bu ifade ile olası ürünler için kompleksite ‘nin O(ܰ ௞ ௞ ) olduğu ve çok farklı ürün
çeşidinin yazılım ürün hattı yardımıyla çıkartılabileceği görülmektedir. Alan
mühendisliği çerçevesinde birim testleri tanımlamak; tüm varyasyonları göz önünde
bulundurmak anlamına gelmelidir. Tek bir denek varyasyon seti seçerek test girdilerini
oluşturmak çok gerçekçi doğrulama sonuçları sağlamayacaktır.
3
      </p>
      <p>YETENEK AĞACI TABANLI DOĞRULAMA YÖNTEMİ
Farklı ürünler aynı yazılım bileşenlerine farklı varyasyonların bağlanmasıyla
oluşturulabilmektedir. Bu sebeple, yazılım bileşenine ait metod ve sınıflar farklı ürünlerde
farklı şekilde sonuç veriyor olabilirler. Yazılım mimarisine bağlı olarak metodlar
varyasyon değişikliği sebebiyle değişikliğe uğramış veya metodun önkoşulları ile son
koşulları sınıf değişmezlerine bağlı olarak değiştirilmiş olabilir. Bu aşamada birim
testlerin uygulanacağı metodlar iki tipte incelenebilir [3].
a) İçeriği sabit olan metodlar
b) İçeriği değişen metodlar (Override)
Literatürde metodların testlerinin tam kapsaması düşünülerek farklı doğrulama
yöntemleri önerilmektedir. Bu yöntemlerden Concolic test ile yazılım metodu beyaz kutu
olarak kabul edilip olası tüm test girdileri çalıştırma yolu ağacı yardımıyla
tanımlanabilmektedir [5]. Test girdileri bazı araçlar yardımıyla otomatik olarak da
çıkartılabilmektedir. Bu çalışmada YÜH ‘da Concolic test yöntemi kullanılmış olup farklı
yöntemlerle de test girdileri oluşturulabilir. YÜH üzerinde varyasyon bağlamasından
sonra metodların çalışma şekillerinin değişeceği ve iki tip metodun oluşacağı
öngörülmektedir.</p>
      <p>
        YÜH ‘te Concolic test metodunu kullanarak test girdilerini oluşturduktan sonra bu
test girdileri üzerinden olası varyasyonlar için güncellemeler yapmak gerekmektedir.
Concolic test sonrası oluşturulacak veri kümeleri (
        <xref ref-type="bibr" rid="ref5">5</xref>
        ) ‘te görülmektedir.
ܶ ଵ ሺ ݃݅ݎ݀ǡ ­
ሻ ǡ ܶ ଶ ሺ ݀݃݅ݎǡ ­
ሻ ǥ
(
        <xref ref-type="bibr" rid="ref5">5</xref>
        )
Sınıf değişmezleri testin öncesinde, sırasında ve sonrasında değişmemesi gereken
değerlerdir. Bu sebeple hem test girdisinde hem de sonucunda bu değişmezlerin yer
alması gerekmektedir. YÜH varyasyon bağlaması sonrası oluşturulacak (a) tipindeki
metodlarda sınıf değişmezlerinin incelenmesi gerekmektedir. Bu değişmezler test
girdi ve sonuçları direk etkilemektedir. Şekil -3 ‘te sınıf değişkenlerinin yetenek ağacı
bağlantılı değişimi gösterilmektedir.
Şekil -3 (a) tipi metod test seti oluşturma yöntemi
(a) Tipindeki metodlarda Concolic test sonrası oluşturulmuş test setleri 6.
denklemdeki gibi güncellenebilir. Yani metodun tam doğrulanması için her olası ürün
konfigürasyonu kullanarak test setlerini oluşturmak gerekmektedir.
ܶ ଵ ሺ ݃݅ݎ݀ ר ܫ
Aynı fonksiyon farklı varyant değerleri için farklı değerler verebilir. Fonksiyon işlevi
aynı olmasına sınıf değişmezleri farklılıklarından dolayı aynı fonksiyonun farklı test
girdileriyle test edilmesi gerekmektedir. Örneğin özellik seti olarak silah tipi seçilirse
A, B veya C tipindeki silahlar için sınıf değişmezleri atış menziline göre değişkenlik
gösterir. Aşağıdaki fonksiyon bu sınıf değişmezine göre işlem yapmakta olup atış
yapılıp yapılamayacağına dönük çıktı vermektedir.
//When Silah Tipi = A || B || C
      </p>
      <p>public Boolean CheckItCanShoot(Location targetloc, Location
ownloc)
Bu fonksiyon için tasarlanacak olan birim testlerinin farklı varyant tipleri için
değerlendirilmesi gerekmektedir. Varsayılan bir varyant tipi için birim test girdileri
tanımlanacak, sonrasında bu birim test girdileri varyant değişimlerine göre değişkenlik
gösteren sınıf değişmezleri ile güncellenecektır. Test girdilerinin her bir varyant için
baştan çıkartılmasına gerek yoktur.
(b) tipindeki metodlarda ise sınıf değişmezlerinin ve concolic test yönteminin değişen
her varyasyon için incelenmesi gerekmektedir. Şekil - 4 ‘te sınıf değişkenlerinin
yetenek ağacı bağlantılı değişimi gösterilmektedir.
Şekil -4 (b) tipi metod test seti oluşturma yöntemi
(b) Tipindeki metodlarda ise Concolic test sonrası oluşturulmuş test setleri 7.
denklemdeki gibi güncellenebilir. Bu koşulda varyasyonun bağlanması sonrası her metod
için concolic test metodunu uygulayıp, sonrasında sınıf değişkenlerini kullanarak bu
test setlerini güncellemek gerekmektedir.
ܶ ଵ୩ ሺ ݃݅ݎ݀ ר ܫ
Bu tipteki metodlar için test girdi seti oluşturma yöntemi aşağıdaki örnekle
açıklanabilir. YÜH hattında özellik seti olarak açı tipi ve buna karşılık gelen varyant değerleri
olarak da Derece, Radyan ve Grad seçilebildiğini düşünelim. (i) numaralı fonksiyon
varyant tipi Derece olarak seçildiğinde yapılacak olan işlemleri göstermekte olup, (ii)
numaralı fonksiyon varyant değeri olarak Radyan seçildiğinde çağırılacak olan
fonksiyondur. YÜH ‘dan çıkacak ürünlerde sadece Derece cinsinden bir varyant kullanımı
seçilebilir veya Radyan ile birlikte Derece kullanımı seçilebilir. Varyant seçimleri bu
fonksiyonları direk etkileyeceğinden dolayı fonksiyonların isimleri aynı kalmasına
rağmen fonksiyonların iki duruma göre farklı yazılması gerekmektedir.
(7)
(i) //when Default Degree</p>
      <p>public float CalculateAngleBetweenPos(float targetangle1,
float targetangle2)
(ii) //when Radian</p>
      <p>public override float CalculateAngleBetweenPos(float
targetangle1, float targetangle2)
Yetenek ağacı yardımıyla ürün oluşturulurken direk etkilenebilecek olan bu tipteki
fonksiyonlar için test girdilerinin baştan oluşturulması gerekmektedir. Birim testlerin
yetenekler ürüne eklendikten sonra yapılması daha uygun olacaktır. Örneğin
yukarıdaki örnek için 3 farklı test veri setinin kullanılması gerekmektedir.
Bu çalışma kapsamında YÜH kullanılarak geliştirilen yazılımların birim testlerinin
farklı ürün varyasyonları kapsamında çıkartılmasına dönük bir yöntem önerilmiştir.
Bu yöntem ile farklı yeteneklerin varyasyon seçimlerine bağlı olarak birim test
girdileri güncellenmiştir. Tüm varyasyonların birlikte çalışamayacağı düşünüldüğünde
nihai ürün içerisinde yer alabilecek varyasyonların seçilip bu varyasyonlara göre test
girdilerinin şekillendirilmesi önemlidir. Test etkisinin incelenmesi gelecekte
yapılacak bir çalışma olarak değerlendirilebilir. YÜH ‘da geleneksel yöntemlerle birim
testlerinin gerçekleştirilmesi ve aynı yazılımda bu önerilen yöntemle birim testlerinin
gerçekleştirilmesi sonrasında test etkisindeki değişim incelenebilir. Test girdilerinin
yetenek bağlanması sonrasında bir yazılım yardımıyla otomatik olarak çıkartılması
amaçlanmakta olup gelecek bir çalışma olarak hedeflenmektedir.
5</p>
      <p>REFERANSLAR</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Çöteli M. B.</surname>
          </string-name>
          <article-title>; “Testing effectiveness and effort in Software Product Lines”</article-title>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Sc</surname>
          </string-name>
          .Thesis, METU, Ankara,
          <year>2013</year>
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2. Atasoy E.; “Hierarchical Variability Management in Software Product Lines”,
          <string-name>
            <given-names>M.</given-names>
            <surname>Sc</surname>
          </string-name>
          .Thesis, METU, Ankara,
          <year>2013</year>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Bruns</surname>
            <given-names>D.</given-names>
          </string-name>
          ;
          <string-name>
            <surname>Klebanov</surname>
            <given-names>V.</given-names>
          </string-name>
          ;
          <string-name>
            <surname>Schaefer</surname>
            <given-names>I.</given-names>
          </string-name>
          ;
          <article-title>“Verification of Software Product Lines with Deltaoriented Slicing”, 2007</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Kolb</surname>
            , R.; Muthig,
            <given-names>D.</given-names>
          </string-name>
          <article-title>; “Making Testing Product Lines More Efficient by Improving the Testability of Product Line Architectures”</article-title>
          ,
          <source>in Workshop on Role of Software Architecture for Testing and Analysis</source>
          ,
          <year>2007</year>
          , pp
          <fpage>22</fpage>
          -
          <lpage>27</lpage>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Sen</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ;
          <string-name>
            <surname>Agha</surname>
          </string-name>
          , G.;
          <article-title>“CUTE and jCUTE : Concolic unit testing and explicit path model-checking tools”</article-title>
          ,
          <source>CAV'06</source>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>