ssh加入junit4测试

很想爆粗,就为了搞这个死人东西,花了姐姐我4个下午的时间,实在是令人发指,为了避免以后也花那么多时间去搞这个,在这里做个笔记以备以后查阅。

前提,在已经搭建出一个ssh项目的基础上增加junit4测试。

一、对action的struts和spring测试

1、导入jar包

junit-4.11、struts-junit-plugin-2.2.3(自己官方下载,这两个jar是关键,其他缺什么补什么)

2、为了项目方便,重载了StrutsSpringTestCase的一些函数,自定义了一个继承类用于公共用途

package com.scorpion.test.util;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.StrutsSpringTestCase;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;

/**
 * @author ZJ
 * @作用 设置ssh的公共测试环境
 * @创建日期 2013-10-10下午05:18:01
 * @修改人 
 * @修改日期 
 * @修改内容 TODO
 * @version V1.0
 */
public class BaseTestCase extends StrutsSpringTestCase {
    /**
     * @Field CONTEXT_LOCATION. 设置测试的spring配置
     */
    private static final String CONTEXT_LOCATION = "test.xml";/**   这个很重要  **/
    
    @Override
    protected String[] getContextLocations() {
        // TODO Auto-generated method stub
        return new String[] {CONTEXT_LOCATION};
    }
    /**
    * @Description: TODO
    * @param sessionFactory
    *     the session factory.
    * @return Session
    * @throws
     */
    @SuppressWarnings("deprecation")
    protected Session getSession(SessionFactory sessionFactory){
        Session session = SessionFactoryUtils.getSession(sessionFactory, true);
        FlushMode flushMode = FlushMode.NEVER;
        if(null != flushMode){
            session.setFlushMode(flushMode);
        }
        return session;
    }
    /**
    * @Description: TODO
    * @param request
    *           the http request.
    * @return SessionFactory
     */
    protected SessionFactory lookupSessionFactory(HttpServletRequest request){
        return (SessionFactory) this.applicationContext.getBean("sessionFactory");
    }

    
    /**
    * @Description: 重载setUp函数,解决(hibernate+spring)jpa的lazy延迟加载问题
    * @throws Exception
    *    java.lang.Exception.
     */
    @Override
    protected void setUp() throws Exception {
        // TODO Auto-generated method stub
        super.setUp();
        SessionFactory sessionFactory = this.lookupSessionFactory(request);
        Session hibernateSession = this.getSession(sessionFactory);
        TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibernateSession));
    }
    
}


3、接着是action test(有很多junit4的新特性和方便的地方由于整合的一些问题,没有体现出来,会在日后进行更新,让它更加完善)

package com.main.test.testcase;

import org.junit.Test;

import com.opensymphony.xwork2.ActionProxy;
import com.scorpion.test.util.BaseTestCase;

/**
 * @author ZJ
 * @作用 测试登录
 * @创建日期 2013-9-29下午07:51:17
 * @修改人 
 * @修改日期 
 * @修改内容 TODO
 * @version V1.0
 */
public class LoginActionTest extends BaseTestCase{

    /**
     * @Field ACTION_NAME.
     */
    private static final String ACTION_NAME = "userLogin.action";

    /**
    * @Description: 测试execute函数内的逻辑代码
     */
    @Test
    public void testExecuteParams() {
        try {
//          request paramter's data not in database
        request.setParameter("uName", "12");
        request.setParameter("pwd", "11");
        ActionProxy proxy = this.getActionProxy(ACTION_NAME);
        String result = proxy.execute();
        assertEquals("error",result);
        
//      request paramter's data is invalid.
        request.setParameter("uName", "");
        ActionProxy proxy1 = this.getActionProxy(ACTION_NAME);
        String result1 = proxy1.execute();
        assertEquals("error",result1);
        
//        request paramter's data in database
        request.setParameter("uName", "bb");
        request.setParameter("pwd", "aa");
        ActionProxy proxy2 = this.getActionProxy(ACTION_NAME);
        String result2 = proxy2.execute();
        assertEquals("success",result2);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }

}

4、为了解决jpa的延迟加载问题,需要在web.xml增加


    
    opensession
    
        org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    
    
