• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用Cactus來測試J2ee應用

    發布: 2008-7-10 14:26 | 作者: 不詳 | 來源: IBM | 查看: 99次 | 進入軟件測試論壇討論

    領測軟件測試網
    關鍵字:Cactus來測試J2ee
    Junit是當前最流行的測試框架,它能夠讓開發人員很方便的編寫測試單元,可以使他們"放心"地開發。但是現在很多的應用都是基于j2ee的,代碼都是在服務器端的容器里面運行,這個使測試帶來了一些麻煩。對于普通的jsp,servlet用Junit來測試好像已經不是那么方便,對于EJB來說,特別是2.0版本,很多接口都是Local Interface,沒有辦法進行分布式的測試。那么我們如何進行這些代碼的測試呢?Apache為我們提供了一個強大的工具 Cactus!它是一套簡單,易于使用的服務器端測試框架,可以使開發人員很輕松的測試服務器端的程序,他們會說:"哦,就是這么簡單"。Cactus是Junit的一個擴展,但是它又和Junit有一些不同。Cactus的測試分為三種不同的測試類別,JspTestCase,ServletTestCase,FilterTestCase,而不是像Junit就一種TestCase。Cactus的測試代碼有服務器端和客戶端兩個部分,他們協同工作。那我們為什么不用Junit來做測試呢?主要有一下幾個理由: 

    EJB2.0中的Local interface ,不允訊遠程調用。用Junit不好測試,而Cactus的redirector位于服務器端,可以和EJB運行在一個容器中,這使得它可以直接訪問Local Interface。 
    一般EJB或者servlet,jsp都是運行在服務器上,如果你使用junit測試的話,你的測試是在客戶端,這使的運行環境和測試環境處于不同的系統環境中,這個有時候會不同的測試結果。 
    在一個EJB的應用中,一般都會有一些前端應用來訪問EJB,例如:jsp,servlet,javabean。這就意味著你需要一個測試框架來測試這些前端的組件。Cactus提供了所有這些組件的測試方法。哦,太棒了。 
    Cactus和ant很好的結合在一起,可以很容易的完成自動化測試,減少了很多工作量。當然,junit也提供這樣的支持。 
    前面是對Cactus作了一個大致的介紹,接下來我們用一個實際的例子來運用一下這個強大的測試框架。首先我們需要一個被測試的對象,在這里我們選用EJB2.0 CMP.我們做一個簡單的用戶管理。一下就一些主要的代碼,來進行一些分析。

    UserHome.java

    package usersystem;

    import javax.ejb.*;
    import java.util.*;

    public interface UserHome extends javax.ejb.EJBLocalHome {
    public User create(String name, String password) throws CreateException;
    public Collection findAll() throws FinderException;
    public User findByPrimaryKey(String name) throws FinderException;
    }
    User.java
    package usersystem;

    import javax.ejb.*;
    import java.util.*;
    public interface User extends javax.ejb.EJBLocalObject {
    public String getName();
    public void setPassword(String password);
    public String getPassword();
    public void setUserInfo(UserInfo userInfo);
    public UserInfo getUserInfo();
    public void setName(String name);
    }

    UserInfoHome.java
    package usersystem;

    import javax.ejb.*;
    import java.util.*;

    public interface UserInfoHome extends javax.ejb.EJBLocalHome {
    public UserInfo create(String name, String email, String address, String tel) throws 

    CreateException;
    public UserInfo findByPrimaryKey(String name) throws FinderException;
    }

    這里有兩個Entity Bean用來創建用戶信息。他們之間的關系在xml部署描述文件中描述,他們是1對1的關系。

    UserManagerLocal.java

    package usersystem;

    import javax.ejb.*;
    import java.util.*;

    public interface UserManagerLocal extends javax.ejb.EJBLocalObject {
    public void addUser(String name, String password, String email, String address, String tel);
    public Collection findAll() ;
    public void delAll();
    public void delByName(String name);
    public User findByName(String name) ;
    }

    UserManagerBean.java

    package usersystem;

    import javax.ejb.*;
    import javax.rmi.PortableRemoteObject;
    import javax.naming.*;
    import java.util.*;

    public class UserManagerBean implements SessionBean {
    SessionContext sessionContext;
    public void ejbCreate() throws CreateException {
    /**@todo Complete this method*/
    }

    public void ejbRemove() {
    /**@todo Complete this method*/
    }
    public void ejbActivate() {
    /**@todo Complete this method*/
    }
    public void ejbPassivate() {
    /**@todo Complete this method*/
    }
    public void setSessionContext(SessionContext sessionContext) {
    this.sessionContext = sessionContext;
    }

    /**
    * 添加用戶
    * @param name 用戶姓名
    * @param password 密碼
    * @param email 電子郵件
    * @param address 地址
    * @param tel 電話
    */
    public void addUser(String name, String password, String email, String address, String tel) {

    try{
    UserHome userHome=getUserHome();
    User user=userHome.create(name,password) ; //create user entity
    UserInfoHome userInfoHome=getUserInfoHome();
    UserInfo userInfo=userInfoHome.create(name,email,address,tel) ;// create userinfo 

    entity
    user.setUserInfo(userInfo) ;


    }catch(Exception e){

    throw new javax.ejb.EJBException (e.toString());
    }


    }

    /**
    * 返回UserHome接口
    * @return userHome
    */
    private UserHome getUserHome(){

    try {
    javax.naming.InitialContext ctx=new javax.naming.InitialContext ();
    Object ref = ctx.lookup("User");
    //cast to Home interface
    UserHome userHome = (UserHome) PortableRemoteObject.narrow(ref, UserHome.class);
    return userHome;
    }
    catch (ClassCastException ex) {
    ex.printStackTrace() ;
    return null;
    }catch (NamingException ex) {
    ex.printStackTrace() ;
    return null;
    }

    }

    /**
    * 返回UserInfoHome接口
    * @return
    */
    private UserInfoHome getUserInfoHome(){

    try {
    javax.naming.InitialContext ctx=new javax.naming.InitialContext ();
    Object ref = ctx.lookup("UserInfo");
    //cast to Home interface
    UserInfoHome userInfoHome = (UserInfoHome) PortableRemoteObject.narrow(ref, 

    UserInfoHome.class);
    return userInfoHome;
    }
    catch (ClassCastException ex) {
    throw new EJBException();
    }catch (NamingException ex) {
    throw new EJBException(ex.toString());
    }

    }


    /**
    * 返回所有用戶記錄
    * @return c
    * @throws javax.ejb.FinderException
    */
    public java.util.Collection findAll() {
    Collection c = null;
    try {
    UserHome uh=this.getUserHome() ;
    c=uh.findAll() ;
    }
    catch (FinderException ex) {
    throw new javax.ejb.EJBException ();
    }
    return c;
    }

    /**
    * 刪除所有記錄
    */
    public void delAll(){
    try {
    UserHome u=getUserHome();

    java.util.Collection c=u.findAll() ;
    java.util.Iterator i=c.iterator() ;
    while(i.hasNext() ){
    u.remove(((User)i.next()).getName()) ;
    }
    }
    catch (Exception ex) {
    throw new EJBException(ex.toString());
    }
    }

    /**
    * 根據用戶名刪除記錄
    * @param name
    */
    public void delByName(String name) {
    try {
    User user=findByName(name);
    UserHome uh=getUserHome();
    uh.remove(user.getName()) ;
    }
    catch (Exception ex) {
    throw new javax.ejb.EJBException (ex.toString());
    }
    }

    /**
    * 通過用戶名查找用戶記錄
    * @param name
    * @return
    */
    public User findByName(String name) {
    try {
    UserHome uh=this.getUserHome() ;
    User user=(User)uh.findByPrimaryKey(name) ;
    UserHome u=this.getUserHome() ;
    User uu=u.findByPrimaryKey(name) ;
    return user;
    }
    catch (FinderException ex) {
    throw new EJBException(ex.toString());
    }

    }

    }

    UserManagerBean是一個session bean ,它主要是對user的管理,和客戶端通訊,其實就是session facade模式 。代碼里面有注釋,這里就不多敘述了。

    ejb-jar.xml 部署文件描述



    "http://java.sun.com/dtd/ejb-jar_2_0.dtd">



    UserManager
    UserManager
    usersystem.UserManagerLocalHome
    usersystem.UserManagerLocal
    usersystem.UserManagerBean
    Stateless
    Container


    User
    Entity
    usersystem.UserHome
    usersystem.User
    User



    UserInfo
    Entity
    usersystem.UserInfoHome
    usersystem.UserInfo
    UserInfo



    User
    User
    usersystem.UserHome
    usersystem.User
    usersystem.UserBean
    Container
    java.lang.String
    ANT>False
    2.x
    User

    name


    password

    name


    findAll


    select Object(theUser) from User as theUser



    UserInfo
    UserInfo
    usersystem.UserInfoHome
    usersystem.UserInfo
    usersystem.UserInfoBean
    Container
    java.lang.String
    False
    2.x
    UserInfo

    name


    email


    address


    tel

    name




    userInfo-user

    userInfo
    UserInfoRelationshipRole
    One


    userInfo
    UserInfo


    user
    user



    user
    UserRelationshipRole
    One

    user
    User


    userInfo
    userInfo







    User
    *

    Required



    UserManager
    *

    Required



    UserInfo
    *

    Required




    接下來是訪問EJB的客戶端,我們用了一個servlet.

    ManaServlet.java
    package usersystem.servlet;

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.util.*;

    import usersystem.*;
    import javax.naming.*;
    import javax.ejb.*;
    import javax.ejb.*;
    import javax.ejb.*;

    /**

    Title: 


    Description: 


    Copyright: Copyright (c) 2002


    Company: 


    * @author unascribed
    * @version 1.0
    */

    public class ManaServlet extends HttpServlet {
    static final private String CONTENT_TYPE = "text/html; charset=GBK";
    private UserManagerLocalHome h=null;
    private UserManagerLocal uml=null;


    public void init() throws ServletException{

    try {
    h=getHome();
    uml=h.create() ;
    }
    catch (CreateException ex) {
    ex.printStackTrace() ;
    }
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws 

    ServletException, IOException {

    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws 

    ServletException, IOException {

    }

    public void addUser(HttpServletRequest request, HttpServletResponse response) throws 

    javax.ejb.EJBException {
    String name=request.getParameter("name") ;
    String tel=request.getParameter("tel") ;
    String address=request.getParameter("address") ;
    String email=request.getParameter("email") ;
    String pass=request.getParameter("pass") ;
    uml.addUser(name,pass,email,address,tel) ;
    }
    public User findByName(String name) throws javax.ejb.EJBException {
    User u = null;

    u=uml.findByName(name) ;

    return u;
    }
    public java.util.Iterator findAll() throws javax.ejb.EJBException {
    java.util.Collection c=uml.findAll() ;
    return c.iterator() ;
    }

    public void delAll() throws javax.ejb.EJBException {
    uml.delAll() ;
    }
    public void delUser(String name) throws javax.ejb.EJBException {


    uml.delByName(name) ;


    }
    public UserManagerLocalHome getHome() {
    UserManagerLocalHome home = null;
    try {
    javax.naming.InitialContext ctx=new javax.naming.InitialContext ();
    home=(UserManagerLocalHome)ctx.lookup("UserManagerLocal") ;
    }
    catch (NamingException ex) {
    ex.printStackTrace() ;
    return null;
    }
    return home;
    }

    public void destroy() {
    }
    }

    這個servlet在doGet,doPost沒有實現任何方法,這個不影響我們測試,我們要測試的只是這些public method. 我們的測試代碼如下:

    package usersystem.test;

    /**

    Title: 


    Description: 


    Copyright: Copyright (c) 2002


    Company: 


    * @author unascribed
    * @version 1.0
    */
    import usersystem.servlet.*;

    import java.io.IOException;
    import java.net.URLDecoder;
    import java.util.Hashtable;

    import junit.framework.Test;
    import junit.framework.TestSuite;

    import org.apache.cactus.Cookie;
    import org.apache.cactus.ServletTestCase;
    import org.apache.cactus.WebRequest;
    import org.apache.cactus.WebResponse;
    import javax.ejb.*;
    import javax.servlet.*;

    import usersystem.*;


    public class ManaServletTest extends ServletTestCase{
    ManaServlet servlet=new ManaServlet();
    public ManaServletTest(String theName) {
    super(theName);
    }

    public void setUp(){

    try {
    servlet.init() ;
    }
    catch (ServletException ex) {
    ex.printStackTrace() ;
    this.fail() ;
    }
    }
    public void tearDown(){

    }
    public void beginAddUser(WebRequest theRequest)
    {
    theRequest.addParameter("name", "nameValue");
    theRequest.addParameter("pass","passValue") ;
    theRequest.addParameter("tel","telValue") ;
    theRequest.addParameter("address","addressValue") ;
    theRequest.addParameter("email","emailValue");

    }
    public void testAddUser() throws javax.ejb.EJBException{
    servlet.addUser(request,response) ;
    }
    public void testFindAll(){
    java.util.Iterator i=servlet.findAll() ;
    //assertEquals(null,i);
    boolean ok=false;
    while(i.hasNext() ){
    if(((User)i.next()).getName().equals("nameValue")) {
    ok=true;
    };
    }
    this.assertTrue(ok) ;
    }
    public void testFindByName() throws javax.ejb.EJBException {
    User u=servlet.findByName("nameValue") ;
    UserInfo ui=u.getUserInfo() ;
    this.assertEquals("email",ui.getEmail()) ;
    this.assertEquals("tel",ui.getTel()) ;
    this.assertEquals("nameValue",u.getName()) ;
    this.assertEquals("passValue",u.getPassword()) ;

    }


    public void testDel() throws javax.ejb.EJBException {

    servlet.delUser("nameValue8") ;

    }
    public void testDelAll() throws javax.ejb.EJBException {
    servlet.delAll() ;
    }

    public static void main(String[] theArgs)
    {
    junit.textui.TestRunner.main(new String[]{
    ManaServletTest.class.getName()});
    }
    public static Test suite()
    {

    return new TestSuite(ManaServletTest.class);
    }

    }

    public class ManaServletTest extends ServletTestCase 我們要測試的是一個servlet,所以我們繼承ServletTestCase,如果你測試jsp的話,就繼承JspTestCase.

    public ManaServletTest(String theName) {
    super(theName);
    }

    和junit一下,ServletTestCase不允許使用默認的構造函數,所以必須使用一個帶參數的構造函數,并且調用 父類的構造函數。

    public void setUp(){

    try {
    servlet.init() ;
    }
    catch (ServletException ex) {
    ex.printStackTrace() ;
    this.fail() ;
    }
    }
    public void tearDown(){

    }

    setUp是在測試類運行時候首先被調用的辦法,在這里可以進行一些數據初始化之類的工作。在這里我們調用了 servlet.init().

    在測試類運行的時候需要顯式的調用servlet的init()方法。因為cactus在測試servlet的時候是實例化一個ser vlet的,不會調用inti(),而servlet enginer在調用的時候是會自動調用servlet的init()方法的。tearDown方 法在測試完成的時候運行,進行一些必要的數據處理,比如刪除一些測試數據等,這里我們沒有做任何工作。

    public void beginAddUser(WebRequest theRequest)
    {
    theRequest.addParameter("name", "nameValue");
    theRequest.addParameter("pass","passValue") ;
    theRequest.addParameter("tel","telValue") ;
    theRequest.addParameter("address","addressValue") ;
    theRequest.addParameter("email","emailValue");

    }
    public void testAddUser() throws javax.ejb.EJBException{
    servlet.addUser(request,response) ;
    }

    在Cactus中,你需要用testXXX來命名你的方法,這樣Cactus會自動調用這個方法進行測。而BeingXXX則是在調 用test方法之前調用,也就是說在一個功能測試之前運行。這里我們現在beginAddUser中添加一些必要的參數 。WebRequest是Cactus提供的一個類,它允許你設置一些Http參數,如果你使用了 theRequest.addParameter("name","nameValue"),那么在servlet中你就可以用request.getParameter("name") 來取得name的值。當然還可以設置Cookie,Http Head參數。在testAddUser()方法中我們測試addUser方法,如 果測試有異常,則會產生EJBException,得到一個測試失敗。

    public void testFindByName() throws javax.ejb.EJBException {
    User u=servlet.findByName("nameValue") ;
    UserInfo ui=u.getUserInfo() ;
    this.assertEquals("email",ui.getEmail()) ;
    this.assertEquals("tel",ui.getTel()) ;
    this.assertEquals("nameValue",u.getName()) ;
    this.assertEquals("passValue",u.getPassword()) ;

    }

    這個測試是測試根據用戶名查找用戶,之后你可以用assertEquals方法來測試返回的值是否正確。

    public static void main(String[] theArgs)
    {
    junit.textui.TestRunner.main(new String[]{
    ManaServletTest.class.getName()});
    }

    這里我們使用textui來運行我們的測試類,提供文本的測試信息,還有一個Swing的測試方法,一共一個界面, 但是沒有什么太大的意義。

    到此我們介紹了所有的主要方法。最后我們談談如何運行這個測試。

    首先下載Cactus。 
    把lib/下的jar文件加入到 web app的lib下。以及你客戶端的classpath中,這是最保險的,雖然不是所有 的jar都用的著。 
    設置你的Cactus.找到cactus.properties 文件,把它加入到客戶端的classpath中。 
    修改cactus.properties 文件,把http://localhost:8080/test 改成你相應的設置,test是你web應用的 名稱。其他設置可以不變。 
    修改服務器端web應用的配置,在web.xml中加入: 


    FilterRedirector
    org.apache.cactus.server.FilterTestRedirector



    FilterRedirector
    /FilterRedirector



    ServletRedirector
    org.apache.cactus.server.ServletTestRedirector



    JspRedirector
    /jspRedirector.jsp



    ServletRedirector
    /ServletRedirector

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: Cactus 應用

    21/212>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>