Test Yönelimli Yazılım Geliştirme Metodlarının J2EE Platformu ve Bileşen Modellerine Uygulanması Üzerine Bir Çalışma

Benzer belgeler
Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

ÖZGÜR YAZILIMLAR İLE J2EE

Üniversite Ortamında Yazılım Geliştirme Deneyimleri

Client Server Database

Basit Mimari, Katmanlı Mimari ve doğrudan çalıştırma olarak üçe ayrılır.

Üst Düzey Programlama

Spring Ekosisteminde Kurumsal Yazılım Geliştirme. Kenan Sevindik Harezmi Bilişim Çözümleri A.Ş.

.com. Özcan Acar 2009 Kurumsal Java.com

Java EE 5 Teknolojileri Jboss Seam

Android e Giriş. Öğr.Gör. Utku SOBUTAY

JavaServerFaces. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4

C# nedir,.net Framework nedir?

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

Java ve Linux. Bora Güngören Portakal Teknoloji Akademik Bilişim

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Business Delegate Tasarım Şablonu KurumsalJava.com

Üst Düzey Programlama

Basit bir web uygulaması

Öğr. Gör. Serkan AKSU 1

MyFaces Özgür JSF Uyarlaması. Bora Güngören Portakal Teknoloji

.com. Kurumsal Java. Özcan Acar com

Java Programlamaya Giriş

JAVA API v2.0 Belge sürümü: 2.0.2

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

Üst Düzey Programlama

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

Swing ve JDBC ile Database Erişimi

Google Web Toolkit ile Öğretim Elemanı Otomasyon Sistemi

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

Java Programlama Giriş

Asp.Net Veritabanı İşlemleri

HTML isteklerini anlayarak HTML sonucu üreten ve yaygın olarak kullanılan temel Servlet sınıfı HttpServlet tir.

PHP 1. Hafta 1. Sunum

Üst Düzey Programlama

BİL-141 Bilgisayar Programlama I (Java)

Veritabanı Dersi. Teoriden Pratiğe. Çağıltay N.E., Tokdemir G. Veritabanı Sistemleri Dersi -Bölüm XXV: Web'den Erişim Çağıltay, N., Tokdemir, G.

1.PROGRAMLAMAYA GİRİŞ

Tasarım Desenleri ve Java Web Servisleri ile Çok Katmanlı Bir Sistem Tasarımı

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Mobil Cihazlardan Web Servis Sunumu

Kalıtım (Inheritance)

HSancak Nesne Tabanlı Programlama I Ders Notları

TÜRKİYE ELEKTRONİK FON ALIM SATIM PLATFORMU WEB SERVİS İŞLEMLERİ


Java Temel Özellikleri

Turquaz. Açık kodlu muhasebe yazılımı Turquaz Proje Grubu

Coslat Monitor (Raporcu)

Özgür Yazılımlarla Web Programlama. Özlem Özgöbek

UHeM ve Bulut Bilişim

BioAffix Ones Technology nin tescilli markasıdır.

PROGRAMLAMA DERSİ 1. İNTERNET

BİH 605 Bilgi Teknolojisi Bahar Dönemi 2015

BioAffix Ones Technology nin tescilli markasıdır.

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

BİL 542 Paralel Hesaplama. Dersi Projesi. MPJ Express Java Paralel Programlama

BioAffix Ones Technology nin tescilli markasıdır.

1. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

Akıllı Ortamlarda Sensör Kontrolüne Etmen Tabanlı Bir Yaklaşım: Bir Jadex Uygulaması

JAVA RMI ve Hibernate teknolojileri kullanılarak çok amaçlı bir yazılım altyapısı hazırlanması

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

TeamBase5 BELEDİYE İLETİŞİM MERKEZİ SIEMENS

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Cahit GÜNGÖR Hacettepe Üniversitesi Bilişim Enstitüsü. Sorumluluk Zinciri. Kod Üretme (Code Generation)

