You are on page 1of 20

HAZIRLAYAN: Kübra Kütük

20122287

m
İÇİNDEKİLER

Cactus Mimarisi

o
Cactus Nasıl Çalışır?

i.c
Vekil Yöneticiler(Redirector Proxies)

*Servlet Vekil Yöneticisi(Redirector Proxy)

*JSP Vekil Yöneticisi(Redirector Proxy)


dil
*Filtreleyici Vekil Yönetici (Redirector Proxy)
CACTUS KURULUMU
*Sistem Gereksinimleri:
*Cactus Kütükleri(Files)
va
Cactus TestCase Yazmak
*Giriş
*Genel Kurallar
ja

**1. Adım: Eklenenler(imports)

**2.Adım: Bir Cactus TestCase sınıfına erişin ya da JUnit


TestCase’i tekrar kullanın
w.

***A Seçeneği: Cactus TestCase Sınıfına Erişim


ww
***B Seçeneği: Bir JUnit TestCase’i Tekrar Kullanma

** 3. Adım: (isteğe bağlı): setUp() ve tearDown() metodları

m
**4. Adım (isteğe bağlı): begin() ve end() metodları

**5. Adım: testXXX() metodları

o
**6. Adım (isteğe bağlı): beginXXX() methodları

i.c
**7. Adım (isteğe bağlı): endXXX() methodları

Özelleşmiş TestCase Detayları

dil
ServletTestCase ilkeleri
*Ne Zaman Kullanılır?
*Örtük Nesneleri Sağlamak
va
*ServletContextWrapper(Servlet İçerik Saklanması)

*Tavsiye ve Numaralar

*Parametre ilk değer ataması


ja

*Örnek

JspTestDurumu İlkeleri
w.

*Ne zaman kullanılır?

*Etiket Kütüphaneleri Test Etmeye Genel bir Bakış


ww

*Sağlanan Örtük Nesneler

Filtreleyici Test Durumu ilkeleri

*Ne Zaman Kullanılır

*Sağlanan Örtük Nesneler


*Eklenen Metodlar

*Tavsiye ve Numaralar

m
*Zincirde bir sonraki Filtreleyiciyi Taklit Etmek

*Örnek

o
i.c
Cactus Mimarisi
Cactus Nasıl Çalışır?
dil
1)begin(),beginXXX() 4)setUp(),testXXX(),TearDown()
va
7
2
YYYTestCase Tekrar Yönetme YYYTestCase
(redirector)
Vekaletçisi(Proxy)
ja

3 6

8.)endXXX() 5
end()
w.

Sunucu Taraflı
İstemci tarafı Sunucu Tarafı Sınıflar
ww

Cactus JUnit Test durumlarına(case) erişen çeşitli test sınıfları sağlar. Ayrıca Cactus
(Servlet Yöneticisi(Redirector), JSP Yöneticisi, ... vs) gibi çeşitli yöneticiler(Redirector)
tanımlamaya da olanak verir. Yukarıdaki şekil Cactus’un ilkelerini göstermek için verilmiştir.
Özel yönetici vekilleri(Proxy) için olan şekillerin detayları bir sonraki bölümde gösterilmiştir.
YYYTestCase yerine ServletTestCase ya daFilterTestCase ya da JspTestCase yazılabilir.
XXX test durumunun ismidir. Her bir YYYTestCase sınıfı çeşitli test durumlarını içerir.
Cactus’ün nasıl çalıştığını anlamak için şimdi farklı adımlara bakalım. Burada test

m
sınıfınızdaki her bir testXXX() metodunda ne olduğu anlatılmıştır.

1. JUnit Test çalıştırıcısı(Runner) bir YYYTestCase.runTest() metodu çağırır. Bu


metod begin(WebRequest) metodu var mı diye kontrol eder ve eğer varsa bu metodu
çalıştırır. Bu metodun her test durumu için çağrıldığına dikkat edin. beginXXX()

o
metoduna geçirilen WebRequest parametresi ikinci adımda vekil yöneticiye gönderilen
HTTP başlıkları ve HTTP parametrelerini kurmada kullanılır. Daha sonra runTest()
metodu bir beginXXX(WebRequest) varmı diye bakar ve varsa çalıştırır.
2. YYYTestCase.runTest() metodu daha sonra vekil yöneticiye bir HTTP bağlantısı