    singleSession
    true
    
    
    sessionFactoryBeanName
    sessionFactory
    
    

5、spring链接数据库部分是在2中有谈到的test.xml文档,其里面的内容


    


    
    
    
    

    
    
    
    
    
    classpath*:application.properties
    
    
    
    
    
    
    
    
    
    
    
    
        
    

    
    
    
        
        
            
            
                ${hibernate.dialect}
                ${hibernate.show_sql}
                ${hibernate.format_sql}
            
        
        
        
        
        
    

    
    
    
    
        
    
    
    
    
    
        
        
            
            
            
            
            
            
        
    

    
         
         
         
         
    
    

以上就是一个完整的testcase的配置和junit代码编写,为了方便管理test case,还可以写test suite

package com.main.test.testsuite;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

import com.main.test.testcase.LoginActionTest;

/**
 * @author ZJ
 * @作用 用户管理模块的所有test case的集合
 * @创建日期 2013-9-30下午03:32:30
 * @修改人 
 * @修改日期 
 * @修改内容 TODO
 * @version V1.0
 */
@RunWith(Suite.class)
@SuiteClasses({LoginActionTest.class})
public class UserTestSuite {
}


二、对spring service impl的测试

1、需要的jar包:

junit-4.11、spring-test

2、编写继承AbstractTransactionalJUnit4SpringContextTests类的公共类,注意@ContextConfiguration(locations = {"classpath:test.xml"})的配置,链接数据库用的

package com.scorpion.test.util;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;

/**
 * @author ZJ
 * @作用 junit4对spring的单元测试公共测试类,@ContextConfiguration读取spring的配置
 * @创建日期 2013-10-11下午06:43:24
 * @修改人 
 * @修改日期 
 * @修改内容 TODO
 * @version V1.0
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:test.xml"})
@TransactionConfiguration(defaultRollback = true)
public class SpringBaseTestCase extends
        AbstractTransactionalJUnit4SpringContextTests {

}

3、测试类继承公共类

package com.main.test.testcase.service;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.sql.Timestamp;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.main.entity.User;
import com.main.service.UserService;
import com.scorpion.test.util.SpringBaseTestCase;

/**
 * @author ZJ
 * @作用 为service编辑test case
 * @创建日期 2013-10-11下午05:58:06
 * @修改人 
 * @修改日期 
 * @修改内容 TODO
 * @version V1.0
 */
public class UserServiceImplTest extends SpringBaseTestCase{
    
    /**
     * @Field userService.
     */
    @Autowired
    private UserService userService;

    /**
    * @Description: 初始化测试环境
    * @throws Exception
    * java.lang.exception.
     */
    @Before
    public void setUp() throws Exception {
    }

    /**
    * @Description: 测试完后清理现场
    * @throws Exception
    * java.lang.exception.
     */
    @After
    public void tearDown() throws Exception {
    }
    
    /**
    * @Description: 增加用户到数据库
     */
    @Test
    public void saveUser(){
        User user = new User();
        user.setuName("zhongjie");
        user.setPwd("123456");
        user.setCreateTime(new Timestamp(System.currentTimeMillis()));
        userService.addUser(user);
    }
    
    /**
    * @Description: 根据用户名查找用户
     */
    @Test
    public void getUserByName(){
        User user = new User();
        user.setuName("zhongjie");
        user.setPwd("123456");
        user.setCreateTime(new Timestamp(System.currentTimeMillis()));
        userService.addUser(user);
        
        User gUser = userService.getUser(user.getuName());
        assertNotNull(gUser);
        assertEquals(user.getPwd(),gUser.getPwd());
    }

}


  总结:StrutsSpringTestCase这种针对struts、spring做测试的,相对适合ssh架构,但其有一点需要注意的地方,就是对spring的配置是直接操作数据库的,所以在做一些增删改的测试时,需要增加rollback,或是为测试准备一个跟正式环境一样运行的数据库,以模拟测试。(个人认为这一点很不好,也不方便)目前为止,还没有找到像ejbunit那样,使用excel文档来模拟生成数据库进而对其进行数据操作的方法,这一点会继续跟进。




你可能感兴趣的:(ssh,test,java,web,junit4)