Start : Bu method init methodundan hemen sonra çalışır ve applet dosyası yürütülmeye başladığında çalışmaya başlar.

AIF: Kurumsal Uygulamalar İçin Bir Yazılım Çerçevesi

HSancak Nesne Tabanlı Programlama I Ders Notları

Intercepting Filter Tasarım Şablonu KurumsalJava.com

BioAffix Ones Technology nin tescilli markasıdır.

MaestroPanel Kurulum

Kitapta UML diyagramları kullanılarak, tasarım şablonları görsel olarak açıklanmıştır. İçerik aşağıdaki bölümlerden oluşmaktadır:

Kepware Veritabanı Ürünleri. Teknolojiye Genel Bir Bakış

PHP 1. Hafta 2.Sunum

Hata Ayıklamanın Ötesi... (Assertion) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 14 1

ECLIPSE PROGRAMININ ÇALIŞTIRILMASI

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Üst Düzey Programlama

1. VERİ TABANI KAVRAMLARI VE VERİ TABANI OLUŞTUMA

MVP, Observer ve Mediator Örüntüleri ile Yeniden Kullanılabilir Uygulama Bileşenleri Geliştirme

PHP I PHP I. E. Fatih Yetkin. 26 Eylül 2011

4. Bölüm Programlamaya Giriş

TCMB Deneyim Raporu. Kurumsal Java Uygulama Platformu. Sacit Uluırmak. Türkiye Cumhuriyet Merkez Bankası Sistem Araştırma ve Planlama Müdürlüğü

Üst Düzey Programlama

EDI MIGROS (Sipariş) LOGO ENTEGRASYONU

Ders 8 Konu Özeti ve Problemler

Chapter 6 Mimari Tasarım. Lecture 1. Chapter 6 Architectural design


Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

PHP ile İnternet Programlama

Veritabanı Uygulamaları Tasarımı

OMNET Ağ Benzetim Yazılımı (Network Simulation Framework) BİL 372 Bilgisayar Ağları. GYTE - Bilgisayar Mühendisliği Bölümü

Script. Statik Sayfa. Dinamik Sayfa. Dinamik Web Sitelerinin Avantajları. İçerik Yönetim Sistemi. PHP Nedir? Avantajları.

Erişim konusunda iki taraf vardır:

BM-209 Nesne Yönelimli Programlama. Yrd. Doç. Dr. İbrahim Alper Doğru Gazi Üniversitesi Teknoloji Fakültesi Bilgisayar Mühendisliği Bölümü

Struts2 ile Merhaba Dünya uygulamas

Ağ Üzerinde MATLAB kurulum rehberi (Sunucu makine)

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

WINDOWS SERVER 2008 R2-SERVER 2012 DE IP SANALLAŞTIRMA

KANTAR UYGULAMASI Kurulum Kılavuzu

Transkript:

