您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > junit
基于Junit2.0的StrutsTestCase應(yīng)用
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/3/8 15:59:09 ] 推薦標(biāo)簽:

在我的前一篇文檔《測(cè)試驅(qū)動(dòng)的開發(fā)是重要的》中說過我要寫一些測(cè)試框架應(yīng)用方面的文檔,我要實(shí)現(xiàn)我的諾言之一,這篇文章是介紹StrutsTeseCase的,熟悉并采用struts的開發(fā)員曾經(jīng)一定有過這樣一個(gè)困擾:我的action如何進(jìn)行測(cè)試?(不是說要“測(cè)試先行”么?),如果沒有一個(gè)可行的測(cè)試框架那我的struts環(huán)境去哪里模擬(方便的、透明的去模擬)?不要著急,接下來的部分我要向你們介紹這樣一種可以滿足我們要求的測(cè)試框架:strutstestcae。

                                                                        ——寫在前面

主要內(nèi)容介紹:

1.  StrutsTeseCase是什么?

2.  它的“家”在哪里?

3.  如何讓它來為我們工作?(伴隨說明:我到底該實(shí)施“測(cè)試先行”?)

4.  兼容struts1.1開發(fā)員

5.  參考資源

“由于在這里沒有牽涉到Struts以及Junit入門的知識(shí),所以我假定這篇文章的讀者都是有struts開發(fā)經(jīng)驗(yàn)的開發(fā)員并熟悉Junit。”

第一部分:StrutsTestCase是什么?

StrutsTestCase是基于Junit的一個(gè)方便測(cè)試struts框架的測(cè)試框架。它提供模擬對(duì)象(Mock Object)和Cactus兩種方式來“真實(shí)”的運(yùn)行Struts ActionServlet,它允許你在不啟動(dòng)servlet 引擎的情況下測(cè)試你的struts代碼。因?yàn)閟trutstestcase可以用ActionServlet來測(cè)試你的代碼,所以它不光可以測(cè)試你的action,同時(shí)它也可以測(cè)試你的(容器中的?)mapping,frombeans以及forwards聲明。我前面曾提到過它對(duì)我們開發(fā)員來說是“透明的”,因?yàn)橄骯ction,mapping,form beans 以及forward等等,我們真的可以象在常規(guī)的XXXAction中一樣在我們的測(cè)試代碼中隨意的使用它們。

在新的版本中它還提供了對(duì)tiles和多模塊(struts1.1中的功能)的測(cè)試。

哇,是不是很奇妙,不要著急,我們很快可以領(lǐng)略到的它的妙處。

第二部分:它的“家”在哪里?

象許許多多的開源項(xiàng)目一樣,StrutsTestCase的家也在“sourceforge.org”(我們偉大的sourceforge象一個(gè)繁忙的峰槽一樣J),你可以通過http://sourceforge.net/project/showfiles.php?group_id=39190來下載它得新版本。

JavaDoc: http://strutstestcase.sourceforge.net/api/index.html

熱點(diǎn)論壇:http://sourceforge.net/forum/forum.php?forum_id=121751

常見問題:http://strutstestcase.sourceforge.net/faq.htm

第二部分:如何讓它來為我們工作?

“模仿測(cè)試(Mock Testing)VS 容器內(nèi)測(cè)試(In-Container Testing)”

通常測(cè)試服務(wù)器端代碼有兩種比較常用的測(cè)試方法:

模仿對(duì)象(mock objects)它通過假設(shè)服務(wù)器端容器來達(dá)到測(cè)試效果;

容器內(nèi)測(cè)試(in-container testing),它則是在真實(shí)的容器內(nèi)達(dá)到測(cè)試效果;

而我們的StrutsTestCase則在對(duì)你的測(cè)試代碼小影響下能分別扮演上邊兩種角色。因此我們不得不說到它的這兩種實(shí)現(xiàn)是如何完成的?

StrutsTestCase提供兩種基類(他們分別繼承標(biāo)準(zhǔn)的Junit TestCase):

MockStrutsTestCase:

通過名字也可以知道他是通過第一中方法在不啟動(dòng)servlet的條件下來模仿一些HttpServlet實(shí)現(xiàn)假設(shè)容器環(huán)境的。

CactusStrutsTestCase:

它是體現(xiàn)在容器內(nèi)測(cè)試(真實(shí)環(huán)境測(cè)試)的,其通過另外一種測(cè)試框架(Cactus testing framework:http://jakarta.apache.org/cactus)struts代碼。

Ps:本文中牽涉的代碼都是通過第一中方法(繼承MockStrutsTestCase)來完成測(cè)試的,要想用CactusStrutsTeseCase你只要簡(jiǎn)單的讓測(cè)試代碼繼承CactusStrutsTeseCase即可。

下面我們著重講解MockStrutsTestCase是為我們工作的?

首先我們先看看一個(gè)簡(jiǎn)單的LoginAction的簡(jiǎn)化代碼:

public class LoginAction extends Action {

    public ActionForward perform(ActionMapping mapping,

                                 ActionForm form,

                                 HttpServletRequest request,

                                 HttpServletResponse response)

    {

        String username = ((LoginForm) form).getUsername();

        String password = ((LoginForm) form).getPassword();

        ActionErrors errors = new ActionErrors();

        if ((!username.equals("Jplateau")) || (!password.equals("sandy")))

            errors.add("password",new ActionError("error.password.mismatch"));

        if (!errors.empty()) {

            saveErrors(request,errors);

            return mapping.findForward("login");

        }

        // store authentication info on the session

        HttpSession session = request.getSession();

        session.setAttribute("authentication", username);

        // Forward control to the specified suclearcase/" target="_blank" >ccess URI

        return mapping.findForward("success");

}

上邊LoginAction完成一個(gè)簡(jiǎn)單的登陸意圖,從client搜集登陸數(shù)據(jù)(用戶名和密碼),然后做一個(gè)驗(yàn)證,如果驗(yàn)證有誤返回登陸頁;如果登陸成功返回成功頁(或業(yè)務(wù)工作平臺(tái))并把用戶姓名放入session。

那我們從上邊這個(gè)簡(jiǎn)單的程序入手:

首先,我們應(yīng)該創(chuàng)建一個(gè)測(cè)試用例TestLoginAction,其基本架子是這樣的:

(請(qǐng)記住此時(shí)上邊LoginAction的代碼你還沒有寫,并且struts_config.xml中的關(guān)于LoginAction的actionmapping也是沒有的,這些東西我們要經(jīng)過邊測(cè)試邊寫,但一定是先寫測(cè)試,天啊,什么都還沒有我該怎樣測(cè)試啊,不要急,且看下去,J)

public class TestLoginAction extends MockStrutsTestCase {

    public void setUp() { super.setUp(); }

    public void tearDown() { super.tearDown(); }

    public TestLoginAction(String testName) { super(testName); }

    public void testSuccessfulLogin() {}

}

上一頁12下一頁
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd