1. 程式人生 > >在JUnit中多個testCase只執行一次setup和tearDown的方法

在JUnit中多個testCase只執行一次setup和tearDown的方法

這個問題出現在這種情況,你的每個testCase都需要使用某一種初始化比較耗時的物件(資源),舉例如資料庫連線、Spring Context。我們遇到的問題是Selenium測試中開啟和關閉瀏覽器,如果一個test啟動關閉(我們的程式還需要登入和登出),這樣測試的時間會拖的很長,給持續整合帶來了困難。
所以,我們需要在每組不會衝突的test中間共享一個瀏覽器視窗,這樣也就需要一個全域性的setUp和tearDown。問題是JUnit 3.8.1裡面的setUp和tearDown是在每個test之前和之後執行的,如果在裡面初始化和關閉瀏覽器就會造成上面所說的問題。要解決它,就產生了如下3種思路:
1、升級,使用JUnit4
JUnit4從TestNG裡面吸取了兩個註釋:@BeforeClass和@AfterClass
用它們註釋過的方法就會只初始化一次,完全符合我們的需求。
ExpandedBlockStart.gifpublicclass SeleniumTestCase extends SeleneseTestCase4 {
InBlock.gif
InBlock.gif    
protected
staticfinal Log log = LogFactory.getLog(SeleniumTestCase.class);
InBlock.gif    
protectedstatic Selenium selenium =null;
InBlock.gif
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * 包含了登入的程式碼,保證在一個測試內部只執行一次開啟瀏覽器並登入操作
InBlock.gif     * 
@throws Exception
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    @BeforeClass
ExpandedSubBlockStart.gif    
publicstaticvoid startSelenium() throws Exception {
InBlock.gif        log.debug(
"Starting Seleniumdot.gif");
InBlock.gif        selenium 
= SeleniumSession.getCurrentSession().getSelenium();
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gif    
/**
InBlock.gif     * 在該類包含的所有測試結束之後關閉瀏覽器
InBlock.gif     * 
@throws Exception
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    @AfterClass
ExpandedSubBlockStart.gif    
publicstaticvoid stopSelenium() throws Exception {
InBlock.gif        log.debug(
"Stoping Seleniumdot.gif");
InBlock.gif        selenium.stop();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
這個裡面的selenium = SeleniumSession.getCurrentSession().getSelenium();其實是個singleton,第一次open new,後來就直接返回selenium的instance(具體參考其它文章)。
這樣做非常舒服,因為完全不是Trick,而是新的feature,用起來踏實。這樣,這個類的所有@Test就會公用一個selenium開啟的瀏覽器了。
那麼缺點是什麼呢?缺點是放到CI環境的時候如果使用我們習慣的Ant寫執行指令碼的話必須將Ant升級到1.7Beta3,因為Ant 1.6.5的Junit task不支援JUnit4……當然升級並不會帶來程式碼的變化,但是問題在於Ant 1.7還是Beta,而且JUnit4需要JDK5的Annotation,你的PM估計要撇嘴了74_74.gif


2、JVM級別鉤子法
因為JVM支援關閉時執行制定程式碼的鉤子,而static程式碼會在類初始化時執行,再加上Ant呼叫的是類似命令列的java命令,實際上每一個測試執行在一個完整的JVM啟動關閉週期裡面,所以也就產生了這種解決方案。
這個方案來自taowen同學的兩則Selenium經驗
程式碼我恢復了一下,大概是這樣:
publicabstractclass SomeTestCase extends TestCase {

  
static {
    
// perform the "global" set up logic
    
//這裡的程式碼會在類初始化時執行,所以相當於BeforeClass    log.debug("Starting Seleniumdot.gif");
        selenium 
= SeleniumSession.getCurrentSession().getSelenium();

    
// and now register the shutdown hook for tear down logic
    
//將一個匿名方法寫到這裡,就相當於AfterClass    Runtime.getRuntime().addShutdownHook(
      
new Thread(){
          
publicvoid run() {
             log.debug(
"Stoping Seleniumdot.gif");
             selenium.stop();
           }
       }
     );
  }

}

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

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

publicclass AllTestsOneTimeSetup {

    
publicstatic Test suite() {

        TestSuite suite 
=new TestSuite();

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

        TestSetup wrapper 
=new TestSetup(suite) {

            
protectedvoid setUp() {
                oneTimeSetUp();
            }

            
protectedvoid tearDown() {
                oneTimeTearDown();
            }
        };

        
return wrapper;
    }

    
publicstaticvoid oneTimeSetUp() {
        
// one-time initialization code    }

    
publicstaticvoid oneTimeTearDown() {
        
// one-time cleanup code    }
}


相關推薦

JUnittestCase執行setuptearDown方法

這個問題出現在這種情況,你的每個testCase都需要使用某一種初始化比較耗時的物件(資源),舉例如資料庫連線、Spring Context。我們遇到的問題是Selenium測試中開啟和關閉瀏覽器,如果一個test啟動關閉(我們的程式還需要登入和登出),這樣測試的時間會拖的很

關於解決接收相同條件,如何執行if條件語句的簡單問題

  public class FacesSet { private static FacesSet instance = null; private Set<String> faceNames = new HashSet<String>();

如何讓python unittest.TestCase的類下的setUptearDown執行

轉自:https://www.cnblogs.com/UncleYong/p/7076872.html 知道unittest單元測試框架的朋友應該都知道, 執行繼承了unittest.TestCase的類下每個test開頭的方法(就是用例)時,都會執行setUp和tearDown,如下面的例

在一個字串找到出現的第一字元

        1. 看到題目,我首先想到的第一種方法是:簡單粗暴的搜尋,從頭到尾遍歷每個字元,看它的前後是不是有與之相等的字元(不包括本身),如果有那麼就繼續下一個字元,如果沒有就輸出該字元(這裡需要注意的是,有的人寫出來的演算法,沒有考慮到最後一個字元

scrapy框架spider同時執行:scrapyd的部署及使用

scrapy是一個爬蟲框架,而scrapyd是一個網頁版管理scrapy的工具,scrapy爬蟲寫好後,可以使用命令執行,但是如果能夠在網頁上操作就比較方便。scrapyd就是為了解決這個問題,能夠在網頁端檢視正在執行的任務,也能新建和終止爬蟲任務,功能比較強大。 Scrapyd使用詳解

個數組,除了有兩數字出現外,其他數字都出現兩,求出這兩出現的數字

求出兩個只出現一次的數字 首先,我們知道兩個相同的數字進行異或操作時為0,如果題目裡面只有一個數字出現一次的話,我們就可以直接對陣列中的所有數字進行異或操作,最後得到的數字就是單獨出現的那個數字,但

一個整數陣列,有兩元素出現,其他所有元素均出現兩。 找出出現的那兩元素。(java實現)

一個整數陣列中,有兩個元素只出現一次,其他所有元素均出現兩次。 找出只出現一次的那兩個元素。 思路大概是這樣的:因為除了這兩個只出現一次的數字外,其餘都是成對出現的,有一種運算子,異或運算,兩個相同的數字異或之後為0,所以將陣列中所有的數字依次異或,結果就是這個兩個支出現一

執行的事件one(“事件名”,function(){}) 執行的事件bind(“事件名”,function(){})

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xh

自學-ShiroRealms的另外種配置方式-11

前幾節中專案中的Realms都是這樣配置的,現在有一個其他的配置方法也是很好,首先先和之前的配置做個對比: 之前的: <!--多個realm的配置--> <bean id=

js 觸發點選事件,在一定延遲內執行

$(function(){ var timeoutflag = null; $('#inputAddress1').click(function() { if(t

once方法實現(函數執行)

{} bsp turn pro fault nts color this prot var once = (function(){ var memo = {},i = 0; return function(fn){ for(var k in

[轉]使用互斥物件讓程式執行(delphi)

使用互斥物件讓程式只執行一次“怎麼讓我的程式在執行時不能重複開啟?”經常在論壇上看到有朋友問這方面的問題。本文將比較詳細的說明這一問題,並給出一個較為完善的解決方案。 儘管這已經不是一個新問題了,但這裡還是簡要的說明一下這種技術:這的確是一個相當有用的技術,可能你經常會注意到相當多的程式在執行之後當你再次點

關於 C#呼叫C庫Dll,有回撥函式時,執行回撥函式就直接掛掉 的解決方法

錯誤         直接當機,如下圖:           錯誤原因        回撥函式宣告原因,跟堆疊有關係  

pt-heartbeat --update --daemonize 執行秒退的問題

you 參數 程序退出 sam remove exitcode working previous wan 使用pt-heartbeat幫助測試MySQL從庫delay時長- 第一次運行測試成功,運行順暢。 過幾天再次用--update測試時,發現pt-heartbeat只u

innerHTML在for迴圈裡“執行”的問題(本人小白枚)

今天在w3school裡系統學習JS的知識時,看到一個TIY,原本程式碼如下:  <!DOCTYPE html> <html> <body> <p>點選下面的按鈕,將程式碼塊迴圈五次:</p> <butto

重複的資料處理,並執行

​​​​​平時程式設計師在獲取資料時,經常會遇到獲取到一堆相同的資料,而且一直在重複的執行同一條程式碼;這時我們都會試著插入判斷條件來控制執行程式碼,通過判斷來篩選(重複的資料只執行一次) 比如:in

一個執行的once函式

 一個只執行一次的函式(最優解在下面) function once(func) { var ran, result; if (!isFunction(func)) { throw new TypeError(funcErro

陣列有三個數出現,其它的數恰好出現兩,找出這三個數。

具體的題意如題 當我第一次碰到這類題的時候是宿舍的舍友分享的,當時他說的問題還要簡單一些,具體的題意是"陣列中只有一個數只出現一次,其它的數恰好出現兩次,找出這個數。"  當時我的第一感覺就是要用到快排,因此得出第一種演算法,將陣列進行快排的第一層排序,然後從中間分開,數字

陣列數字出現了,其餘的出現了兩

從頭到尾依次異或陣列中的每一個數字,那麼最終得到的結果就是兩個只出現一次的數字的異或結果。因為其他數字都出現了兩次,在異或中全部抵消掉了。由於這兩個數字肯定不一樣,那麼這個異或結果肯定不為0,也就是說在這個結果數字的二進位制表示中至少就有一位為1。我們在結果數字中找到第一個為1的位的位置,記為第N位

loadrunner如何設定所有虛擬使用者執行指令碼?

1,設定所有虛擬使用者只執行一次指令碼 進入場景conroller,如下圖設定。初始化和啟動Vuser設定都可以,看具體要求,但持續時間一定要選擇“完成前一直執行”,這樣設定就可以讓所有Vuser只執行一次指令碼。 2,設定所有虛擬使用者同一時刻執行指令碼且只執行一次 當然,虛擬使