Test Yönelimli Yazılım Geliştirme Metodlarının J2EE Platformu ve Bileşen Modellerine Uygulanması Üzerine Bir Çalışma Fatih Algan 1, Tuğkan Tuğlular 2, Oğuz Dikenelli 3 1,2 İzmir Yüksek Teknoloji Enstitüsü, Bilgisayar Mühendisliği Bölümü, 35430, Urla, İzmir 1 fatihalgan@iyte.edu.tr, 2 tugkantuglular@iyte.edu.tr 3 Ege Üniversitesi, Bilgisayar Mühendisliği Bölümü, 35100, Bornova, İzmir 3 oguzd@staff.ege.edu.tr Özet. Extreme Programming temelde yoğun iletişim ve basitlik ilkelerine dayanan, dinamik ve hızlı işleyen bir yazılım geliştirme metodolojisi olarak yorumlanmaktadır. Otomatik test, sürekli entegrasyon, program kodlarının ve tasarımın devamlı olarak yeniden ele alınıp iyileştirilmesi ise bu metodolojinin temel pratiklerindendir. Otomatize edilmiş testler ise bu süreçlerin önemli bir parçasıdır. Bu bildiride, bileşen modellerinin (EJB) kullanıldığı bir J2EE platformu yazılımında bileşen testinin ve fonksiyonel testlerin gerçekleştirilme yöntemleri ele alınmaktadır. Bildiride anılan çalışma, uygulama sunucusu üzerinde çalışan, oldukça karmaşık orta katman bileşenleri ile servisleri içeren ve uç tarafta da web teknolojilerini kullanan çok katmanlı bir yazılım mimarisi üzerinde geliştirilmiştir. 1 Giriş Extreme Programming, testleri yazılım geliştirme etkinliklerinin merkezi olarak kabul eder. Yazılımı sürekli olarak test ederek onun hatasız çalıştığını ve gereksinimleri karşıladığını ispatlar. Otomatize edilmiş testler, olası test senaryolarının bir program haline getirilmesinden oluşur. Bu testler biriktirilir ve istenildiği anda çalıştırılarak çok sayıda olası senaryonun bir defada işletilerek sonuçların çok kısa bir sürede alınmasını sağlar. Otomatik test, testlerin sürekli olarak gerçekleştirilmesinin tek yoludur. Extreme Programming, yazılımın sürekli olarak yeniden ele alınıp iyileştirilmesi ilkesine dayanır. Dolayısıyla yeni geliştirilen ya da değiştirilen modüllerin doğru olarak çalıştığından emin olmak ve bunların yazılımın diğer modülleriyle entegrasyonu sonrasında ortaya çıkacak hataları yakalayabilmek için otomatize edilmiş testler zorunlu hale gelmektedir. Otomatik testler; ünite testleri, entegrasyon testleri, fonksiyonel testler ve performans testleri olmak üzere dört grupta toplanabilir. Bu bildiriye konu olan çalışmada sadece entegrasyon testleri ve fonksiyonel testler kullanılmıştır. Entegrasyon testleri bir tek sınıfı veya küçük bir modülü değil de nesneler arasındaki etkileşimi sistem düzeyinde test edebilmeyi sağlar. Fonksiyonel testler kara kutu testleri olarak da adlandırılır. Bileşen testlerine oranla daha yüksek düzeyli testlerdir. Genellikle bir sistem senaryosunun tümünü veya bir parçasını test etmek için kullanılırlar. Bu bildiride J2EE platformunda entegrasyon testleri ile fonksiyonel testlerin gerçekleştirilmesi üzerine örnek bir çalışma tanıtılmakta ve bu çalışma sırasında yaşanılan deneyimler açıklanmaktadır. 2 Test Ortamı ve Kullanılan Araçlar Entegrasyon testleri ile fonksiyonel testlerin herbiri ile ilgili uygulamaların geliştirilebilmesi için özel araçlar bulunmaktadır. Ayrıca veritabanının testler için tasarlanmış örnek veri ile doldurulması, uygulamanın derlenmesi ve uygulama sunucusu üzerine kurulması ile testlerin başlatılması sürecinin tamamını otomatize edebilen çok sayıda araç bulunmaktadır. Bu bölümde yapılan çalışmada kullanılan araçlar; Ant, Cactus, HttpUnit tanıtılacaktır. Bu araçlar açık kaynak kodlu olup GPL lisansı [1] ile dağıtılmaktadır. 2.1 Ant Ant [2] uygulamanın otomatik olarak derlenmesi ve uygulama sunucusu üzerine kurulumunun yapılabilmesini sağlayan bir araçtır. Ayrıca veritabanının örnek verilerle ilklenmesi işlemini de otomatize edebilir. Ant scriptleri XML formatındadır ve platform bağımsız olarak çalıştırılabilir. Ant scriptleri sayesinde uygulamaların değişik platformlarda değişik uygulama sunucuları üzerine otomatik kurulumu sağlanabilir. <target></target> etiketleri, işletilebilir script modüllerinin sınırlarını göstermektedir. En son modül ise, varsayılan olarak işletilen ana modüldür ve createtables ile populatetables adlı modülleri sırayla çağırmaktadır. Bu işlem sonunda veritabanına test verileri aktarılmış olur. Testin bitişinden sonra ise, droptables adlı modülü yine komut satırından işleterek veritabanı testten önceki haline getirilebilir. 2.2 Cactus

