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

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

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

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


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

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

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

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

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

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

    }

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

    3、還有別的方法,這個(gè)來(lái)自Selenium網(wǎng)站,似乎是不錯(cuò)的中庸方案。
    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
    ????}
    }


    這個(gè)好像是比較正統(tǒng)的方案,不好意思我并沒(méi)有試驗(yàn),但是看起來(lái)這的確可能是限定用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 閱讀(13558) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): 開(kāi)源

    評(píng)論

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

    主站蜘蛛池模板: 久久精品国产精品亚洲下载| 99re在线视频免费观看| 在线免费观看国产视频| 亚洲宅男精品一区在线观看| 91高清免费国产自产| 亚洲视频在线观看一区| 久久免费区一区二区三波多野| 亚洲大尺度无码无码专区| 青青青国产手机频在线免费观看| 久久久亚洲精品国产| 人妻丰满熟妇无码区免费| 亚洲精品福利在线观看| 久久久久久国产a免费观看黄色大片 | 免费高清在线爱做视频| 亚洲午夜理论片在线观看| 日本一道高清不卡免费| 成人免费观看男女羞羞视频| 亚洲中文字幕在线乱码| 免费国产黄网站在线观看可以下载| 亚洲精品欧洲精品| 毛片免费在线观看网站| 免费一级毛片在线播放放视频| 久久国产成人精品国产成人亚洲| 中文成人久久久久影院免费观看| 一区二区三区亚洲| 在线观看免费宅男视频| 精品一区二区三区免费视频| 亚洲国产精品自在线一区二区 | 亚洲一级二级三级不卡| 精品久久久久成人码免费动漫| 亚洲精品天堂无码中文字幕| 亚洲人成色7777在线观看不卡 | 四虎永久免费地址在线观看| 好吊色永久免费视频大全| 亚洲第一二三四区| 国产乱子伦片免费观看中字| 日本人成在线视频免费播放| 亚洲综合色一区二区三区| 在线亚洲午夜理论AV大片| 免费观看的毛片大全| 一级毛片aa高清免费观看|