i.c
açar. beginXXX() metodunda kurulan bütün parametreler (HTTP başlıkları ve HTTP
parametreleri gibi) HTTP istemi içinde gönderilirler.
3. Vekil yönetici sizin test sınıfınız için sunucu tarafında bir vekil gibi davranır. Bu test
sınıfınızın iki kere oluşturulduğu anlamına gelmektedir. Birincisi JUnit Test Runner
tarafından istemci tarafında ikincisi ise vekil yönetici tarafından sunucu tarafında.
İstemci tarafındaki örnek begin(), beginXXX(), endXXX() ve end() metodlarını
dil
çalıştırmak için kullanılır. (1 ve 8. adımlara bakınız)Sunucu tarafındaki örnek ise
testXXX() metodlarını çalıştırmak için kullanılır (4. adıma bakınız). Vekil Yönetici
aşağıdaki işlemleri yapar:
o İfade etmeyi(reflection) kullanarak test sınıfınız için bir örnek oluşturu. Daha
sonra YYYTestCase sınıfının değişkenleri olan özel örtük nesneleri kurar. Bu
örtük nesneler bir sonraki bölümde anlatılacağı üzere vekil yönetciye bağlıdır.
va
o (HttpServletRequest, ServletConfig, ServletContext, ...) gibi bazı
sunucu nesneleri için Cactus saklayıcıların(wrapper) örneklerini oluşturur. Bu
uygun değerleri döndürmek için bazı metodların üstüne binilmesi(override)
için yapılır.Örneğin Cactus çatısı(framework) bir URI gibi davranabilir.
(örneğin vekil yönetici URI’si yerine URI çağrıldığu zaman Cactus URI gibi
davranır) . Böylece getServerName(), getServerPort(), getRequestURI(),
... metodları URI temel alınarak değer döndürür. (eğer kullanıcı tarafından URI
ja

tanımlanmışsa)
o Eğer kullanıcı hızlı bir turum başlatmak istemişse beginXXX() komutu
içindeki WebRequest.setAutomaticSession(boolean) kodunu kullanarak
bir HTTP oturumu yaratır.( varsayımsal olarak(default) bir oturum yaratılır) ve
w.

yönetici örtük nesne oturmunu dile getirerek bunu doldurur.


4. Test sınıfınızdaki setUp(), testXXX() ve tearDown() metodları bu sırayla işletilir.
Bu metodlar yansımayı kullanarak(reflection) vekil yönetici tarafından çağrılır. Tabiki
setUp() ve tearDown() metodlarının kullanımı JUnit ‘te olduğı gibi isteğe bağlıdır.
5. testXXX() metodunuz sunucu tarafında test etmek, testi çalıştırmak ve JUnit
bildirim API’si kullanılarak (assert(), assertEquals(), fail(), ...gibi metodlarla )
ww

sonucu bildirmek için çağrılır .


6. Eğer test başarısız olursa testXXX() metodlarınız vekil yönetici(Redirector Proxy)
tarafından yakalanan hatalar fırlatır.
7. Eğer bir hata varsa vekil yönetici bu hata hakkında bigi verir. (hatanın ismi, hatanın
sınıfı , yığıt izi gibi) bu bilgi istemciye döner. Hata hakkındaki bilgi JUnit’in Test
Runner konsolu tarafından bastırılır.
8. Eğer hata oluşmamışsa YYYTestCase.runTest() metodu
endXXX(org.apache.cactus.WebResponse) ya da
endXXX(com.meterware.httpunit.WebResponse) metodu var mı diye bakar ve
varsa çalıştırır. Bu durumda geri dönen HTTP başlıklarını,kurabiyeleri ve endXXX()
metodundaki servlet çıktı akımını(output stream) kontrol etme imkanınız vardır.
Tekrar JUnit bildirimlerini ve Cactus tarafından sağlanan yardımcı sınıfları kullanarak

m
da yapabiliriz. Daha sonra runTest() metodları bir
end(org.apache.cactus.WebResponse) ya da
end(com.meterware.httpunit.WebResponse) metodu var mı diye bakar ve varsa
çalıştırır. end() metodu her testten sonra çalıştırılır.

o
Vekil Yöneticiler(Redirector Proxies)

Cactus vekil yöneticiler için üç uygulama sağlar

i.c
• Servlet Yöneticisi: Bu yönetici servlet nesnelerini kullanan java sınıfları
(HttpServletRequest, ... gibi ) ya da servlet metodlarının birim testi için kullanılır.
• JSP Yöneticisi: Bu yönetici JSP örtük nesnelerine(PageContext, ...gibi ). erişimde
kullanılan sunucu taraflı birim testi kodları için kullanılan bir JSP sayfasıdır. JSP
yöneticisi genelde Tag kütüphanelerini test için kullanılır.
• Filter Yöneticisi:. Bu yönetici bir Serblet filtereleyicisidir ve filtre nesnelerini

birim testinde kullanılırlar.


dil
(FilterConfig, ...gibi ) kullananan java sınıflarının ya da Servlet Filtreleyicilerinin

Servlet Vekil Yöneticisi(Redirector Proxy)


4.) setUp(),
1.)begin() testXXX(),
va
beginXXX()
tearDown()
2,8 3
ServletTestCa Tekrar Yönetme ServletTestCase
se (redirector) Servlet

7,9 6
ja

10.)endXXX() 5
end()
w.

Sunucu Taraflı
İstemci tarafı Sunucu Tarafı Sınıflar
ww

İstemci tarafı servlet yöneticisi için 2 tane HTTP bağlantısı açar. Birincisi testi çalıştırmak ve
servletin çıktı akımını retrieve yapmak için ikinci seferi ise sonucu almak için kullanılır. Bu
eğer test çalışmazsa hata verisini almak için kullanılır.(mesajları,yığıt trace gibi…) test
sonuçları ServletContext içinde bir değişkende tutulur ve daha sonra HTTP'nin ikinci
bğlantısında retrieve edilir.

m
JSP Vekil Yöneticisi(Redirector Proxy)
4.) setUp(),
1.)begin() testXXX(),
beginXXX()
tearDown()
2,8 3

o
JspTestCase Tekrar Yönetme JSPTestCase
(redirector) JSP

i.c
7,9 6

10.)endXXX() 5
end()

İstemci tarafı dil


