<!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>Çevik Yazılım Geliştirmede BDD/TDD Yöntemlerinin ve Yazılım Kalite Araçlarının Kullanılması: Bir Yazılım Mühendisliği Dersindeki Tecrübe</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Gökhan Akyol</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Haluk Gümüşkaya İzmir Yüksek Teknoloji Enstitüsü</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>İzmir gokhanakyol@iyte.edu.tr</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>haluk@gumuskaya.com</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Anahtar Kelimeler: Çevik Yazılım Geliştirme</institution>
          ,
          <addr-line>BDD, TDD, Yazılım Test ve Kalite Araçları</addr-line>
        </aff>
      </contrib-group>
      <fpage>219</fpage>
      <lpage>230</lpage>
      <abstract>
        <p>Özet. Çevik yazılım geliştirme modeli iyi uygulandığında, yazılım proje yönetimini, yazılım takım elemanları arasındaki iletişimi ve yazılım geliştirme süreçlerini ve süresini iyileştirmektedir. Çevik yazılım geliştirme modelinde, son kullanıcının yazılım geliştirme sürecinin içinde olduğu bir yazılım ürünü, değişen gereksinimlere daha hızlı cevap verir. Bu çalışmada Davranış Tabanlı Tasarım (BDD-Behavior Driven Design) ve Test Tabanlı Geliştirme (TDD-Test Driven Development) tekniklerinin SaaS (Software as-a Service) uygulamaları geliştirmede beraber kullanıldığı bir bütünleşik çevik yazılım geliştirme süreci ve çerçevesinde, günümüzde kullanılabilecek yazılım test ve kalite ölçme araçları karşılaştırılmaktadır. Sunulan çevik yazılım geliştirme süreci ve çerçevesi bir son sınıf Yazılım Mühendisliği dersinde üç yıl öğrencilerin geliştirdikleri projelerde uygulanmıştır. Bu çalışma, dört farklı proje gerçekleştirme teknolojileri ve platformları (Ruby/Rails, Java EE/Spring, C#/ASP.NET ve PHP/(Zend, Codeigniter, Laravel) kullanılarak, Microsoft Azure ve Heroku bulut servis sağlayıcılarında çalışan SaaS uygulamaları geliştirmede kullanılan BDD ve TDD test ve kalite araçlarıyla elde edilen tecrübeyi sunmaktadır.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 Giriş</title>
      <p>
        Yazılım mühendisliği, proje ve süreç yönetimi teknolojik gelişmelere bağlı olarak
değişmektedir. Günümüzde yazılımlar gittikçe bulut servis sağlayıcıları üzerinden son
kullanıcılara sunulmaktadır ve bulut teknolojileri ve servisleri yazılım geliştirme
fazlarını değiştirmektedir. Yazılım endüstrisinde çoğunlukla kullanılan yazılım
geliştirme metotları şelale ve çevik yazılım geliştirme yöntemleridir. Şelale
modelinde yazılım geliştirme safhaları sırasıyla yerine getirilir. Gereksinimlerin
toplanması ve analiz safhasında, müşteri ve ürün özellikleri toplanır ve analiz edilir.
Tasarım ve gerçekleştirme fazlarında gereksinim değişiklikleri genelde göz ardı
edilerek yazılımın esnekliği kısıtlanmış olur [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Şelale modelinin getirmiş olduğu
dezavantajlar ve günümüz hızlı ürün teslimi, iş baskısı, yazılım geliştiren firmaları
çevik yazılım geliştirme yöntemlerini kullanmaya yönlendirmiştir. Çevik yazılım
geliştirme, müşteriyi projeye dahil etme, değişen gereksinimlere ayak uydurma, iş
analisti, yazılımcı, test edici gibi kişilerin projede beraber görev almaları, haftalık
yapılan yüz yüze iletişim, sık aralıklarla ürün testi ve teslimi gibi özelliklerinden
dolayı şirketlerce çok kullanılan bir yazılım geliştirme süreci olmuştur [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ].
      </p>
      <p>
        Çevik yazılım geliştirmede kullanılan yaygın yazılım proje yönetim tekniği Scrum
modelidir. Scrum modelinin en önemli özellikleri, Scrum takım modeli, kullanıcı
hikayeleri (user stories) ve koşudur (sprint). Scrum modelinde ürün sahibi (product
owner), scrum ustası (scrum master) ve geliştirme takımı bulunur. Müşteri
gereksinimleri kullanıcı hikayeleri aracılığı ile tanımlanmaktadır. Her bir koşu
sonunda ortaya çıkan ara ürünler sayesinde müşteri proje gelişmesini takip eder ve
projenin bir parçası olur. Çevik yöntemler ile proje küçük parçalara ayrılarak
karmaşıklık azaltılır, projenin riski en aza indirilerek para ve zaman kaybının önüne
geçilmiş olur [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
      <p>Bu çalışmada çevik yazılım geliştirmede yaygın olan Scrum ve BDD (Behavior
Driven Design) ve TDD (Test Driven Development) tekniklerinin bir arada
kullanıldığı ve yazılım kalite araçları ile desteklenen bulut yazılım servisleri (SaaS
uygulamaları) geliştirme tecrübesi sunulacaktır. Bu yazılım projeleri, gerçek müşteri
problemlerini çözmeye yönelik ve müşterilerin projelere dahil edildiği gerçek
uygulamalardır. Sunulan bu yazılım geliştirme yöntemi ve teknikleri Gediz
Üniversitesi Bilgisayar Mühendisliği Bölümü’nde verilen COM 401 kodlu Yazılım
Mühendisliği dersinde 2013-2015 yılları arasında üç sene uygulanmıştır. Bildiride
sunulan model, ilk iki sene sadece Ruby/Rails ile geliştirilen projelerde, son 2015
senesinde dört farklı programlama dili ve ortamı (Ruby/Rails, Java/Spring,
C#/ASP.NET ve PHP/(Zend, Codeigniter, Laravel) kullanılarak geliştirilen projelerde
kullanılmıştır. BDD/TDD çatıları ve farklı programlama dilleriyle geliştirilen projeleri
destekleyen bulut servis sağlayıcıları olan Microsoft Azure ve Heroku bulut
ortamlarına projeler taşınarak SaaS uygulamaları çalıştırılmıştır.</p>
      <p>Bu bildirinin yapısı şu şekildedir: İkinci kısımda çevik yazılım geliştirme, bulut
bilişimin yazılım geliştirmeyi nasıl etkilediği ve BDD/TDD ile ilgili çalışmalar
sunulmuştur. Üçüncü kısımda bulut servisleri geliştirmeye yönelik geliştirdiğimiz acil
yazılım geliştirme modelimiz verilmektedir. Dördüncü kısımda Yazılım Mühendisliği
dersimizde üç yıl bu model temelli geliştirilen proje uyugulamaları ve kullanılan
teknolojiler ve araçlar karşılaştırmalı olarak verilmektedir. Son kısımda bu
uygulamalarla elde edilen eğitim ve uygulama tecrübeleri sunulmaktadır.</p>
    </sec>
    <sec id="sec-2">
      <title>2 İlgili Çalışmalar</title>
      <p>
        Bulut için geliştirdiğimiz acil yazılım geliştirme modelimizde, ilgili projeyle ilgili
problem tanımlanıp ilk kaba gereksinim analizi yapıldıktan sonra, yazılım geliştirme
süreci BDD/TDD yöntemleri kullanılarak devam eder ve ürün geliştirilir. BDD/TTD
yöntemleri ve prensipleri, alan tabanlı tasarım (domain driven design) ve nesneye
yönelik analiz ve tasarımdan alınan fikirlerle geliştirilmiştir [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
      </p>
      <p>
        Son on yılda gereksinim mühendisliği alanında aşağıdaki önemli gelişmeler
olmuştur. Bu gelişmelerden biri acil süreçlerin yaygınlaşması ve BDD/TDD’nin
yazılım tasarım ve geliştirmede kullanımının artmasıdır [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].



İş analistliğinin profesyonel bir meslek olması ve bu alanda Uluslararası İş
Analistliği Enstitüsü ve Uluslarası Gereksinim Mühendisliği Heyeti gibi
organizasyonların kurulması.
      </p>
      <p>Gereksinim analizi ve yönetimi ile ilgili araçların olgunlaşması ve bu araçların
prototip geliştirme, modelleme ve benzetim gibi alanlarda kullanılarak
gereksinim analizine yardımcı olması.
Çevik yazılım geliştirme yöntemlerinin kullanımının artması ve acil projelerde
gereksinimlerin ele alınma yöntemlerinin gelişmesi (BDD/TDD, kullanıcı
hikayeleri, …)</p>
      <p>
        Yukarıda yer alan gereksinim mühendisliği ilerlemelerine ek olarak, son yıllarda
bulut bilişimin Yazılım Geliştirme Yaşam Döngüsünü (SDLC) çok etkilemeye
başladığı, yazılım analiz, tasarım ve gerçekleştirme yöntemlerini değiştirdiğini
görmekteyiz [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        Çevik yazılım geliştirme süreçleri, yazılım endüstrisi ve eğitiminde çok
kullanılmaktadır. Şirketlerdeki kullanımının yanında üniversite müfredatlarında yer
alan Yazılım Mühendisliği derslerinde çevik yazılım geliştirme yöntemleri yaygın
olarak kullanımaktadır [
        <xref ref-type="bibr" rid="ref7 ref8 ref9">7-9</xref>
        ]. Scrum bir çevik yazılım geliştirme proje yönetim modeli
olup yazılım mühendisliği projelerinde kullanımı kolay bir yöntemdir. Scrum proje
yönetim modeli bir kaç haftalık kısa zaman dilimleriyle geliştirilen yazılımın, tekrar
tekrar gözden geçirilip müşteriye en iyi ve kısa zamanda tamamlarak teslim
edilmesini sağlamayı amaçlamaktadır. Scrum modelinin kullanıldığı bulut
uygulamaları geliştirme, acil yazılım geliştirme felsefesine çok uygundur [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. Bulut
servis sağlayıcılar ve platformlar, ayrıca sundukları alt yapı servisleri ile çevik
yazılım geliştirmeye yardımcı olmakta ve hızlandırmaktadır [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
      </p>
      <p>
        Geleneksel yazılım mühendisliği yaşam döngüsünün veya acil yazılım süreçlerinin
anlatıldığı birçok kitap mevcuttur. A. Fox ve D. Patterson tarafından yazılan kitap
[
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] çevik yazılım geliştirme ve bulut bilişim tabanlı yazılım mühendisliğini sunan ilk
kitap olmuştur. Ruby/Rails kullanarak BDD/TDD yöntemleri ve Scrum acil proje
yönetimi ile SaaS uygulamaları geliştirip bir bulut servis sağlayıcıda çalıştırmayı
pratik olarak sunarak yazılım mühendisliğine yeni bir bakış açısı getiren bu kitap üç
yıl ana kaynağımız oldu.
      </p>
      <p>
        TDD 2000’li yıllardan günümüze özellikle çevik yazılım geliştirmede
uygulanamtadır. TDD’de test kodlarının fonksiyonel esas koddan önce geliştirilmesi
gerekir. Son yıllarda TDD iki aşamada ele alınmaktadır. Bunlar, Birim Test Tabanlı
Geliştirme (UTDD) ve Kabul Test Tabanlı Geliştirme (ATDD) şeklindedir. UDDD
birim testleri yaparak sistemin fonksiyonel olarak çalışmasını sağlayan geliştirme
yöntemidir. ATDD ise müşteri odaklı iş yapma seviyesinde yapılan bir geliştirme
yöntemidir [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. TDD’nin test çatısı (test framework) modelleriyle birlikte
kullanılması sonucu yazılım hataları düşmekte ve yazılımın kalitesi artmaktadır [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ].
TDD uzun yıllardır birçok yazılım firmasında yaygın kullanıldığı ve yazılım
hatalarını %50 oranında düşürdüğü görülmüştür [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]. BDD ürün sahibinin kullanıcı
hikayelerini kullandığı ve Scrum ustasına aktardığı bir tasarım modelidir. Kullanıcı
hikayeleri BDD’nin temel taşlarından bir tanesidir. Ürün sahibi kullanıcı hikâyelerini
belirli bir öncelik sırasına göre ürün içeriğine (Product Backlog) yerleştirir [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ].
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Çevik Yazılım Geliştirme Modeli Yaklaşımımız</title>
      <p>Çevik yazılım geliştirme modeli yaklaşımımız, geleneksel yazılım geliştirme
yaşam döngüsü safhalarından farklı şekilde tanımlanmıştır. İki ana kısımdan oluşan
çevik yazılım geliştirme modelimiz aşağıda verilmektedir:</p>
      <p>Problemin tanımlanması ve analizi:
 İş analizi ve önemli gereklerin toplanması ve analizi
Çözüm:
 Sistem (fonksiyonel) tasarımı ve fonksiyonel testler (BDD)
 Test ve kodlama (sınıfların ve metodların test sürümlü geliştirilmesi) (TDD)
 Yazılım kalite ölçümü ve iyileştirmeler (refactoring)
 Bulut servis sağlayıcıya aktarım</p>
      <p>Birinci safha iş analizi ve gereksinimlerin toplanmasıdır. MoSCoW metoduna
göre toplanan gereksinimler sınıflandırılır. İkinci safha olan çözüm alanında sistem
tasarımı BDD ile yapılır. Kodlama ve test kısmı TDD ile geliştirilirken, yazılımın
kalitesi ve olgunluğu çeşitli ölçütler sayesinde yazılım kalite araçları ile son
kullanıcının taleplerine uygun hale getirilir. Her iterasyon sonunda yazılım bir bulut
sağlayıcıya (Heroku veya Azure) aktarılarak çevik yazılım geliştirme süreci
tamamlanmış olur.</p>
      <p>Çevik yazılım geliştirme yaşam döngüsü, gereksinimlerin uyarlandığı ve test
edilebilir hale geldikten sonra son kullanıcı ile beraber çalışılarak bir veya iki haftalık
koşularla sistemin oluşturulmasıdır. Son kullanıcı, her bir koşuda aktif olarak görev
alır ve gereksinimlerin uygunluğunu denetler. Eğer son kullanıcının talepleri yerine
getirilir ise, yeni gereksinimlerin ele alınması ile yazılım geliştirme devam eder.
Geliştirilen yazılım, modüler ya da bir bütün olarak tüm test senaryolarından geçip
kullanıcının onayı ile bulut servis sağlayıcıya aktarılarak yazılım geliştirme son bulur.</p>
      <p>Son yıldaki yazılım geliştirme modelimiz, iş analizi ve gereksinim mühendisliği
fazıyla başlatıldı. Çevik yazılım geliştirmede doküman üretme yok denecek kadar az
olmasına rağmen, yeni modelimizde projelerin en önemli kısımlarının yazılması ve
bir proje yönetim planının üretilmesi istenmiştir. READ (Requirement Elicitation and
Analysis Document) adını verdiğimiz ilk doküman, problemin tam olarak ne olduğu,
önemli ilk çalışmaların yapıldığı, sistemin fonksiyonel (functional) ve fonksiyonel
olmayan (non-functional) gereksinimlerinin öncelik sırasına göre sınıflandırıldığı ve
en önemli kullanım senaryolarının (Use Case) belirlendiği ve kullanıcı ekranlarının
bulunduğu bir dokümandır.</p>
      <p>
        Modelimiz yazılım geliştirmeye klasik gerekler mühendisliği uygulamaları ile
başladıktan sonra BDD ile devam etmektedir. BDD, uygulamanın davranışına yönelik
sorular sorarak, yazılım ekibi ile son kullanıcı ilk ana fonksiyonları beraber tasarlar,
geliştirir ve test eder. BDD yazılımın ana fonksiyonlarının önce doğru ele alınıp
alınmadığını ve geliştirme ekibi tarafından gerçekleştirip gerçekleştirilmediğini test
eder. BDD ile tasarlanan kullanıcı hikayeleri test senaryolarına dönüştürülür. Kabul
testleri ile kullanıcıların ana ihtiyaçlarının karşılanması hedeflenir. Geliştirilen
projelerde kullanıcı hikâyeleri Pivotal Tracker [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ] proje yönetim aracı ile
yönetilmiştir. Bu uygulama ile tanımlanan kullanıcı hikayeleri öncelik sırasına göre
test ve geliştirme ekibine yollanır. Test ve geliştirme ekibi tarafından gerçekleştirilen
fonksiyonlar, ürün sahibi tarafından kontrol edilir. Eğer kullanıcının isteği tam olarak
yerine getirilmişse, Pivotal Tracker’daki “Kabul (Accept)” tuşu ile işlem sonlandırılır.
Aksi durumda ise “Kabul Etmeme (Reject)” tuşu ile işlem tekrar test ve yazılım
geliştirme ekibine geri gönderilir.
      </p>
      <p>
        Proje boyunca Pivotal Tracker programı ile takım performasını, verimliliğini ve
projenin hızını kullanıcı hikayeleri ile ölçebiliriz. Kullanıcı hikayeleri geliştirilirken
bir yandan da kullanıcı ara yüzleri çeşitli programlar vasıtasıyla oluşturulmaktadır.
BDD ile otomatik kabul testini sağlamak için çeşitli programlar kullanılmaktadır.
BDD için kullanılan mevcut araçlar genellikle Cucumber [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] programı temel
alınarak geliştirilmiştir. Cucumber ve benzeri programlarda, öznitelikler (features) ,
senaryolar (scenarios), adımlar (steps) ve adım tanımlamaları (step definitions) belirli
bir yapı ve programlama dili içerisinde tanımlanır. Adım tanımlamaları, test
metotlarını oluşturarak BDD için kabul testleri yerine getirilir. BDD safhasından
sonra kod gerçekleştirme safhasının yer aldığı TDD safhası gelir. Bu safhada önce
birim testleri yapılır ve sonra ana kodlar geliştirilir. BDD ve TDD’nin bir arada
kullanıldığı ve çeşitli programlama dillerine uygun olan yazılım altyapıları
(frameworks) ve tasarım şablonları mevcuttur. Yazılım kalite araçlarına da uyumlu
olan yazılım altyapıları bulut servis sağlayıcıya aktarılarak çevik yazılım geliştirme
modeli başarılı bir şekilde uygulanmış olur.
      </p>
    </sec>
    <sec id="sec-4">
      <title>4. Çevik Yazılım Geliştirme Modeli Yaklaşımımızın Uygulamalı Örnekleri</title>
      <p>
        Çevik yazılım geliştirme modelimiz üç yıl son sınıf Yazılım Mühendisliği dersinde
uygulanmıştır [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. İlk iki yıl çevik yazılım geliştirmede Ruby/Rails kullanıldı.
BDD/TDD yöntemleri ile yazılım geliştirme, test ve kalite araçları, bulut servis
sağlayıcı Heroku, Ruby dili ve Rails yazılım altyapısının sağlamış olduğu araçlar
kullanıldı. Tablo 1’de çevik yazılım geliştirme sürecinde kullanmış olduğumuz
araçlar gösterilmektedir. İlk iki sene temel geliştirme süreci çevik yazılım geliştirme
olup önemli bir dokümantasyon işi yapılmamış ve UML kullanılmamıştır.
Tablo 1. SaaS uygulamaları için çevik yazılım geliştirme araçları (2013 ve 2014 dönemleri).
Programlama Dili ve Alt Yapısı
BDD ve TDD Araçları
Kullanıcı Arayüzü Aracı
Proje Yönetim Aracı
Yazılım Kalite Aracı
Kod Versiyonlama Aracı
Bulut Servis Sağlayıcı
Çevik Yazılım Geliştirme Yöntemi
      </p>
      <p>Ruby / Rails
Cucumber (BDD) ve RSpec (TDD)
Indigo Studio
Pivotal Tracker
Metric_fu
GitHub
Heroku</p>
      <p>Scrum</p>
      <p>Modelimizin son uygulandığı 2015 yılında çevik yazılım geliştirme sürecimizi
koruyarak öğrencilere iş analizi ve gereksinim mühendisliği uygulamalarını yazılım
projelerine dahil ettik. Geçen iki seneden bir diğer önemli farkımız ise programlama
dili ve altyapısı kısmını serbest bırakarak öğrencilerin kendi seçimine sunduk.</p>
      <p>Son sene yapılan projeler, kullanılan diller ve alt yapılar, yazılım test ve kalite
ölçme araçları ve kullanılan bulut sağlayıcılar Tablo 2’de gösterilmektedir. Yazılım
Mühendisliği dersi 3 saat teorik 2 saat laboratuvar olarak yapılmıştır. Çevik yazılım
geliştirme sürecinin uygulamalı kısmı dersin asistanları tarafından yürütülmüştür.
Projeler bir dönemlik olup her bir proje 4 ya da 5 kişilik bir proje ekibinden
oluşmuştur. Belirlenen zamanlarda proje ekipleri her bir koşu sonunda projelerini
sunmuşlardır. Proje geliştirmede 3 adet koşu yer almıştır.</p>
      <p>Tablo 2. SaaS uygulamaları için çevik yazılım geliştirme araçları (2015 dönemi).
#</p>
      <p>Tablo 2’de görüldüğü gibi, 5 proje PHP ile 2 proje ise C#/ASP.NET ile ve diğer
kalan iki projeden biri Java EE, diğeri ise Ruby/Rails ile geliştirilmiştir. Bütün
projeler, kullanılan dile bağlı olarak BDD/TDD yöntemleri ile ve yazılımın bulut
servisleri ve uygulamaları olarak, sunucudaki yazılım MVC tasarım şablonu temel
alınarak RESTful tarzı web servisleri şeklinde geliştirilmiştir.</p>
      <sec id="sec-4-1">
        <title>4.1. PHP Tabanlı Çevik Yazılım Geliştirme</title>
        <p>
          PHP tabanlı çevik yazılım geliştirme, beş takım tarafından üç farklı yazılım alt
yapısı kullanılarak gerçekleştirilmiştir. PHP ile yazılım geliştirmede kullanılan
fonksiyonel gereksinimlerin test ortamı Behat’tır. Behat ortamı bir web tarayıcıda ya
da bir uygulama ara yüzü yazılımında kullanılabilmektedir [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ]. Behat ortamında
Gherkin dili [
          <xref ref-type="bibr" rid="ref21">21</xref>
          ] kullanılarak Given-When-Then kelimeleriyle ana fonksiyonlar
tanımlanır ve fonksiyonel test senaryoları oluşturularak kabul testleri geliştirilir. Şekil
1’de Behat ile yapılmış olan bir giriş sayfasının kullanıcının isteği doğrultusunda testi
yapılmaktadır. Öznitelik (feature) tanımlaması kullanıcı hikayesinden yapılır.
Ardından senaryo açıklaması ile kullanıcı hikayeleri Gherkin dili ile fonksiyonel
olarak dönüştürülür. Bu dönüşüm kullanıcı girişi modülünde yer alan metotlarla
eşlenerek testin başarılı olup olmadığı görülür.
        </p>
        <p>Şekil 1. Behat ile yapılan bir BDD fonksionel test örneği.</p>
        <p>
          Bir diğer BDD aracı Codeception’dır. PHP uygulamalarında kullanılan bu araç
kullanımı kolay, tarayıcı ve yazılım altyapısı (framework) desteği olan ve modüller
arası entegre çalışan bir ortamdır [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ]. Test tabanlı geliştirmede (TDD) ise bütün
projelerde PHPUnit kullanılmıştır. PHPUnit birim testleri yapmayı sağlayan ortamdır
[
          <xref ref-type="bibr" rid="ref23">23</xref>
          ]. PHP yazılım çatıları ile entegre çalışan bu ortam MVC mimarisinde de
kullanılmaktadır. Birim testlerini sağlayan ortamlarda ortak olarak bulunan ve test
etmeyi sağlayan anahtar kelime “Assert” deyimidir. Bu deyim beklenen ve gerçek
değerlerin kontrolünü yaparak modül testinde kullanılır.
        </p>
        <p>
          BDD ve TDD’nin bir arada kullanılarak geliştirilen PHP tabanlı çevik yazılım
projelerinin, yazılım kalite metrikleri ile yazılım kalitesini ölçen kalite araçları ile kod
kalitesi ölçülmektedir. Programcılar ve son kullanıcı tarafından görülen problemler,
sistemin içyapısı yeniden düzenlenerek, iyileştirme (refactoring) teknikleri ile kodlar
düzeltilerek programın hatasız bir biçimde kullanıcıya teslim edilmesi sağlanır. PHP
tabanlı çevik yazılım geliştirmede kullanılan yazılım kalite araçları PHP_CodeSniffer
ve PHP_Depend’dir. PHP_CodeSniffer [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ] belirli bir veri setinde tanımlanmış olan
kod standartlarına göre programın analiz edilmesini sağlamaktadır. PHP_Depend [
          <xref ref-type="bibr" rid="ref25">25</xref>
          ]
ise daha gelişmiş olan ve yazılım kalite ölçütlerine göre programı statik olarak analiz
eden araçtır. Şekil 2’de verilen örnek, bir PHP programının yazılım ölçütlerine göre
istatistiğini gösteren bir XML örnek şemasıdır. Bu şemada, projede bulunan paket
sayısı (nop), sınıf sayısı (noc), metot sayısı (nom), toplam kod satırı (loc) gibi
metrikler gösterilmektedir.
        </p>
        <p>Şekil 2. PHP_Depend ile yazılım ölçütleri istatistiğinin çıkartılması.</p>
        <p>PHP_Depend programı yazılım kalite ölçütlerini derecelendiren bir matris yapısı
da sunmaktadır. Derecelendirmenin çeşidine göre hangi yazılım kalite ölçütünün
iyileştirilmesi ya da hangi yazılım kalite ölçütünün iyi durumda olduğunu gösteren bir
modeldir.</p>
        <p>
          Bütün bu işlemlerin ardından hatasız ve kullanıcı ihtiyacını karşılayan yazılım
projeleri Heroku [
          <xref ref-type="bibr" rid="ref26">26</xref>
          ] bulut sağlayıcısına aktarılarak yazılımın bulut servisleri olarak
çalışması sağlanır. PHP tabanlı çevik yazılım geliştirmede kullanılan araçlar Tablo
3’de listelenmektedir.
        </p>
        <p>Tablo 3. PHP çevik yazılım geliştirme araçları.</p>
        <p>Programlama Dili ve Alt Yapısı
BDD ve TDD Araçları
Proje Yönetim Aracı
Yazılım Kalite Aracı
Kod Versiyonlama Aracı
Bulut Servis Sağlayıcı
Çevik Yazılım Geliştirme Yöntemi</p>
        <p>PHP (Zend, Codeigniter, Laravel)
Behat, Codeception (BDD) ve PHPUnit
Pivotal Tracker
PHP_CodeShiffer ve PHP_Depend
GitHub
Heroku
Scrum</p>
      </sec>
      <sec id="sec-4-2">
        <title>4.2. C#ASP.NET Tabanlı Çevik Yazılım Geliştirme</title>
        <p>
          C#ASP.NET teknolojisini kullanan iki proje takımı vardı. Bu projelerdeki BDD
aracı SpecFlow’dur [
          <xref ref-type="bibr" rid="ref27">27</xref>
          ]. SpecFlow Cucumber alt yapısını kullanmaktadır ve yine
Gherkin dili ile öznitelikler belirtilmektedir. Adımlar ve adım tanımlamaları
SpecFlow ile otomatik oluşturularak metotlar geliştirilir.
        </p>
        <p>
          C#ASP.NET MVC ile geliştirilen projelerde test tabanlı geliştirme aracı olarak
NUnit [
          <xref ref-type="bibr" rid="ref28">28</xref>
          ] kullanılmıştır. NUnit .NET ortamında test alt yapısı sağlamaktadır. Tıpkı
PHPUnit gibi “Assert” deyimi NUnit tarafından da kullanılır. .NET ortamında
birim testini tanımlayan anahtar kelimeler bulunur. Örneğin, sınıfları test etmek için
test edilen sınıf tanımlamasının başına “TestClass”, metotları test etmek için ise
“TestMethod” anahtar kelimeleri yazılır.
        </p>
        <p>
          C#ASP.NET MVC ile geliştirilen projelerin yazılım kalite aracı statik kod analiz
aracı NDepend’dir [
          <xref ref-type="bibr" rid="ref29">29</xref>
          ]. NDepend yazılım kalite ölçütlerine göre kodları ayrıntılı bir
biçimde analiz edip durumunu gösteren ve isim uzaylarının (namespaces) bağımlılık
grafiğine aktarıldığı bir araçtır.
        </p>
        <p>
          Bu projelerde kullanılan bir diğer yazılım kalite aracı ReSharper’dır [
          <xref ref-type="bibr" rid="ref30">30</xref>
          ].
ReSharper kod kalite analizi yapma, hata ayıklama, kod kokularını (code smells)
önleme ve kod standartlarına göre kod yazmayı denetleme gibi fonksiyonları bulunur.
BDD, TDD ve yazılım kalite ölçme araçlarıyla geliştirilen .NET projeleri Microsoft
Azure bulut sağlayıcısına aktarılır ve RESTful bulut servisleri olarak çalışır. C#
ASP.NET çevik yazılım geliştirme araçları Tablo 4’te verilmiştir.
        </p>
        <p>Tablo 4. C# ASP.NET çevik yazılım geliştirme araçları.</p>
      </sec>
      <sec id="sec-4-3">
        <title>4.3. Java EE Tabanlı Çevik Yazılım Geliştirme</title>
        <p>
          Java EE tabanlı çevik yazılım geliştirme, sadece bir proje gurubu tarafından tercih
edilmiştir. Spring yazılım çatısı ile geliştirilen çevik uygulama BDD, TDD ve yazılım
kalite araçlarıyla desteklenmiştir. Çok gelişmiş bir mimariye sahip olan Spring çatısı,
üçüncü parti araçlarla entegre bir biçimde çalışmakradır. BDD ile Spring çatısını
birleştiren araç JBehave’dir [
          <xref ref-type="bibr" rid="ref31">31</xref>
          ]. JBehave açık kaynak tabanlı bir BDD aracıdır.
JBehave ile beş adımda Spring çatısı altında BDD uygulanmaktadır:
 Kullanıcı hikayesi yazma. (Gherkin dili ile)
 Kullanıcı hikayelerini Java metotlarıyla eşleştirmek.
 Kullanıcı hikayelerini yapılandırmak.
 Kullanıcı hikayelerini çalıştırmak.
 Sonuçları raporlamak.
        </p>
        <p>
          Java projesinin TDD aracı JUnit’tir [
          <xref ref-type="bibr" rid="ref32">32</xref>
          ]. JUnit diğer çevik yazılım modellerinde
yer alan TDD araçlarının en gelişmiş olanıdır. Diğer TDD araçları JUnit modeli temel
alınarak geliştirilmiştir. JUnit üçüncü parti araçlarla iç içedir, bu yüzden gelişmiş bir
kütüphane desteği ve geri bildirim seçenekleri mevcuttur. Bu projede kullanılan
yazılım kalite ölçme aracı SonarQube’dur [
          <xref ref-type="bibr" rid="ref33">33</xref>
          ]. SonarQube bir açık kaynak platform
olup sürekli olarak kod kalitesini ölçmektedir. SonarQube’ün kendi sunucusu olup
veri tabanındaki Java kodlarını inceleyerek yazılım ekibine geri bildirimde bulunur.
Ayrıntılı bir rapor sunan SonarQube kullanımı kolay bir altyapı sağlamaktadır. Tablo
5’de Java EE çevik yazılım geliştirme araçları verilmiştir.
        </p>
        <p>Tablo 5. Java EE çevik yazılım geliştirme araçları.</p>
        <p>Java EE (Spring Framework)
JBehave (BDD) ve JUnit (TDD)
Pivotal Tracker
SonarQube
GitHub
Heroku</p>
        <p>Scrum</p>
        <p>Bu çalışmada bir Yazılım Mühendisliği dersinde 3 yıl öğrenci projelerinde, çevik
yazılım geliştirme modeli temel alınarak, BDD/TDD teknikleri kullanılarak ve çeşitli
programlama dilleri ve altyapıları ile geliştirilen SaaS uygulamalarından kazanılan
tecrübe sunulmuştur. Elde edilen en önemli sonuçlar özetle şu şekilde sıralanabilir:</p>
        <p>Fonksionel testlerde kullanılan Cucumber, Ruby programlama dili ile geliştirildiği
için Ruby/Rails ortamı BDD’yi güçlü olarak sunan ilk ortam olmuştur. Cucumber
temel alınarak diğer programlama dilleri ve ortamları için BDD alt yapıları
geliştirilmiştir. Son yılda Ruby kullanmayan 3 takımın projelerinde BDD’nin bu
programlama dilleri ve ortamları tarafından da acil yazılım geliştiren takımlara
sağlandığı görülmüştür.</p>
        <p>İlk iki yıl sadece Ruby/Rails dili ve ortamı ile projelerin gerçekleştirilmesi
istenmiş ve bu ortamdaki test ve kalite araçları ile bir SaaS uygulamasının çok hızlı
geliştirilip Heroku ortamına taşındığı görülmüştür. Heroku ilk yıllar sadece
Ruby/Rails için ücretsiz yazılım platformu sunuyordu. Son yıldaki projelerde PHP ve
Java projeleri için yine ücretsiz destek verdi. Heroku bulut servis sağlayısının
özellikle başlangıç düzeyinde ve öğrenci projeleri için iyi bir PaaS servis sağlayıcı
olduğu görüldü.</p>
        <p>Öğrencilerden istenen bir gereksinim de sunucu tarafında MVC şablonuna göre
yazılımlarını yapılandırmalarıydı. MVC Rails tarafından çok güçlü sağlanmaktaydı.
MVC desteğinin C#, Java ve PHP programlama dilleri için de değişik yazılım alt
yapılarıyla sağlandığı görüldü.</p>
        <p>Diğer bir teknolojik tasarım isteği, sunucuda ilk kısımda (Controller katmanı)
HTTP isteklerini ele alan RESTful servislerin yazılmasıydı. Sınıfta Ruby örnekleri
öğrencilere sunulda, onlar kendi RESTful servislerini seçmiş olduğu dillerde ve
yazılım alt yapılarında geliştirdi.</p>
        <p>İlk iki yılda sadece acil yazılım geliştirme temel alınmıştı ve öğrencilere klasik
Yazılım Mühendisliği derslerinde sunulan ve günümüzde bir çok projede
mühendislerden istenen iş analistliği, gerekler mühendisliği, dokümantasyon ve
planlama gibi önemli konular verilmemişti. Bu konuların öğrencilere
öğretilmemesinin eksikliğini daha öğrencilerimiz mezun olup iş hayatına atılmadan
son sınıf bitirme projelerinde iki yıl hemen gördük. Yazdıkları tezler çok zayıf oldu.
Yazılım Mühendisliğinin planlama ve dokümantasyon yönünü öğrenemediler.
Yazılım Mühendisliğinin klasik konularının da derse dahil edilip en başta projelerin
klasik yöntemlerle başlayıp BDD ve TDD ile acil yazılım geliştirmeyle devam
etmesiyle ortaya melez bir model çıktı. Kanaatimizce bu tür hem klasik Yazılım
Mühendisliği konularının öğretilip bunların projelerde kullandırılması ve acil
süreçlerle buluta taşınacak SaaS uygulamalarının geliştirilmesi, öğrencilere günümüz
teknolojilerini kısa sürede öğrenmelerini sağlayacaktır.</p>
        <p>İlk iki yıl derste öğrencilere 2-3 hafta Ruby/Rails öğretilmişti. Son yılki Ruby/Rails
örnekleri yine derste verildi, ama uzun zaman ayrılarak ve laboratuvarda asistan
desteğiyle Ruby/Rails öğretilmedi. Son yıl bir proje takımı kendileri Ruby/Rails’i
öğrendi. Java, C# ve PHP’yi seçen takımlar bu programlama dillerini biliyorlardı. Bir
Yazılım Mühendisliği dersindeki projeler için genellikle yeni bir programla dili
öğretilmez; öğrenciler hakim oldukları ve rahat kullandıkları bir programla dilini ve
ortamını kullanır. Bizim üç yıllık uygulamalarımızda, Ruby/Rails’in 3-4 haftada
öğretilmesinin mümkün olduğu ve hatta son yılda öğrenciler tarafından kendilerince
öğrenilebileceği ve SaaS uygulamaları geliştirmede kullanılabileceği görüldü.</p>
        <p>Son yıl öğrenciler projelerin ortak teknik gereksinimleri olan MVC’ye göre
yazılımlarını yapılandırma, RESTful servis geliştirme, BDD/TDD teknolojilerini
kullanma, yazılım kalitesini ölçmeyi seçtikleri dillerde ve platformlarda kendileri
öğrendi. Projeyi gerçekleştirme teknolojisinden bağımsız olarak, BDD/TDD acil
yazılım geliştirme yöntemlerinin verilebileceği görüldü.</p>
        <p>Öğrenciler dersimizde geliştirmiş oldukları projeler ile Yazılım Mühendisliğinin
bir çok konusunu günümüz teknolojileri için uyguladıklarından çok önemli bilgi ve
tecrübeye daha okul projeleriyle kazanmış oldular. Öğrencilerin bu şekilde verilen
Yazılım Mühendisliği dersi uygulamalarıyle kazandıkları birikimlerinin mezun
olduktan sonra çalışma hayatında çok faydalı olduğuna dair öğrencilerimizden birçok
geri dönüşüm aldık. Ancak öğrencilerin bir kısmı diğer derslerinin yanında bu
dersteki verilen bilgilerin çok ve uygulamaların ağır olduğunu belirtip şikayet
ediyorlardı. Bu tek ders içeriğinin iki derse yayılarak bir yıl boyunca dersteki
konuların verilmesi, öğrencileri rahatlatacağı için daha iyi sonuçlar alınabilir.
Kaynaklar</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Başar</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Özkaya</surname>
            <given-names>A.</given-names>
          </string-name>
          , Kesgin F.:
          <article-title>Yazılım Geliştirme Süreçlerinde Şelale Yönteminden Çevik Yaklaşıma Geçiş: Bir Teknoloji Şirketinde Uygulama, 9</article-title>
          .
          <string-name>
            <given-names>Ulusal</given-names>
            <surname>Yazılım Mühendisliği Sempozyumu</surname>
          </string-name>
          (
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Beck</surname>
          </string-name>
          ,
          <article-title>Kent ve diğerleri: Principles Behind the Agile Manifesto</article-title>
          , Adres: http://www.agilemanifesto.org/principal.html, Erişim:
          <volume>21</volume>
          .
          <fpage>05</fpage>
          .2016
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Nalbant</surname>
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bıçakçı</surname>
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Savunma Projelerinde Çevik Metodolojiler, 9</article-title>
          .
          <string-name>
            <given-names>Ulusal</given-names>
            <surname>Yazılım Mühendisliği Sempozyumu</surname>
          </string-name>
          (
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4. North D.:
          <string-name>
            <surname>Introducing</surname>
            <given-names>BDD</given-names>
          </string-name>
          , Better Software Magazine (
          <year>2006</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>Software</given-names>
            <surname>Requirements</surname>
          </string-name>
          ,
          <source>3rd Edition</source>
          ,
          <string-name>
            <given-names>Wiegers K.</given-names>
            ,
            <surname>Beatty</surname>
          </string-name>
          <string-name>
            <surname>J.</surname>
          </string-name>
          , Microsoft Press (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>Software</given-names>
            <surname>Engineering</surname>
          </string-name>
          <article-title>Frameworks for the Cloud Computing Paradigm</article-title>
          . Editors: Mahmood
          <string-name>
            <given-names>Z.</given-names>
            ,
            <surname>Saeed</surname>
          </string-name>
          <string-name>
            <surname>S</surname>
          </string-name>
          . (Eds.), Springer (
          <year>2013</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7. What is Scrum?
          <article-title>An Agile Framework for Completing Complex Projects</article-title>
          . Scrum Alliance: http://www.scrumalliance.org/why-scrum,
          <source>Erişim: 22.05</source>
          .
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Wagh</surname>
            <given-names>R.</given-names>
          </string-name>
          :
          <article-title>Using Scrum for Software Engineering Class Projects</article-title>
          . Agile India pp.
          <fpage>68</fpage>
          -
          <lpage>71</lpage>
          (
          <year>2012</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Zorzo S. D.</surname>
          </string-name>
          ,
          <string-name>
            <surname>Ponte</surname>
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lucredio</surname>
            <given-names>D.</given-names>
          </string-name>
          ,
          <article-title>Using Scrum to Teach Software Engineering: A Case Study</article-title>
          ,
          <source>IEEE Frontiers in Educatiın Conference</source>
          , pp
          <fpage>455</fpage>
          -
          <lpage>461</lpage>
          (
          <year>2013</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Krishna</surname>
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jayakrishnan</surname>
            <given-names>R.</given-names>
          </string-name>
          :
          <source>Impact of Cloud Services on Software Development Life Cycle. Software Engineering Frameworks fort he Cloud Computing Paradigm</source>
          . Editors: Mahmood
          <string-name>
            <given-names>Z.</given-names>
            ,
            <surname>Saeed</surname>
          </string-name>
          <string-name>
            <surname>S</surname>
          </string-name>
          . (Eds.) Springer, pp.
          <fpage>79</fpage>
          -
          <lpage>99</lpage>
          (
          <year>2013</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Tsai</surname>
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hang</surname>
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shao</surname>
            <given-names>Q.</given-names>
          </string-name>
          :
          <string-name>
            <surname>EasySaaS: A SaaS Development</surname>
            <given-names>Framework</given-names>
          </string-name>
          ,
          <source>IEEE International Conference on Service Oriented Computing and Applications</source>
          , pp
          <fpage>1</fpage>
          -
          <lpage>4</lpage>
          (
          <year>2011</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Engineering</surname>
          </string-name>
          <article-title>Software as a Service: An Agile Approach Using Cloud Computing</article-title>
          .
          <source>First Edition</source>
          , Fox A.,
          <string-name>
            <surname>Patterson</surname>
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Strawberry Canyon LLC</surname>
          </string-name>
          (
          <year>2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Latorre</surname>
            <given-names>R.</given-names>
          </string-name>
          :
          <source>Effects of Developer Experience on Learning and Applying Unit Test-Driven Development, IEEE Transactions on Software Engineering</source>
          , Vol.
          <volume>40</volume>
          , No:
          <issue>4</issue>
          ,
          <string-name>
            <surname>April</surname>
          </string-name>
          (
          <year>2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Wilkerson</surname>
            <given-names>J. W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Nunamaker</surname>
            <given-names>Jr. J. F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mercer</surname>
            <given-names>R.</given-names>
          </string-name>
          :
          <article-title>Comparing the Defect Reduction Benefits of Code Inspection</article-title>
          and
          <string-name>
            <surname>Test-Driven</surname>
            <given-names>Development</given-names>
          </string-name>
          ,
          <source>IEEE Transactions on Software Engineering</source>
          , Vol.
          <volume>38</volume>
          , No:
          <issue>3</issue>
          , May/June (
          <year>2012</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Nagappan</surname>
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Maximilien</surname>
            <given-names>M. E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bhat</surname>
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Williams</surname>
            <given-names>L.</given-names>
          </string-name>
          :
          <article-title>Realizing Quality Improvement through Test-Driven Development Results and Experiences of Four Industrial Teams</article-title>
          ,
          <source>Emprical Software Engineering</source>
          , Vol.
          <volume>13</volume>
          , No.
          <issue>3</issue>
          , pp.
          <fpage>289</fpage>
          -
          <lpage>302</lpage>
          (
          <year>2008</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Üçel</surname>
            <given-names>Ö</given-names>
          </string-name>
          .:
          <article-title>Scrum ve Kullanıcı Hikayeleri</article-title>
          , https://prezi.com/bqixbxztkb8i/scrum-ve-kullanchikayeleri,
          <source>Erişim: 23.05</source>
          .
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>17. Pivotal Tracker: http://www.pivotaltracker.com/</mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>18. Cucumber: https://cucumber.io/</mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>19. http://www.gumuskaya.com/Teaching/Courses/COM401-2015/com401.htm</mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>20. Behat: http://docs.behat.org/en/v3.0/</mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>21. Gherkin: https://cucumber.io/docs/reference</mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>22. Codeception: http://codeception.com/</mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>23. PHPUnit: https://phpunit.de/</mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>24. PHP_ CodeSniffer: http://pear.php.net/package/PHP_CodeSniffer/redirected</mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>25. PHP_ Depend: https://pdepend.org/</mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>26. Heroku: https://www.heroku.com/</mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>27. SpecFlow: http://www.specflow.org/</mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>28. NUnit: http://www.nunit.org/</mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>29. NDepend: http://www.ndepend.com/</mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>30. ReSharper: https://www.jetbrains.com/resharper/</mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>31. JBehave: http://jbehave.org/</mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>32. JUnit: http://junit.org/junit4/</mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>33. SonarQube: http://www.sonarqube.org</mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>