Cactus [3] entegrasyon testlerinin gerçekleştirilebilmesi için geliştirilmiş bir araçtır. Cactus testleri tasarım gereği, istemci ve sunucu olmak üzere iki parçadır. Bir yönlendirici aracılığı ile Cactus, istemciden gelen isteği sunucu içindeki test projesine aktarıp taşıyıcı ile konuşmaya başlayacaktır. İki ayrı projeye ihtiyaç varmış gibi görünse de istemci ve sunucu projeleri birbirinin tamamen aynısıdır ve aynı testleri içerirler. Cactus testlerinin sunucu bölümü, Enterprise Application (EAR) üzerine ayrı bir Web Application (WAR) modülü olarak eklenebilir. Testlerin istemci bölümü ise web sunucusunda bulunan yönlendiriciye (redirector) istekler gönderen bağımsız bir java uygulaması olacaktır. Konfigürasyon için izlenmesi gereken adımlar Wosnick tarafından açıklanmıştır [4]. 2.3 HttpUnit HttpUnit [5] fonksiyonel testlerin gerçekleştirilebilmesi için kullanılan bir araçtır. HttpUnit te Cactus un aksine test sınıfları taşıyıcıların içinden çalıştırılmak zorunda değildir. Web sunucusu dışarıdan sorgulanarak cevaplar alınır. Fakat isteklerin web sunucusuna gönderilmesi, kullanıcı oturumunun takibi, sunucudan dönen cevabın incelenebilmesi gibi gereksinimler için HttpUnit de bazı özel taşıyıcı nesnelerini taklit eden sınıflar sağlar. HttpUnit web sunucusuna tamamen dışarıdan ve HTTP protokolü üzerinden istek gönderip cevapları ise HTTP protokolü üzerinden düz metin olarak aldığı için konfigürasyonu Cactus e göre oldukça kolaydır. Yapılması gereken, bir java programı yazarak web sunucusunun URL adresine HTTP üzerinden istekler göndermektir. Konfigürasyon için yapılması gereken ise, yaratılan bir java projesinin classpath ine HttpUnit ile gelen şu dosyaları eklemektir: js.jar, junit.jar, servlet.jar, Tidy.jar, httpunit.jar, xmlparserapis.jar. 3 Projenin Tanıtımı Geliştirilmekte olan Öğrenci İşleri Bilgi Sistemi Projesi nin amacı; öğrencilerin, öğretim üyelerinin ve ilgili idari birimlerin öğrenci ile ilgili bütün işlemleri İnternet üzerinden yürütebileceği bir sistem geliştirmektir. Uygulamanın üzerinde çalışacağı platform olarak IBM in J2EE çözümü olan WebSphere ailesi seçilmiştir. WebSphere uygulama sunucusu olarak güçlülüğünü ve tutarlılığını kanıtlamış bir ürün olmasının yanında tüm tasarım, geliştirme ve test sürecini tek bir IDE içerisinden gerçekleştirebilme olanağı sunmaktadır. Halen devam etmekte olan projenin analizi, tasarımı ve geliştirilmesi süresince karşılaşılan çeşitli sorunlar aşamalı olarak Extreme Programming yöntemlerine yakınlaşılmasına yol açmıştır. Öğrenci İşleri Bilgi Sistemi başlangıçta sadece Web tabanlı istemciler için hizmet verecek şekilde planlanmıştır. Projenin web katmanında J2EE uygulamalarında yaygın olarak kullanılan bir Model-View-Controller (MVC) çerçevesi olan Struts [6] kullanılmıştır. Struts, tasarım olarak uygulama mimarisine getirdiği disiplinin yanında sağladığı çok sayıda JSP Tag kütüphaneleriyle JSP sayfalarının yazılmasını ve sunumun oluşturulmasını kolaylaştırmaktadır. Yazılım orta katmanında EJB teknolojisi kullanılmaktadır. J2EE ve EJB teknolojileri bazı tasarım kalıpları ve standartlaşmış yöntemler kullanılmadığı sürece performans ve yönetilebilirlik açısından ciddi sorunlar yaratabilir. Struts, programcıyı web katmanında bu kalıpların çoğunu kullanmaya yönlendirse de, EJB teknolojisi için böyle bir durum söz konusu değildir. Uygulamanın orta katmanında Business Delegate, Session Facade, Data Transfer Object, Service Locator, Data Transfer Object Factory, Data Access Object gibi standartlaşmış EJB tasarım kalıpları kullanılmıştır. Bunun dışında yoklama (audit trail) işlemleri için geliştirilmiş başka bir çerçeve olan Log4Java [7] da yazılım orta katmanına entegre edilmiştir. Bunların yanında WebSphere platformunun EJB teknolojisine getirdiği bir ek olan EJB inheritance modeli, polimorfizmi bileşen modelleri üzerinde uygulayabilme ve daha esnek bir nesne modeli oluşturabilmesine olanak sağlamıştır. 4 Test Yönelimli Yazılım Geliştirme Kapsamında Ele Alınan Senaryo ve Gerçekleştirimi Test yönelimli yazılım geliştirmeye yönelik araçların çalışmasını izleyebilmek için uygulamanın basit ve küçük bir modülü seçildi ve bu modül için test senaryoları oluşturuldu. Bu modül üç adet EJB den oluşmaktaydı; fakülteler, bir fakülteye bağlı bölümler ve bir bölüme bağlı programlar. Bileşen testi için ilk senaryo bir fakültenin yaratılması, daha sonra yaratılan fakülteye ait bilgilerin okunması ve yaratılan fakültenin silinmesi idi. Testlerin tamamlanmasından sonra ise veritabanında kalan verileri bir Ant scripti yardımıyla temizleme yolu seçildi.