Sunucu Tarafı
Sunucu Taraflı
Sınıflar
va
İstemci tarafı JSP yöneticisi için iki tane HTTP bağlantısı açar. Birincisi testi çalıştırmak ve
servletin çıktı akımına erişmek için ikinci seferi ise sonucu almak için kullanılır. Bu eğer test
çalışmazsa hata verisini almak için kullanılır.(mesajları,yığıt trace gibi…) test sonuçları
ServletContext içinde bir değişkende tutulur ve daha sonra HTTP'nin ikinci bğlantısında
ja

retrieve edilir.
w.
ww
Filter Redirector Proxy
4.) setUp(),
1.)begin() testXXX(),

m
beginXXX()
tearDown()
2,8 3
FilterTestCase Tekrar Yönetme FilterTestCase
(redirector)Filter

o
7,9 6

i.c
10.)endXXX() 5
end()

Sunucu Taraflı
İstemci tarafı Sunucu Tarafı Sınıflar

dil
va
İstemci tarafı Filtre yöneticisi için 2 tane HTTP bağlantısı açar. Birincisi testi çalıştırmak ve
servletin çıktı akımına erişmek için ikinci seferi ise sonucu almak için kullanılır. Bu eğer test
çalışmazsa hata verisini almak için kullanılır.(mesajları,yığıt trace gibi…) test sonuçları
ServletContext içinde bir değişkende tutulur ve daha sonra HTTP'nin ikinci bğlantısında
retrieve edilir.
ja

CACTUS KURULUMU

Sistem Gereksinimleri:
w.

Cactus bir uygulama değil bir frameworktur. Cactus testlerini çalıştırmak için aşağıdaki
yazılımların bilgisayarınızda yüklü olması gereklidir:

• Java Virtual Machine bir Java 1.2 yada daha uyumlu bir sanal makine. Bütün servlet
ww

makineleri bir JVM gerektirir. Zaten servletleri kullandığınız için makinenizde kurulu
bir JVM vardır.
• Servlet/J2EE Engine Uygun bir servlet makinesi(Servlet 2.x/J2EE 1.x) Cactus
testlerini .alıştırmak için sistemde bulunmalıdır.

Ayrıca Cactus ile bütünleştirmek istenilen geliştirme araçlarının da sisteminizde kurulu


olması gerekli. Örneğin Ant kullanmak istiyorsak ant yüklü olmalı. Eğer Cactus testlerini bir
yazılım geliştirme ortamında(IDE) çalıştırmayı planlıyorsanız bu IDE yazılımı da tabiki
sisteminizde olmalı.

m
Cactus Kütükleri(Files)

Bu noktada indirilmiş yayılmış(klasorler dağınık) bir Cactus’u indirmiş olmalısınız.(J2EE


Uygulama Programı Arayüzü(API)’sinde kullanmayı düşünüyorsanız) ve bunu [cactus
root] klasorü içine çıkartmalısınız(unzip).

o
[cactus root]klasörü altında bulacağınız klasörler:

• doc/: Cactus web sitesini ve API java dokümanlarını(javadocs) içerir.

i.c
• lib/: Cactus jarları ve ilişkili dış kütüphaneleri içerir.
• samples/: Cactus testlerinin nasıl yazılacağını ve bunların nasıl otomatik çalışcağını
gösteren bazı uygulamalar içerir.
• samples/ejb: EJB’leri Cactusle nasil test edeceğinize dair örnek uygulamalar içerir.
• samples/jetty: Servletleri Cactus ve Jetty ile nasıl test edileceğini gösteren
uygulamalar içerir. ( the JettyTestSetup eki(extension) kullanarak).


uygulamalar içeir.
dil
samples/servlet: Servlet/JSPs/Tagliblerin Cactusle nasıl test edileceğini gösteren

web/: JSP redirector kütüğü içerir bu sadece elle bütünleştirmeyi(manual integration)


kullananlar için gereklidir.

Cactus’ü oluşturan jarlar:


va
• cactus.jar: ana(main) jar, framework sınıflarını içerir. Bu jarı [cactus root]/lib
içinde bulabilirsiniz.
• cactus-ant.jar: Bu jar bazı Ant müşterileri için Antla bütünleştirmeyi
kolaylaştırmak için bazı Ant görevleri içerir. Bu sadece Cactus testlerini otomatil
çalıştırmak için Ant kullanılacaksa gereklidir. Cactus ve Ant’ın nasıl bütünleşeceğine
ja

dair daha fazla bilgi edinmek için Ant_Howto’yu okuyun. Bu jarı [cactus
root]/lib içinde bulabilirsiniz.
• httpclient.jar: Cactus kurabiye(Cookie) işlemleri için the Jakarta Commons
HttpClient frameworkünü kullanır.
• junit.jar: Cactus JUnit’e erişir bu yüzden JUnit jarına ihtiyaç duyar.
w.

• aspectjrt.jar: Cactus bazı görevleri yerine getirmek için AspectJ’yi kullanır.


(metodlardan çıkmak, girişleri kaydetmek ve konfigurasyonları kontrol etmek için vs.)
etc).
• commons-logging.jar: Cactus Jakarta Commons Logging facade frameworkünü
varolan herhangi bir frameworkü (Log4j, LogKit, JDK 1.4 Logging vs.) kullanım için
Cactus girişini sağlar.Bu ayrıca Commons HttpClient için gereklidir.
ww

