在JUnit中多個testCase只執行一次setup和tearDown的方法
所以,我們需要在每組不會衝突的test中間共享一個瀏覽器視窗,這樣也就需要一個全域性的setUp和tearDown。問題是JUnit 3.8.1裡面的setUp和tearDown是在每個test之前和之後執行的,如果在裡面初始化和關閉瀏覽器就會造成上面所說的問題。要解決它,就產生了如下3種思路:
1、升級,使用JUnit4
JUnit4從TestNG裡面吸取了兩個註釋:@BeforeClass和@AfterClass
用它們註釋過的方法就會只初始化一次,完全符合我們的需求。
publicclass SeleniumTestCase extends SeleneseTestCase4 {
protected
protectedstatic Selenium selenium =null;
/**
* 包含了登入的程式碼,保證在一個測試內部只執行一次開啟瀏覽器並登入操作
* @throws Exception
*/
@BeforeClass
publicstaticvoid startSelenium() throws Exception {
log.debug("Starting Selenium");
selenium
}
/**
* 在該類包含的所有測試結束之後關閉瀏覽器
* @throws Exception
*/
@AfterClass
publicstaticvoid stopSelenium() throws Exception {
log.debug("Stoping Selenium");
selenium.stop();
}
}這個裡面的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估計要撇嘴了
2、JVM級別鉤子法
因為JVM支援關閉時執行制定程式碼的鉤子,而static程式碼會在類初始化時執行,再加上Ant呼叫的是類似命令列的java命令,實際上每一個測試執行在一個完整的JVM啟動關閉週期裡面,所以也就產生了這種解決方案。
這個方案來自taowen同學的兩則Selenium經驗。
程式碼我恢復了一下,大概是這樣:
publicabstractclass SomeTestCase extends TestCase {
static {
// perform the "global" set up logic
//這裡的程式碼會在類初始化時執行,所以相當於BeforeClass log.debug("Starting Selenium");
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 Selenium");
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 }
}
相關推薦
在JUnit中多個testCase只執行一次setup和tearDown的方法
這個問題出現在這種情況,你的每個testCase都需要使用某一種初始化比較耗時的物件(資源),舉例如資料庫連線、Spring Context。我們遇到的問題是Selenium測試中開啟和關閉瀏覽器,如果一個test啟動關閉(我們的程式還需要登入和登出),這樣測試的時間會拖的很
關於解決多次接收相同條件,如何只執行一次if條件語句的簡單問題
public class FacesSet { private static FacesSet instance = null; private Set<String> faceNames = new HashSet<String>();
如何讓python unittest.TestCase的類下的setUp和tearDown只執行一次
轉自: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
自學-Shiro中多個Realms的另外一種配置方式-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,設定所有虛擬使用者同一時刻執行指令碼且只執行一次 當然,虛擬使