Cactus testleri basit java sınıflarından oluşur. Test sınıfımızın uygulama sunucusunun içerisinde bir Servlet gibi davranmasını sağlamak için Cactus API sinin sağladığı ServletTestCase sınıfını extend etmesi gerekir. Testimizde kullandığımız diğer bileşen ve sınıflar ise şunlardır: BirimlerController: Test edilecek EJB Session Facade[8] inin remote interface i.. BirimlerControllerHome: Test edilecek EJB Session Facade inin home interface i.. TestUtil: EJB Session Facade inin Home interface ini JNDI namespace den alıp döndüren bir singleton sınıf. (Service Locator [8]). FakulteDTO: Fakülteyi temsil eden bir DTO nesnesi (ValueObject ya da Data Transfer Object[8]). Cactus, bir ünite testi aracı olan JUnit API lerini kullanır. Bir JUnit testlerinin açıklanmasından önce aşağıdaki kavramların anlaşılması gerekmektedir [9]: TestCase: Birbirleriyle ilintili bir küme testin işletilmesi için bir fixture tanımlar. Test Fixture: Çeşitli kaynaklar (primitif değişkenler, veritabanı bağlantılatrı, IO Stream leri, Singleton nesneler, testlerin çalışabilmesi için gerekli çeşitli başka nesneler, vb.) sağlar. Test Suite: Birbirleriyle ilgili bir küme TestCase i bir TestSuite ini oluşturur. Bir TestCase ini yazmak için şunlar yapılmalıdır: 1. junit.framework.testcase sınıfını extend edin. 2. Eğer bazı fixture nesneleri gerekiyorsa setup() metodunu override edin. 3. Test metodlarını yazın. Test metodları testxxx() biçiminde tanımlanmalı ve geriye bir değer döndürmemelidir. 4. Eğer fixture nin parçası olan çeşitli kaynaklar serbest bırakılmak isteniyorsa teardown() metodunu override edin. 5. Değişik TestCase leri gruplayıp bir arada çalıştırmak istiyorsanız testlerden oluşan bir TestSuite i tanımlayın. public class FakulteEJBTestCase extends ServletTestCase { //EJB remote interface'lerinin referanslar ı private BirimlerController birimlercontroller; //Constructor Junit için test case ismini tan ımla public FakulteEJBTestCase(String thename) { super(thename); } //JUnit TestRunner kullanarak testlere başla public static void main(string[] args) { junit.swingui.testrunner.main(new String[] { FakulteEJBTestCase.class.getName()}); } //testxxx şeklinde başlayan bir TestSuite döndür public static Test suite() { return new TestSuite(FakulteEJBTestCase.class); } //InitialContext & JNDInamespace haz ır, HomeInterface al public void setup() { this.birimlercontroller = TestUtil. getbirimlercontrollerhome().create(); } catch (Exception e) { e.printstacktrace(); }} //JUnit testleri aşağ ıdan yukar ıya doğru çal ı şt ır ır. //Bu yüzden test metodlar ı sondan başa doğru yaz ıld ı. public void removechanges() throws Exception { testremovefakulte(); } //Bölümleri test edebilmek için yeniden fakülteyi yarat public void testsetfornextcomponent() throws Exception { testcreatefakulte(); } //Yaratt ığ ın fakülteyi sil public void testremovefakulte() throws Exception { birimlercontroller.deletefakulte((short)1);} //Bütün fakültelerin listesini al public void testgetallfakulteler() throws Exception { Collection fakulteler =

} birimlercontroller.getallfakulteler(); assertfalse("fakulteler_size",fakulteler.size()==0);} //Yaratt ığ ın fakülteyi sorgula ve kontrol et. public void testgetfakulte1() throws Exception { FakulteDTO dto = birimlercontroller.getfakulte((short)1); assertnotnull(dto); assertequals("fakulte_kod: ", "01", dto.getfakultekod()); assertequals("fakulte_ad: ", "FEN FAKÜLTES İ", dto.getfakultead().trim()); assertequals("ing_fakulte_ad: ", "FACULTY OF SCIENCE", dto.getingfakultead()); } //Önce Bir Fakülte Yarat public void testcreatefakulte() throws Exception { FakulteDTO dto = new FakulteDTO("01", "FEN FAKÜLTES İ ", "FACULTY OF SCIENCE"); birimlercontroller.createfakulte(dto); } Fakülteler, bölümler ve programlarla ilgili bileşen testlerinin yazılmasından sonra aynı modül için fonksiyonel testler yazıldı. Fonksiyonel testlerde, kullanıcının menü seçimleri de dahil olmak üzere bilgi sistemi ile olan tüm etkileşimini test eden senaryolar düşünüldü. Aşağıda bir fakültenin seçilerek bilgilerinin gösterilmesi senaryosunu test eden bir test sınıfı örnek olarak verilmiştir. İçeriği basit tutmak amacıyla örnekte kullanıcının hatalı veri girişi yapmadığı varsayılmıştır. Fonksiyonel testlerin yazılmasında kullanılan HttpUnit temel olarak 3 adet sınıf sağlar. WebConversation sınıfı bir web browser ını taklit eder ve istemcinin oturumunu yönetir. WebRequest sınıfı browserdan yapılan bir Http request ini, WebResponse sınıfı ise bir Http response ını taklit eder. public class FakulteGosterTest extends TestCase { //Constructor for FakulteGosterTest public FakulteGosterTest(String arg0) { super(arg0); } //Bir Test Suit'i yarat. public static Test suite() { return new TestSuite(FakulteGosterTest.class); } //Test senaryosunu başlat public static void main(string[] args) { junit.textui.testrunner.run(suite()); } //Senaryo başlang ıc ı. Ana menüden bir seçim yap ıl ır. public void testfakultegoster() { System.out.println("Starting to test StartPage:"); WebResponse resp = wc.getresponse( "http://localhost:8080/ogrenciisleriweb"); WebLink link = resp.getlinkwith("birimler"); System.out.println("Forwarding to: " + link.geturlstring()); sidemenuselect(link); } catch(exception e) { System.out.println(e.getMessage()); } } // Detayl ı menüden Fakülte ile ilgili işlemler seçilir. // Cevap olarak tüm fakültelerin bir listesi döner. private void sidemenuselect(weblink link) { System.out.println("Starting to test SideMenu selection:"); WebResponse resp = wc.getresponse(link.getrequest()); link = resp.getlinkwith("fakülte secgoster(link); System.out.println("Forwardingto: " + link.geturlstring()); İ şlemleri");

} catch(exception e) { System.out.println(e.getMessage()); } } //Fakülte listesinden ilk fakültenin Göster linki //seçilir. private void secgoster(weblink link) { System.out.println("Starting Listele Action"); WebResponse resp = wc.getresponse(link.getrequest()); link = resp.getlinkwith("göster"); showresult(link); System.out.println("Forwarding to: + link.geturlstring()); } catch(throwable t) { System.out.println(t.getMessage()); } } //Seçilen fakülte bilgileri ile sonuç sayfa yazd ır ıl ır. private void showresult(weblink link) { System.out.println("Starting to render result page"); WebResponse resp = wc.getresponse(link.getrequest()); System.out.println(resp.getText()); } catch(throwable t) { System.out.println(t.getMessage()); } }} Bileşen testlerini çalıştırmak için öncelikle proje uygulama sunucusu üzerine kurulmalıdır. Daha sonra ise istemci Cactus modülünde (java projesi) ilgili test uygulamasını ya da bütün testleri birden çalıştıran uygulamayı başlatıp testlerin sonuçları alınabilir. Fonksiyonel testleri çalıştırmak için yazılan test programlarını (java programlarını) başlatmak yeterlidir[10]. 5 Sonuç Üzerinde çalışmakta olduğumuz proje bize otomatize edilmiş testlerin özellikle çok katmanlı mimarilerde ve web tabanlı sistemlerde daha da büyük önem kazandığını gösterdi. Bunun temel sebepleri, sunucu bileşenlerinin ve çok katmanlı yapının karmaşıklığının yanısıra bu bileşenlerin yalnızca uygulama sunucularının içerisinde barınıp yalnız başına çalıştırılamamaları ve http protokolünün yapısı gereği her testte senaryonun en başına dönülmesi gereği idi. Bu nedenle bileşen testleri ile fonksiyonel testlerin yazılması ve biriktirilmesinin uzun vadede uygulamanın bakımında büyük kolaylıklar sağlayacağına inandık. Projenin ilk modülünün devreye alınmasından önce uyguladığımız Yükleme Testleri ve Performans Testleri ise çok kritik olan bazı problemleri zamanında farkedip sorunları giderebilmemizi sağladı. Bu problemlerin birincisi, çok sayıda kullanıcının paylaşılan kaynaklara aynı anda erişimi sonucu ortaya çıkabilecek ve veritabanında da kalıcı bozulmalara yol açacak kadar ciddi neticeler doğurabilecek olan koşutzamanlılık problemiydi. İkincisi ise, sistemi değişik sayılarda kullanıcıyı simüle ederek test etmenin hem uygulama sunucusu hem de veritabanı konfigürasyonumuzu optimize etmemize imkan vermesiydi. Başlangıç aşamasında aynı test senaryosunu 30 eşzamanlı iş parçacığı (thread) tarafından çalıştırdık ve uygulama test ortamında eşik değerine ulaştı. Testleri değişik konfigürasyonlarda çalıştırarak uygulama eşik değerini 100 eşzamanlı iş parçacığına kadar çıkarmayı başarabildik. Otomatize edilmiş performans testlerinin geliştirilen yazılımın sınırlarının ve yeteneklerinin tanınması, ihtiyaç duyulacak olan donanım konfigürasyonunun önceden belirlenebilmesi ve yazılıma duyulan güvenin artması açısından kritik olduğunu doğrudan yaşayarak gördük. Testler yazılırken üzerinde durulması gereken önemli bir nokta da, testlerin önceden belirlenmiş bir sırada ve tümünün birarada çalıştırılabilecek şekilde tasarlanması gerekliliği oldu. Her testin bitişinden sonra testin veritabanında yaptığı değişiklikleri temizleyip geriye alarak, uygulamayı bir sonraki test için hazır hale getirmek gerekmektedir. Ayrıca iyi bir tasarım izleyerek, fonksiyonel testlerin bileşen testlerindeki test modüllerini yeniden kullanmasını sağlamak testlerin bakımını kolaylaştırmaktadır. Ayrıca test senaryolarını çalıştırmak için rastgele test verileri üreten ve bunların takibini yaparak sonuçları karşılaştıran örnekleyici sınıfların yazılması, performans testlerinin uygulanmasında izlediğimiz yoldur. Bu bildiriye konu olan çalışmada, test yönelimli bir yazılım geliştirme metodu izlenmesi iki konuda avantaj sağladı. Yazılan testlerin tümünü günün sonunda çalıştırmanın özellikle modüllerin entegrasyonu aşamasında bir modülde yapılan değişikliklerin sistemin diğer bileşenlerinde başka bir hataya yol açıp açmadığını anlamak ve hatayı düzeltmek açısından oldukça kullanışlı bir yöntem olduğu anlaşıldı. Ayrıca, yazılan fonksiyonel testler sistem senaryolarının beklenen biçimde çalışıp çalışmadığını net bir şekilde gözler önüne serdi. Sonuç olarak, programcıların yazdıkları her kod parçasının etkileri konusunda endişelenmelerine gerek olmayacağından, daha etkin bir şekilde kod geliştirmelerinin mümkün olacağı düşünülmektedir.