• servletapi.jar: Servlet örneğini derlemek için gereklidir. Ideal olarak J2EE jarını
(EJB örneğini derlemek için gerekli olan) sıkıştırılır.Ama Sun bize J2EE jarını tekrar
açmak için izin vermediğinden kendimiz tekrar indirmeliyiz.
• httpunit.jar: Cactus HttpUnit frameworkünü (complex assertions of returned
responses) işlemlerini yerine getirmek için kullanır. Cactus ayrıca default bir web
yanıt nesnesini içerir.Ama kompleks eklemeler için HttpUnit tercih edilebilir.
• nekohtml.jar: HttpUnit için gereklidir.
Cactus TestCase Yazmak

Giriş

m
Test durumlarının(case) bir çok çeşidi vardır.Servlet testleri yazmak için test durumları taglib
birim testleri yazmak için test durumları ve filtreleyici birimi testleri yazmak için test
durumları gibi. Bu yüzden ilk önce bütün test durumları için ortak olan genel kurallar
verilecek ve daha sonra her test durumu için özel olan detaylar verilecektir.

o
Genel Kurallar

i.c
Bir test case yazmak için aşağıdaki adımları izleyin:

1. Adım: Eklenenler(imports)

Test sınıfınızın içine aşağıdakileri eklemelisiniz.( Cactus JUnit’ test programlarını çağırırken
istemci tarafı uygulaması olarak kullanır bu yüzden junit.framework.* test sınıfınızın içne
eklenmelidir. ):

import org.apache.cactus.*;
import junit.framework.*;
dil
2.Adım: Bir Cactus TestCase sınıfına erişin ya da JUnit TestCase’i tekrar
kullanın
va
A Seçeneği: Cactus TestCase Sınıfına Erişim
Önce bir Cactus test sınıfınına erişen (neyi test ettiğimize bağlı olarak bu sınıf değişir) bir
sınıf yaratırız.(bu bizim kendi test sınıfımızdır.)

• ServletTestCase: bu sınıfa Servlet API nesnelerini(HttpServletRequest,


ja

HttpServletResponse, HttpSession, ServletConfig, ServletContext gibi


Servletler ya da Servlet API nesnelerini kullanan metodları olan java sınıfları )
kullanan birim test kodlarına test sınıfı yazmak için erişilir.

Servletler ya da Servlet API nesnelerini kullanan metodları olan java sınıflarına örnekler:
w.

public class TestSampleServlet extends ServletTestCase


{
}
• JspTestCase: bu sınıfa JSP API nesnelerini (PageContext, JspWriter sınıfları gibi)
kullanan birim test kodlarına test sınıfı yazmak için erişilir. Taglibler(tag
kütüphaneleri) yada JSP API nesnelerini kullanan metodları olan java sınıflarına
ww

örnekler:
public class TestSampleTag extends JspTestCase
{
}

• FilterTestCase: bu sınıfa süzgeç(Filter) API nesnelerini (FilterChain,


FilterConfig, HttpServletRequest, HttpServletResponse gibi) kullanan birim
test kodlarına test sınıfı yazmak için erişilir. Süzgeçler ya da Süzgeç API nesnelerini
kullanan metodları olan java sınıflarına örnekler:
public class TestSampleFilter extends FilterTestCase
{
}

m
B Seçeneği: Bir JUnit TestCase’i Tekrar Kullanma

Cactus katıksız bir JUnit TestCase’i sunucu tarafında çalıştırabilir. Bu ServletTestSuite’i


kullanarak sizin var olan Test Case(Durumlarınız)leriniz kullanılarak yapılır.Örneğin::

o
public class TestJUnitTestCaseWrapper extends TestCase
{
public static Test suite()
{

i.c
ServletTestSuite suite = new ServletTestSuite();
suite.addTestSuite(TestJUnitTestCaseWrapper.class);
return suite;
}

public void testXXX()


{
}
}
dil
3. Adım: (isteğe bağlı): setUp() ve tearDown() metodları
JUnitte olduğu gibi siz de bir setUp() ve bir tearDown() metodu tanımlayabilirsiniz. Bunlar
tanımlandığı sıraya göre her test case’inden önce ve sonra çalışırlar. Ancak JUnit istemci
tarafında çalışırken Cactus sunucu tarafında çalışır. Bu Cactus’ün örtük nesnelerine
erişebileceğimizi gösterir. ( bu nesneler 2. adımda anlatılan API’lerdeki nesnelerdir.) Başka
va
bir deyişle HTTP oturumunda test caselerin çağrılma önceliklerini değiştirebilirsiniz.

JUnit’te olduğu gibi , the setUp() ve tearDown() methodlarını kullanma isteğe bağlıdır.

4. Adım (isteğe bağlı): begin() ve end() metodları


ja

begin(...) ve end(...) methodları bir önceki adımda anlatılan setUp() ve tearDown()


metodlerının istemci tarafındaki eşdeğerleidir. Bunlar istemci tarafında her testten önce ve
sonra çağrılırlar.
w.

begin() ve end()methodlarını kullanma isteğe bağlıdır.

5. Adım: testXXX() metodları

JUnitte olduğu gibi test işlemi için ana metod testXXX() metodudur. Bu metodun
diğerlerinden farkı Cactusle gelen bir kapla(containerla) çalışmasıdır. Her XXX test case’i
ww

