Professional Documents
Culture Documents
Cactus Mimarisi KKUTUK WwwJavaDiliCom
Cactus Mimarisi KKUTUK WwwJavaDiliCom
20122287
m
İÇİNDEKİLER
Cactus Mimarisi
o
Cactus Nasıl Çalışır?
i.c
Vekil Yöneticiler(Redirector Proxies)
m
**4. Adım (isteğe bağlı): begin() ve end() metodları
o
**6. Adım (isteğe bağlı): beginXXX() methodları
i.c
**7. Adım (isteğe bağlı): endXXX() methodları
dil
ServletTestCase ilkeleri
*Ne Zaman Kullanılır?
*Örtük Nesneleri Sağlamak
va
*ServletContextWrapper(Servlet İçerik Saklanması)
*Tavsiye ve Numaralar
*Örnek
JspTestDurumu İlkeleri
w.
*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.
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.
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)
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
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()
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.
m
Cactus Kütükleri(Files)
o
[cactus root]klasörü altında bulacağınız klasörler:
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
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.
• 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.)
Servletler ya da Servlet API nesnelerini kullanan metodları olan java sınıflarına örnekler:
w.
örnekler:
public class TestSampleTag extends JspTestCase
{
}
m
B Seçeneği: Bir JUnit TestCase’i Tekrar Kullanma
o
public class TestJUnitTestCaseWrapper extends TestCase
{
public static Test suite()
{
i.c
ServletTestSuite suite = new ServletTestSuite();
suite.addTestSuite(TestJUnitTestCaseWrapper.class);
return suite;
}
JUnit’te olduğu gibi , the setUp() ve tearDown() methodlarını kullanma isteğe bağlıdır.
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
• 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:
i.c
{
// test işlemi için sınıfı oluşturun:
SampleServlet servlet = new SampleServlet();
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
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:
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.
ServletTestCase ilkeleri
w.
Ne Zaman Kullanılır?
-Servletler,
-Servlet API nesnelerini kullanan herhangi bir java kodunda: (örneğin :HttpServletRequest
gibi...)
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.
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.)
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.
İ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
Yanıtlar:
ww
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.
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
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.
de bulabilirsiniz.
İlave Metodlar
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
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);
[...]
}
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
m
servlet.init(config);
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
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.
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.
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
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.
•
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
Eklenen Metodlar
Sağlanan ek metodlar:
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
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 destroy()
{
}
};
w.
Ö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.
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()
{
}
};
}
dil
public void endXXX(WebResponse theResponse)
{
assertEquals("<h1>header</h1><p>some content</p><h1>footer</h1>",
theResponse.getText());
ja va
w.
ww