Kaynakça 1. General Public License(GPL), http://www.opensource.org/licenses/gpl-license.php 2. Apache Software Foundation, The Apache Ant Project, http://ant.apache.org/. 3. Apache Software Foundation, The Apache Jakarta Cactus Project, http://jakarta.apache.org/ cactus/index.html. 4. Wosnick, S., Developing and Unit Testing With Open Source Apache Cactus Framework Tools In WebSphere Studio Application Developer, IBM WebSphere Developer Technical Journal, http://www.software.ibm.com/wsdd/techjournal/0206_wosnick/wosnick.html 5. Gold, R., HttpUnit, http://httpunit.sourceforge.net/. 6. Apache Software Foundation, The Apache Jakarta Struts Project, http://jakarta.apache.org/ struts/index.html. 7. Apache Software Foundation, The Apache Jakarta Project, http://jakarta.apache.org/ log4j/docs/index.html. 8. Alur, D., Crupi, J. ve Malks, D., Core J2EE Patterns, Sun Microsystems Press, ISBN: 0-13-064884-1. 9. HighTower, R., ve Lesiecki, N., Java Tools For Extreme Programming, Wiley Computer Publishing, ISBN: 0 471 20708 X. 10. Bhogal, K. S., HttpUnit: A Civilized Way to Test Web Applications in WebSphere Studio, IBM WebSphere Developer Technical Article, http://www.software.ibm.com/wsdd/library/ techarticles/0303_bhogal/bhogal.html.