tanımlı bir testXXX() metodu içermelidir.

testXXX() methodlarının içinde yapılması gerekenler:

• Sınıfı test etmek için oluşturun. (ayrıca bu örneği(instance) factor out yapabilirsiniz ve
tanım bir class örneği değişkenidir.you can also factor this instance out and define is
as a class instance variable),
• Herhangi bir sunucu taraflı alan(domain) nesnesi kurulur. (http oturumuna bir
değişken koymak gibi.) Gerçekte , 2. adımda erişilen Cactus test case sınıfı geçerli
nesnelerle ilk değer atanan çeşitli örnek değişkenleri içerir. (bunlar 2. adımda anlatılan

m
farklı API nesneleridir. Test sınıfına bağlı olarak bu değişkenlere istemlerle
(HttpServletRequest ile), ayarlamak(config) (ServletTestCase’i için
ServletConfig veya FilterTestCase için FilterConfig) işlemleri için
erişebilirsiniz. ( Test case detayları için aşağıdaki adımları okuyunuz.)
• Test etmek için metodu çağırın:

o
• Testin başarılı olduğunu kanıtlamak için Standart JUnit bildirimlerini yapın:
(asserts(..), assertEquals(...), fail(...), ...) Örneğin:

public void testXXX()

i.c
{
// test işlemi için sınıfı oluşturun:
SampleServlet servlet = new SampleServlet();

// doSomething() metoduyla test işlemi için gerekli değişkenler


oturumun içine konulur.

// bu değişken oturumda olan bir değişkendir. Örneğin:


session.setAttribute("name", "value");
dil
//test işlemi için HttpServletRequest nesnesini parametre alan bir
metod çağrılır.Örneğin: String result = servlet.doSomething(request);

// testin başarılı olup olmadığı kontrol edilir.


assertEquals("something", result);
assertEquals("otherValue", session.getAttribute("otherName"));
va
}

6. Adım (isteğe bağlı): beginXXX() methodları

Her bir XXX test durumu için uygun bir beginXXX() metodu isteğe bağlı olarak
tanımlanabilir. Bu metodu Http ilişkili parametrelerini(HTTP parametreleri, kurabiyeler,
ja

HTTP başlıkları, URL taklitleri gibi) oluşturmak için kullanabilirsiniz. TestXXX


metodunuzdaki bu değerleri HttpServletRequestlerin (getQueryString(),
getCookies(), getHeader()… gibi) farklı API’lerini çağırarak tekrar elde edebilirsiniz.

Begin metodunun yazılımı aşağıdaki gibidir:


w.

public void beginXXX(WebRequest theRequest)


{
[...]
}
ww

Cactus tarafından sağlanan theRequest nesnesi bütün HTTP ilişkili parametrelerini


kurmak için kullanılır.

Kurabileceğiniz bütün ilişkili HTTP parametrelerinin tam tanımları WebRequest arayüzünü


için hazırlanmış javadoc içinde vardır. Ayrıca Cactus tanıtımının bir parçası tarafından
sağlanan örnekleri kontrol edebilirsiniz.
beginXXX() methodları istemci tarafında sunucu tarafındaki testXXX() metodundan daha
öncelikli çalıştırılırlar böylece API nesnelerini gösteren sınıf değişkenlerine erişim
olanaksızdır. (bunların değerleri ‘null’dur)

m
7. Adım (isteğe bağlı): endXXX() methodları

Her bir XXX test case’i için , buna uygun bir endXXX() method tanımlayabilirsiniz. Bu
metodu test case’nizden geri dönen ilişkili HTTP parametrelerini doğrulamak için

o
kullanabilirsiniz. You will use this method to verify the returned HTTP related parameters
from your test case (geri dönen HTTP yanıtının içeriği,geri dönen herhangi bir kurabiye,geri
dönen HTTP başlıkları gibi…).

i.c
Cactus’ün v1.1’e kadar olan versiyonları için end metodunun yaımı şöyledir:

public void endXXX(HttpURLConnection theConnection)


{
[...]
}

dil
... ve bazı yardımcı metodlar yanıt içeriklerini ve AssertUtils sınıfı tarafından sağlanan
kurabiyeleri çıkarırlar (javadoc’a bakınız).

Ancak Cactus 1.2den başlayarak bu durum hor görülmüştür. Şimdi end metodu için karmaşık
kontrollerinin ne döndürdüğüne yada döndürmediğine ihtiyacımız olup olmadığına bağlı
olarak kullanılan iki tür yazım vardır. Karmaşık kontroller için HttpUnit frameworkünü
va
kullanırız. Metod yazılımlarının tam tanımları için HttpUnit tutorial’ina bakınız.

endXXX() methodları istemci tarafında sunucu tarafında çalışan testXXX() metodlarından


sonra çalışır. Böylece API nesnelerini gösteren sınıf değişkenlerine erişmek
olanıksızdır.(bunların değerleri ‘null’dur)
ja

Özelleşmiş TestCase Detayları

Ayrıntılı özetleri okumadan önce genelde yapılması gerekenleri okumanız önerilir.

ServletTestCase ilkeleri
w.

Ne Zaman Kullanılır?

Test sınıfınız ServletTestCase’e aşağıdaki birim testleri yaparken erişir:


ww

-Servletler,

-Servlet API nesnelerini kullanan herhangi bir java kodunda: (örneğin :HttpServletRequest
gibi...)

Örtük Nesneleri Sağlamak

Cactus sizin için örtük nesneleri otomatik olarak oluşturur ve bu nesneler sizin setUp(),
testXXX() and tearDown() methodlarınız için ServletTestCase sınıfının örnek
değişkenleri olarak kullanılabilir hale getirilir.(ve böylece test case sınıfınızın içindeki örnek
değişkenler de ServletTestCase sınıfı tarafından kullanılabilir hale getirilir.)

m
Cactusun bu nesneleri nasıl oluşturduğunu düşünebilirsiniz.

Sağlanan örtük nesneler şunlardır:

istemler

o
Oluşturulan request
nesne ismi:
org.apache.cactus.server.HttpServletRequestWrapper (bu
Sınıf ismi:

i.c
javax.servlet.http.HttpServletRequest ‘ten kalıtılır.)

Cactus beginXXX() metodunun içinde kurulan HTTP ilişkili parametrelerini sırasıyla


döndüren orijinal HTTP istem metodlarını kapsar. Böylece bu istem nesnesini kodunuzda test
ve kurma işlemi için beginXXX() metodunda gerekli bir parametre olarak geçirirsiniz.

dil
Örneğin istem nesnenize geçirdiğiniz getCookies() test çağrıları altındaki kodunuz
WebRequest.addCookie() metodunu çağırarak beginXXX() metoduna HTTP istemiyle
eklediğiniz kurabiyeleri döndürecektir.

org.apache.cactus.WebRequest arayüzü ve tüm detaylarıyla


org.apache.cactus.server.HttpServletRequestWrapper sınıfı için javadoca bakınız.
va
Ayrıca Cactus tanıtımında sağlanan örneklere de bakabilirsiniz.

İlave metodlar

Cactus testleri yazmayı kolaylaştırmak için bazı ilave metodlar sağlamıştır. (tüm detaylar için
javadoc’a bakınız). Bu metodlar gerçek veri ayarlarını gerçekleştirmek kolay olmadığı için
sağlanmıştır:
ja

• setRemoteIPAddress():getRemoteIPAddress() metodu tarafından döndürülen uzak


IP adresini kurar.
• setRemoteHostName():getRemoteHostName() metodu tarafından döndürülen uzak
w.

Host ismini kurar.


• setRemoteUser():getRemoteUser() metodu tarafından döndürülen uzak kullanıcı
ismini kurar.

Yanıtlar:
ww

Örnek değişken ismi: response


Sınıf ismi: javax.servlet.http.HttpServletResponse
Cactus yanıtı kapsamaz.

Ayarlar(config)
Örnek config
değişken
ismi:
org.apache.cactus.server.ServletConfigWrapper

m
Sınıf ismi: javax.servlet.ServletConfig sınıfından kalıtılır.

Cactus Servlet Config’i iki nedenden dolayı kapsar:

• İlave metodları sağlamak için.Örneğin, parametreleri web.xml…vs içinde kurmadan

o
ilk değer atamak olanaklıdır.
• Bu yüzden orijinali yerine sarılı bir Servlet içeriği döndürülebilir. Bunun sebebi
Servlet içeriğinin ileriler(forward) yapmak ve orijinal istem ve yanıt metodlarına

i.c
parametre geçirmek için kullanırlar.İstemi sakladığımız gibi orijinal isteme(saklanana
değil) geçirmek için Servlet içeriğini de saklamaya ihtiyaç duyarız.

config örtük nesnesi Servlet Redirector servleti tanımı altında web.xml içinde tanımlanan
bütün ilk değerleri içerecektir.

dil
org.apache.cactus.server.ServletConfigWrapper sınıfına tüm ayrıntılar için
javadoc’tan bakarak ulaşabilirsiniz. Ayrica örnekleri Cactus dağıtımında sağlanan örneklerde
de bulabilirsiniz.

İlave Metodlar

Sağlanan ilave metodlar:


va
• setInitParameter(): ilk değer parametrelerini kurar. (eğer web.xml dosyasında
tanımlanmışsa),
• setServletName():getServletName() metodu tarafından döndürülen Servlet ismini
kurar.(eğer kurulmamışsa , the Cactus Servlet redirector ismi geri döndürülür.)
ja

ServletContextWrapper(Servlet İçerik Saklanması)

Bu görüş başına düşen örtük bir nesne değildir. (örnek bir değişken gibi erişilebilir değildir).
Bu config.getServletContext() metodunu çağırarak kullanılabilir hale gelir.
w.

Ama Cactus ServletContext’ü ServletContextWrapper içerisinde URLler tarafından


taklit edilen hesaplar ve test yazmak için ilave metodlar sağlamak için saklanır.

org.apache.cactus.server.ServletConfigWrapper sınıfına tüm ayrıntılar için


javadoc’tan bakarak ulaşabilirsiniz. Ayrica örnekleri Cactus dağıtımında sağlanan örneklerde
ww

de bulabilirsiniz.

İlave Metodlar

Sağlanan ilave metodlar:

• getLogs():ServletContext.log() metod çağrıları tarafından giriş yapılan texti


döndürür. Bu ne girildiğini anlatan yardımcı bir metoddur.
• setInitParameter(): ilk değer parametresini kurar. (eğer web.xml dosyasında
tanımlanmışsa, <context-param> elemanını kullanarak bu işlemi yaparız).

m
oturum
Örnek değişken ismi: session (oturum)
Sınıf ismi: javax.servlet.http.HttpSession
Cactus yanıtı saklamaz.

o
Varsayılan(default) olarak , Cactus genelde sizin testiniz için bir http oturumu yaratır.Bunun
yapılmaması WebRequest.setAutomaticSession(false) metodu çağrılarak sağlanabilir
(true varsayılır). Kodunuzu çeşitli dallara ayırırken request.getSession(false)yapmak

i.c
yararlı olabilir.

Tavsiye ve Numaralar

Parametre ilk değer ataması

dil
Test altındaki kodunuz eğer javax.servlet.GenericServlet (bunlar,
getServletConfig(), ... metodları ) tarafından kalıtılmış servlet metodlarından herhangi
birini kullanıyorsa servletinizi oluşturmak için (içteki ServletConfig nesnesini oluşturmak
için) init(ServletConfig) metodu çağrılır.

Örneğin:
va
public void testXXX()
{
MyServletToTest servlet = new MyServletToTest();
servlet.init(config);

// test işlemi için Generic Servletten kalıtılmış bir metodu kullanan


ja

bir metod çağırma


servlet.someMethodToTest();

[...]
}
w.

Cactus’ün sınıflara ayrılmış parçaları için sağlanan örneklerinden biri aşağıda verilmiştir.

Örnek

Bu Servletin birim testi için verilen küçük bir örnektir. Bu geniş örneği verilen
sınıflandırılmış küçük örnekleri kontrol için kullanabilirsiniz.
ww

Bu örnek Cactus 1.2 ve üst versiyonları içindir ve yeni WebRequest ve WebResponse


nesnelerini kullanır.
public void beginXXX(WebRequest theRequest)
{
// ilişkili HTTP nesnelerinin kurar.
theRequest.setURL("jakarta.apache.org", "/mywebapp", "/test/test.jsp",
null, null);
theRequest.addCookie("cookiename", "cookievalue");
}
public void testXXX()
{
MyServletToTest servlet = new MyServletToTest();

m
servlet.init(config);

// test etmek için metod çağrılır


servlet.methodToTest();

// bazı sunucu taraflı bildirimleri yapar

o
assertEquals("someValue", session.getAttribute("someAttribute"));
assertEquals("jakarta.apache.org", request.getServerName());
}

i.c
public void endXXX(WebResponse theResponse)
{
// geri dönen HTTP yanıtını bildirir

Cookie cookie = theResponse.getCookie("someCookie");


assertEquals("someValue2", cookie.getValue());

assertEquals("some content here", theResponse.getText());


}

JspTestDurumu İlkeleri
dil
Ne zaman kullanılır?
va
Test durumu sınıfınız JspTestCase’e ne zaman aşağıdaki birim testleri yapacaksanız erişir.

• Custom tags(Genel Etiketlerde),


• JSP API nesnelerini kullanan herhangi bir java sınıfını test edecekseniz
(PageContext, ...gibi)

Etiket Kütüphaneleri Test Etmeye Genel bir Bakış


ja

Genel etiketler TLD’(tag kütüphanesi tanımlayıcı dosyası)nin içindeki kayıtlarını ve bir etiket

yönetici sınıfını içerir. Cactus bir genel etiketin bu iki yüzünü birden test etme yeteneğine
w.

sahiptir. Ama TLD eğer hiç mantık içermiyorsa Cactus ilk olarak etiket yönetici sınıfını test
etmelidir.

Etiket yönetici sınıfını test etmek için, JspTestCase tarafından sağlanan örtük nesneler testin
ilk durumunu kurmak için kullanılır. Daha sonra pageContext örtük nesnesini kullanarak
kendi genel etiketinizi oluşturun ve ilk değer atatın. Etiketinizi kurduktan sonra etiketinizde
ww

dahil edilen yaşam döngüdü metodlarınızı sırasıyla çağırın ve metodlarınızın doğru sonuç
döndürüp döndürmediğini yorumlayın. Etiketin çıktısı endXXX() metodunun içinde gözden
geçirilebilir.

Daha tümleşik testler için genel etiketinizi deneyen bir JSP sayfası oluşturup bu sayfayı
Cactus test durumundan çağırabilirsiniz.

Etiket denetleyivilerinin yaşam döngülerinin yönetiminin karmaşıklığını basitleştirmek için


Cactus JspTagLifecycle adı verilen bir yardımcı sınıf sağlamaktadır. Bu JSP makinelerinin
etiket yönetim usullerinin basit bir koçan tamamlayıcısıdır ve etiket yöneticilerini test etmek
için bir çok uygun kısa metod sağlar. JspTagLifecycle sadece JSP 1.2 için uygundur.

m
Sağlanan Örtük Nesneler

Cactus otomotik olarak aşağıdaki örtük nesnelere ilk değer verir. Bu nesneler JspTestCase
sınıfının ve sizin test durumu sınıfınızın anlık değişkenleri olarak sizin setUp(), testXXX()
vetearDown() methodlarınız için uygun hale getirilir.

o
Sağlanan örtük nesneler şunlardır:

i.c
request

• response

• config

• session

çıktı
Anlık değişken ismi
Sınıf ismi
out
dil
public javax.servlet.jsp.JspWriter
Cactus çıktı nesnesini sarmalamaz.
va
Bu nesneyi yanıta veri yazmak ve etiket gövdesini üretmek için kullanabilirsiniz.( eğer etiket
kendi gövdesini üretemiyorsa.) eğer etiket kendi gövdesini üretebiliyorsa üretilen gövdeyi
çıktı olarak yazmak için BodyContent nesnesine ihtiyaç duyarsınız.

Sayfa içeriği
ja

Anlık değişken pageContext


ismi
org.apache.cactus.server.PageContextWrapper , which inherits from
Sınıf ismi javax.servlet.jsp.PageContext
w.

Genel etiketler pageContext nesnesine JSP içeriği hakkında bilgi almak için güvenirler.
Ayrıca bu genel etiketleri test etmek için kullanılan en önemli nesnedir.
ww

Gövde içeriği
Anlık değişken ismi bodyContent
Sınıf ismi javax.servlet.jsp.tagext.BodyContent
Filtreleyici Test Durumu ilkeleri

Ne Zaman Kullanılır

m
Test sınıfınız FilterTestCase’i aşağıdaki birim testleri yapmak için kullanır:

Servlet Filtreleyiciler,

o
• Filtreleyici API nesnelerini kullanan java sınıfınız varsa (FilterConfig, .. gibi
nesneleri.)

i.c
Sağlanan Örtük Nesneler

Cactus otomotik olarak örtük nesnelerinize sizin için ilk değer ataması yapar ve bu nesneler
sizin setUp(), testXXX() ve tearDown() metodlarınızın FilterTestCase sınıfının ve bu
sınıfa erişen test durumu sınıfınızın anlık değişkenleri olarak kullanılır.

Sağlanan örtük nesneler şunlardır:


request

response
dil
config
va
Anlık
Değişken config
İsmi
org.apache.cactus.server.FilterConfigWrapper , which inherits from
Sınıf İsmi javax.servlet.FilterConfig
ja

Cactus orijinal Filter Config’i iki nedenden ötürü içerir:

• eklenen metodları sağlamak için. Örneğin filtreleyici parametrelerine web.xml içinde


yazmadan ilk değer atayabilirsiniz.
• Böylece bu orijinali yerine sarmalanmış bir Servlet içeriği döndürebilir.
w.

config örtük nesnesi Filtreleyici yöneticisi filtreleyici tanımlayıcı altında tanımlanmış


ww

web.xml içindeki bütün ilk değer parametrelerini içerecektir.

Eklenen Metodlar

Sağlanan ek metodlar:

• setInitParameter(): ilk değer parametresini kurar.( eğer bu parametre web.xml


kütüğü içinde tanımlanmışsa)
• setFilterName():getFilterName() fonksiyonundan dönecek olan fitreleyici ismini
kurar (eğer kurulmamışsa Cactus Filtre Yöneticisi ismi dönecektir.)

m
filtreleyici Zinciri
Anlık Değişken İsmi filterChain
Sınıf ismi javax.servlet.FilterChain
Cactus filtreleyici zincirini sarmaz.

o
Tavsiye ve Numaralar

Zincirde bir sonraki Filtreleyiciyi Taklit Etmek

i.c
Filtreleyicinizin birim etsini yapıyorsanız zincirdeki bir sonraki filtrelenin benzerini yapmayı
umacaksınız. Böylece sizin kararınız sizin birim testinizde diğer filtreleyicinin test altındaki
filtreleyicinize ne döndüreceğini söyler. Burada bunun nasıl yapıldığını görüyorsunuz:

public void testDoFilterOK() throws ServletException, IOException


{
dil
SampleFilter filter = new SampleFilter();
filter.init(config);
[...]

FilterChain mockFilterChain = new FilterChain() {


public void doFilter(ServletRequest theRequest,
ServletResponse theResponse) throws IOException,
va
ServletException
{
PrintWriter writer = theResponse.getWriter();
writer.print("<p>some content</p>");
writer.close();
}
public void init(FilterConfig theConfig)
ja

{
}
public void destroy()
{
}
};
w.

filter.doFilter(request, response, mockFilterChain);


[...]
}

Örnek
ww

Bu size verilen Filtreleyici birim testi için basit bir örnektir. Büyük alandaki örnekler için
yaygın örneklere bakın. Test ettiğimiz filtreleyici yanıta basit bir başlık ve son(footer) ekliyor.
Başlık ve son textleri web.xml içinde parametre olarak tanımlanmıştır.

public void testXXX() throws ServletException, IOException


{
SampleFilter filter = new SampleFilter();
config.setInitParameter("header", "<h1>header</h1>");
config.setInitParameter("footer", "<h1>footer</h1>");
filter.init(config);

FilterChain mockFilterChain = new FilterChain() {


public void doFilter(ServletRequest theRequest,

m
ServletResponse theResponse) throws IOException,
ServletException
{
PrintWriter writer = theResponse.getWriter();
writer.print("<p>some content</p>");
writer.close();

o
}
public void init(FilterConfig theConfig)
{
}

i.c
public void destroy()
{
}
};

filter.doFilter(request, response, mockFilterChain);


}

}
dil
public void endXXX(WebResponse theResponse)
{
assertEquals("<h1>header</h1><p>some content</p><h1>footer</h1>",
theResponse.getText());
ja va
w.
ww

You might also like