1. 程式人生 > >Junit學習筆記1

Junit學習筆記1

package com.gdnt.rnd.ework.servlet;

import org.apache.log4j.Logger;

import java.io.IOException; import java.io.File; import java.util.Enumeration;

import javax.servlet.ServletException; import javax.servlet.http.HttpSession;

import junit.textui.TestRunner;

import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import com.gdnt.rnd.config.TestPropertyManager; import com.kenoah.base.action.Action; import com.meterware.servletunit.ServletRunner; import com.meterware.servletunit.ServletUnitClient; import com.meterware.servletunit.InvocationContext; import com.meterware.httpunit.HttpUnitOptions; import com.meterware.httpunit.WebClient; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; import com.meterware.httpunit.PostMethodWebRequest;

import org.xml.sax.SAXException;

public class GoHomeTest extends TestCase //在編寫一個單元測試類的時候要繼承junit.framework.TestCase; {  static  {   TestPropertyManager.init();//這個是載入一些配置檔案,需要自己寫的,方法程式碼附後面  }

 private static final Logger logger = Logger.getLogger(GoHomeTest.class);//日誌記錄

 public static void main(String[] args)  {   TestRunner.run(GoHomeTest.class);//這個就可以當作普通的工程來執行,不用特意去用JUNIT運行了  }

 public static Test suite()  {   TestSuite suite = new TestSuite(GoHomeTest.class);//有這個才能作為Test,原因暫不明   return suite;  }

 protected void setUp() throws Exception  {   super.setUp();  }

 protected void tearDown() throws Exception  {   super.tearDown();  }

 public void testGoHomeOK()//JUNIT或HttpUnit如果需要執行,所測試方法的名稱都要在前面加上test否則和缺少suite方法一樣,說不是No Test in..  {   HttpUnitOptions.setExceptionsThrownOnScriptError(false);//如果需要用到頁面,可以遮蔽頁面本身的Script錯誤.   try   {    ServletRunner runner = new ServletRunner(new File(      "web/WEB-INF/web.xml"), "/eform");//啟動容易,指定使用的配置檔案和URL路徑    ServletUnitClient client = runner.newClient();//產生客戶端    ClsUlity clsUlity = new ClsUlity();//自己寫的類    WebResponse responseLogin = clsUlity.Login("webmaster", "", client);    this.updateCookie(client, responseLogin);//這個部分是登入,因為後面要驗證,這個工程是更新cookie.        WebRequest requestGoHome = new PostMethodWebRequest(      "

http://localhost/eform/GoHome.action");    InvocationContext contextGoHome = client      .newInvocation(requestGoHome);    contextGoHome.pushFilter(contextGoHome.getRequest(), contextGoHome      .getResponse());    HttpSession sessionGoHome = client.getSession(true);//獲取所測試的Servlet的session物件    sessionGoHome.setAttribute("user", "pp");//在session裡放東西,前面是key,後面是value    Enumeration enumGoHomeSession = sessionGoHome.getAttributeNames();//拿出session裡面所有的東西名稱,就是key    while(enumGoHomeSession.hasMoreElements()){     String name = (String)enumGoHomeSession.nextElement();     System.out.println(name);    }        Object usernameValue =sessionGoHome.getAttribute("user");//拿出指定的session中user名稱的值    System.out.println(usernameValue);//列印值    ServletController servlet = (ServletController) contextGoHome      .getServlet();    Action actionGoHome = servlet.getAction(contextGoHome.getRequest(),      contextGoHome.getResponse());    try    {     String actionResultGoHome = actionGoHome.execute();     assertEquals("Login failed!","success",actionResultGoHome);    }    catch (Exception exObj)    {     logger.error("testGoHomeOK()-Exception:",exObj);     fail("testGoHomeOK()-Exception:"+exObj.getMessage());    }   }   catch (IOException exObj)   {    logger.error("testGoHomeOK()-IOException:", exObj);    fail("testGoHomeOK()-IOException:"+exObj.getMessage());   }   catch (SAXException exObj)   {    logger.error("testGoHomeOK()-SAXException:", exObj);    fail("testGoHomeOK()-SAXException:"+exObj.getMessage());   }   catch (ServletException exObj)   {    logger.error("testGoHomeOK()-ServletException", exObj);    fail("testGoHomeOK()-ServletException:"+exObj.getMessage());   }  }

 private void updateCookie(WebClient webClient, WebResponse webResponse)  {   String[] names = webResponse.getNewCookieNames();   for (int i = 0; i < names.length; i++)   {    webClient.putCookie(names[i], webResponse      .getNewCookieValue(names[i]));   }  } }

心得: 關於junit或httpunit的測試工程: 需要有suite()方法測試方法名字前面必須有test字首需要繼承junit.framework.TestCase

關於Servlet的session: 獲取session:通過ServletUnitClient的getSession方法,可以拿到HttpSession型別的session物件設定session內容:通過HttpSession的setAttribute(name,value)可以設定session裡面的內容獲取session內容:通過HttpSession的返回Object型別資料的getAttribute(name)可以設定session裡面的內容,注:有個返回String型別的getValue(name)也可以,但是已註明過時. 關閉session:當用完session後,可以使用HttpSession.invalidate()方法關閉session。但是這並不是嚴格要求的。因為,Servlet引擎在一段時間之後,自動關閉seesion。