<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Tin's Blog

    You are coming a long way, baby~Thinking, feeling, memory...

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks
    這個問題出現(xiàn)在這種情況,你的每個testCase都需要使用某一種初始化比較耗時的對象(資源),舉例如數(shù)據(jù)庫連接、Spring Context。我們遇到的問題是Selenium測試中開啟和關(guān)閉瀏覽器,如果一個test啟動關(guān)閉(我們的程序還需要登錄和注銷),這樣測試的時間會拖的很長,給持續(xù)集成帶來了困難。
    所以,我們需要在每組不會沖突的test中間共享一個瀏覽器窗口,這樣也就需要一個全局的setUp和tearDown。問題是JUnit 3.8.1里面的setUp和tearDown是在每個test之前和之后運行的,如果在里面初始化和關(guān)閉瀏覽器就會造成上面所說的問題。要解決它,就產(chǎn)生了如下3種思路:
    1、升級,使用JUnit4
    JUnit4從TestNG里面吸取了兩個注釋:@BeforeClass和@AfterClass
    用它們注釋過的方法就會只初始化一次,完全符合我們的需求。
    public?class?SeleniumTestCase?extends?SeleneseTestCase4?{

    ????
    protected?static?final?Log?log?=?LogFactory.getLog(SeleniumTestCase.class);
    ????
    protected?static?Selenium?selenium?=?null;

    ????
    /**
    ?????*?包含了登錄的代碼,保證在一個測試內(nèi)部只執(zhí)行一次開啟瀏覽器并登錄操作
    ?????*?
    @throws?Exception
    ?????
    */

    ????@BeforeClass
    ????
    public?static?void?startSelenium()?throws?Exception?{
    ????????log.debug(
    "Starting?Selenium");
    ????????selenium?
    =?SeleniumSession.getCurrentSession().getSelenium();
    ????}


    ????
    /**
    ?????*?在該類包含的所有測試結(jié)束之后關(guān)閉瀏覽器
    ?????*?
    @throws?Exception
    ?????
    */

    ????@AfterClass
    ????
    public?static?void?stopSelenium()?throws?Exception?{
    ????????log.debug(
    "Stoping?Selenium");
    ????????selenium.stop();
    ????}

    }
    這個里面的selenium = SeleniumSession.getCurrentSession().getSelenium();其實是個singleton,第一次open new,后來就直接返回selenium的instance(具體參考其它文章)。
    這樣做非常舒服,因為完全不是Trick,而是新的feature,用起來踏實。這樣,這個類的所有@Test就會公用一個selenium打開的瀏覽器了。
    那么缺點是什么呢?缺點是放到CI環(huán)境的時候如果使用我們習(xí)慣的Ant寫執(zhí)行腳本的話必須將Ant升級到1.7Beta3,因為Ant 1.6.5的Junit task不支持JUnit4……當(dāng)然升級并不會帶來代碼的變化,但是問題在于Ant 1.7還是Beta,而且JUnit4需要JDK5的Annotation,你的PM估計要撇嘴了

    2、JVM級別鉤子法
    因為JVM支持關(guān)閉時執(zhí)行制定代碼的鉤子,而static代碼會在類初始化時執(zhí)行,再加上Ant調(diào)用的是類似命令行的java命令,實際上每一個測試運行在一個完整的JVM啟動關(guān)閉周期里面,所以也就產(chǎn)生了這種解決方案。
    這個方案來自taowen同學(xué)的兩則Selenium經(jīng)驗
    代碼我恢復(fù)了一下,大概是這樣:
    public?abstract?class?SomeTestCase?extends?TestCase?{

    ??
    static?{
    ????
    //?perform?the?"global"?set?up?logic
    ????
    //這里的代碼會在類初始化時執(zhí)行,所以相當(dāng)于BeforeClass
    ????log.debug("Starting?Selenium");
    ????????selenium?
    =?SeleniumSession.getCurrentSession().getSelenium();

    ????
    //?and?now?register?the?shutdown?hook?for?tear?down?logic
    ????
    //將一個匿名方法寫到這里,就相當(dāng)于AfterClass
    ????Runtime.getRuntime().addShutdownHook(
    ??????
    new?Thread(){
    ??????????
    public?void?run()?{
    ???????????? log.debug(
    "Stoping?Selenium");
    ???????????? selenium.stop();
    ?????????? }
    ?????? }
    ???? );
    ??}

    }

    這個方法挺酷的,我認(rèn)為完全可以被稱作“奇技淫巧”。缺點就是,有點不好看。

    3、還有別的方法,這個來自Selenium網(wǎng)站,似乎是不錯的中庸方案。
    import?junit.framework.*;
    import?junit.extensions.TestSetup;

    public?class?AllTestsOneTimeSetup?{

    ????
    public?static?Test?suite()?{

    ????????TestSuite?suite?
    =?new?TestSuite();

    ????????suite.addTest(SomeTest.suite());
    ????????suite.addTest(AnotherTest.suite());

    ????????TestSetup?wrapper?
    =?new?TestSetup(suite)?{

    ????????????
    protected?void?setUp()?{
    ????????????????oneTimeSetUp();
    ????????????}

    ????????????
    protected?void?tearDown()?{
    ????????????????oneTimeTearDown();
    ????????????}
    ????????};

    ????????
    return?wrapper;
    ????}

    ????
    public?static?void?oneTimeSetUp()?{
    ????????
    //?one-time?initialization?code
    ????}

    ????
    public?static?void?oneTimeTearDown()?{
    ????????
    //?one-time?cleanup?code
    ????}
    }


    這個好像是比較正統(tǒng)的方案,不好意思我并沒有試驗,但是看起來這的確可能是限定用JDK 1.4或JUnit 3.8.1的最佳解決方案。歡迎嘗試。相關(guān)的連接參考這里:http://www.cs.wm.edu/~noonan/junit/doc/faq/faq.htm#organize_3?

    posted on 2006-11-17 17:29 Tin 閱讀(13550) 評論(1)  編輯  收藏 所屬分類: 開源

    評論

    # re: 在JUnit中多個testCase只執(zhí)行一次setup和tearDown的方法 2006-11-28 16:58 coolfish
    我前兩天也恰好遇到這樣的問題,竟然以前不知道setUp() 和 tearDown()對每個test*方法運行一次.汗. 我是用類似第三種解決方法,手工寫靜態(tài)的suite()方法組織testcase  回復(fù)  更多評論
      

    主站蜘蛛池模板: 久久er国产精品免费观看8| 精品无码免费专区毛片| 久久久久久a亚洲欧洲AV| 99精品视频在线观看免费播放| 亚洲人成网男女大片在线播放| 国产成人免费片在线视频观看| 国产免费一区二区三区免费视频| 亚洲一区二区中文| 国产精品免费视频一区| 免费播放在线日本感人片| 亚洲最大中文字幕无码网站| 激情综合色五月丁香六月亚洲| 97免费人妻无码视频| eeuss在线兵区免费观看| 亚洲午夜电影在线观看| 国产亚洲AV手机在线观看| 国产99视频精品免费观看7| 久久www免费人成精品香蕉| 亚洲va在线va天堂成人| 亚洲欧洲自拍拍偷午夜色无码| 欧美a级在线现免费观看| 三级黄色免费观看| 亚洲aⅴ天堂av天堂无码麻豆| 亚洲男人都懂得羞羞网站| 免费在线观看黄网| 91嫩草国产在线观看免费| 免费无码又爽又刺激一高潮| 亚洲av乱码一区二区三区按摩| 一区二区三区亚洲| 国外亚洲成AV人片在线观看| 老司机永久免费网站在线观看| 999任你躁在线精品免费不卡| 成年网在线观看免费观看网址| 亚洲xxxx视频| 亚洲精品中文字幕无乱码| 亚洲日本va中文字幕久久| 免费一级一片一毛片| 午夜寂寞在线一级观看免费| 亚洲w码欧洲s码免费| 久久精品免费视频观看| 久久久久久久久久久免费精品|