qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          Quality Center引發(fā)的測(cè)試管理思考

           QC是很出名的強(qiáng)大的管理工具,很多測(cè)試愛(ài)好者都追逐著它,學(xué)習(xí)怎么使用它,今天我寫這篇文章不是講解如何使用,而是通過(guò)分析這個(gè)管理軟件來(lái)看看測(cè)試管理的思想,其實(shí)工具不僅給我們帶來(lái)了效率和便捷,更多的是給我們流程上的指導(dǎo),如果你深刻理解你會(huì)發(fā)下QC就給了我們一個(gè)很好的測(cè)試管理指導(dǎo)。好了,廢話不多說(shuō),我們就來(lái)看看它吧!

            首先我們來(lái)看下QC的整體管理流程圖,如下圖:

            看似簡(jiǎn)單的圖,其實(shí)蘊(yùn)藏著很多內(nèi)容。QC從前期的需求管理到測(cè)試點(diǎn)的提取,再到測(cè)試用例的形成,測(cè)試的執(zhí)行,以及缺陷的跟蹤管理全部包括了。也許這時(shí)候你會(huì)問(wèn),這有什么新鮮的現(xiàn)在好多管理工具都是這個(gè)流程,包括我們現(xiàn)在的流程也是如此,有什么炫耀的?

            ok,那咱們就來(lái)點(diǎn)真格的。如果你熟悉QC,你會(huì)發(fā)現(xiàn)QC中的需求是能和測(cè)試用例以及相應(yīng)的Bug關(guān)聯(lián)的(這就是QC中需求轉(zhuǎn)化為測(cè)試的功能),就這點(diǎn)來(lái)說(shuō)非常實(shí)用。為什么這么說(shuō)呢?大家知道我們基本面對(duì)的都是web產(chǎn)品,他的特點(diǎn)就是變化快,更新?lián)Q代更快,也許這個(gè)版本就和上個(gè)版本有天壤之別。這是web產(chǎn)品的特點(diǎn)我們無(wú)法改變,但我們可以改變自己來(lái)適應(yīng)他。 說(shuō)白了,就是按照QC的思想,我們來(lái)建立需求與測(cè)試用例以及Bug之間的關(guān)聯(lián)。這樣做的好處就是當(dāng)需求發(fā)生變更時(shí),能找到變更的需求涉及到的用例以及Bug。如果你買不起昂貴的QC我們可以這樣來(lái)做(個(gè)人觀點(diǎn),如有雷同,純屬巧合):

            1、需求格式規(guī)范化,在需求中給出功能模塊劃分圖,以及各個(gè)功能的優(yōu)先級(jí)。這樣做的好處是輪到tester分工時(shí)可以根據(jù)需求中的功能模塊圖來(lái)劃分,這樣的話就能避免重復(fù)或遺漏功能,同時(shí)根據(jù)產(chǎn)品人員提供的優(yōu)先級(jí)我們可以直接拿到用例中來(lái),這樣的話需求和用例間就建立了關(guān)聯(lián),當(dāng)然這個(gè)關(guān)聯(lián)關(guān)系很弱,還有待改進(jìn)。

            2、測(cè)試用例的規(guī)范,測(cè)試用例的原子化。其實(shí)這里仍然是QC中的體現(xiàn),在上一條中我們提到了功能模塊劃分,那么在測(cè)試用例中就根據(jù)功能模塊的再次細(xì)分,分解到原子狀態(tài)。為什么這么做呢?其實(shí)功能模塊的劃分相當(dāng)于QC中的測(cè)試點(diǎn),而我們繼續(xù)劃分則分解成了詳細(xì)的用例,那么到這一步,我們就建立了需求—>測(cè)試點(diǎn)—>測(cè)試用例之間的關(guān)聯(lián)了。

            3、接下來(lái)這是怎么把用例與Bug關(guān)聯(lián)起來(lái)?可以使用TestLink來(lái)管理用例,

            TestLink是一個(gè)開(kāi)源的測(cè)試管理工具能夠和JIRA等缺陷管理工具集成,這樣就建立了用例與Bug之間的關(guān)聯(lián)。說(shuō)實(shí)話,TestLink是個(gè)不錯(cuò)的測(cè)試管理工具,尤其是對(duì)于無(wú)法購(gòu)買昂貴的商業(yè)工具的工具來(lái)說(shuō),但TestLink的易用性我實(shí)在不敢恭維啊,用起來(lái)超級(jí)無(wú)敵不順手,但時(shí)間長(zhǎng)了也就習(xí)慣了。

            ok,到這里我們仿照QC的思想建立了一個(gè)基礎(chǔ)的管理流程,但這里流程還需要加強(qiáng),如何提高他們之間的關(guān)聯(lián)度還是個(gè)問(wèn)題,尤其是當(dāng)需求發(fā)生變化時(shí),如何能在最短時(shí)間內(nèi)找到涉及的用例以及Bug。

            下面我們繼續(xù)關(guān)注QC用例方面的思想。我們知道QC能夠很好的和LoadRunnerQTP等HP的測(cè)試工具結(jié)合,在QC中去調(diào)用和管理這些工具,那么這里就設(shè)計(jì)到一個(gè)用例格式以及用例重用的問(wèn)題。對(duì)于測(cè)試來(lái)說(shuō)用例是至關(guān)重要的,所以用例的規(guī)范也是很有必要的。那么這里我就UI Check List、功能測(cè)試用例和性能測(cè)試用例來(lái)說(shuō)下。

            我個(gè)人一直認(rèn)為,對(duì)于UI方面以及經(jīng)常要測(cè)試重用性非常高的模塊,我們可以設(shè)計(jì)成一個(gè)Check List,這樣的話看起來(lái)方便,執(zhí)行起來(lái)快捷,維護(hù)成本也低,拿來(lái)就能用,是個(gè)很好的方法。

            對(duì)于功能測(cè)試用例以及性能測(cè)試用例,我個(gè)人比較喜歡把功能測(cè)試用例的格式進(jìn)行擴(kuò)充轉(zhuǎn)化為性能測(cè)試用例,這樣他們之間的格式和關(guān)聯(lián)性方面就不會(huì)有太大的差異了。下面的圖是我設(shè)計(jì)的一個(gè)性能測(cè)試用例,其實(shí)它也是源于LoadRunner這個(gè)工具的思想演變而來(lái)的。

            仔細(xì)觀察你會(huì)發(fā)現(xiàn),這個(gè)用例就是功能測(cè)試用例的演變,而且非常符合LoadRunner的測(cè)試流程,從用例的信息到腳本設(shè)計(jì)到場(chǎng)景設(shè)計(jì)再到執(zhí)行結(jié)果能很好的體現(xiàn)出來(lái)。而且就測(cè)試結(jié)果也能簡(jiǎn)單明了的反應(yīng)出來(lái),個(gè)人感覺(jué)看上去很舒服,O(∩_∩)O~

            哦了,寫的也不少了,最后我們以QC的自定義功能來(lái)結(jié)束這篇文章。QC比其他測(cè)試工具更受測(cè)試人員喜歡的原因之一就是因?yàn)樗袕?qiáng)大的自定義功能,能對(duì)字段、流程等進(jìn)行自定義,編寫代碼來(lái)完成你想要的各種流程功能。這也就反映了一個(gè)道理,任何管理流程都是靈活的,最好的管理流程并不一定適合你,俗話說(shuō)的好,適合自己的才是最好的。所以,當(dāng)我們有了一個(gè)基本比較完善的測(cè)試管理流程后應(yīng)該慢慢的把他個(gè)性化、人性化,而不是一成不變的去死守,加入新鮮元素,加入新的管理理念,給更多人的展示空間才能不斷的去促進(jìn)流程的改進(jìn)與提高。

          posted @ 2012-05-24 09:26 順其自然EVO 閱讀(208) | 評(píng)論 (0)編輯 收藏

          軟件測(cè)試質(zhì)量和效率評(píng)價(jià)之我見(jiàn)

           寫在前面

            近期在研究如何提高軟件測(cè)試質(zhì)量和效率,發(fā)現(xiàn)要完成這個(gè)課題,先要搞清楚如何評(píng)價(jià)軟件測(cè)試質(zhì)量和效率?搜羅了不少資料,木有找到權(quán)威的說(shuō)法,于是結(jié)合自己的經(jīng)驗(yàn)進(jìn)行了總結(jié),便得此文,愿拋磚與業(yè)界朋友探討。

            軟件測(cè)試質(zhì)量和效率評(píng)價(jià)的范疇

            原本打算將軟件測(cè)試質(zhì)量和效率分別評(píng)價(jià),但基于軟件測(cè)試不可窮盡的特點(diǎn),以及測(cè)試時(shí)間總是那么緊張的現(xiàn)實(shí),更多的時(shí)候我們需要在質(zhì)量和效率之間加以權(quán)衡,在有限的測(cè)試時(shí)間內(nèi)得到可用的系統(tǒng)或產(chǎn)品。因此,質(zhì)量和效率有著相互制約的關(guān)系,但對(duì)于一個(gè)系統(tǒng)或產(chǎn)品的測(cè)試來(lái)說(shuō),質(zhì)量和效率都是衡量測(cè)試是否成功的指標(biāo),索性放在一起討論。

            經(jīng)過(guò)分析,我認(rèn)為一個(gè)測(cè)試效果的好壞可以從以下四個(gè)大的方面進(jìn)行評(píng)價(jià),如圖1:

            1、測(cè)試質(zhì)量評(píng)價(jià):對(duì)測(cè)試產(chǎn)出及結(jié)果的評(píng)價(jià),評(píng)價(jià)比重30%

            2、測(cè)試效率評(píng)價(jià):測(cè)試過(guò)程中若干項(xiàng)工作的效率評(píng)價(jià),評(píng)價(jià)比重30%

            3、測(cè)試文檔評(píng)價(jià):測(cè)試文檔質(zhì)量的評(píng)價(jià),包括對(duì)測(cè)試方案、測(cè)試設(shè)計(jì)、測(cè)試用例、缺陷報(bào)告單、測(cè)試報(bào)告等文檔的評(píng)價(jià)。評(píng)價(jià)比重25%

            4、測(cè)試過(guò)程評(píng)價(jià):對(duì)測(cè)試中若干過(guò)程執(zhí)行情況及效果的評(píng)價(jià),包括文檔評(píng)審、測(cè)試溝通、執(zhí)行過(guò)程等評(píng)價(jià)。評(píng)價(jià)比重15%

          圖1 測(cè)試質(zhì)量和效率評(píng)價(jià)

            詳細(xì)評(píng)價(jià)指標(biāo)

            詳細(xì)評(píng)價(jià)指標(biāo)參考下表:

          表1:測(cè)試質(zhì)量和效率評(píng)價(jià)指標(biāo)


           下面詳細(xì)解讀各指標(biāo)含義及評(píng)價(jià)標(biāo)準(zhǔn)。

            測(cè)試質(zhì)量評(píng)價(jià)

          序號(hào) 評(píng)價(jià)指標(biāo) 指標(biāo)含義指標(biāo)解讀   備注
          1有效Bug比例
          有效Bug數(shù)/總Bug數(shù)

          所提Bug有效率越高,說(shuō)明測(cè)試工作越有效,所作無(wú)用功越少。
          不太贊同用Bug數(shù)衡量測(cè)試質(zhì)量。
           2 嚴(yán)重Bug比例嚴(yán)重Bug數(shù)/有效Bug數(shù) 嚴(yán)重Bug所占比例越高,表征測(cè)試越有效,對(duì)系統(tǒng)幫助越大。  
           3 漏測(cè)Bug加權(quán)數(shù) 漏測(cè)Bug*嚴(yán)重系數(shù)之和漏測(cè)Bug加權(quán)數(shù)越高,表征測(cè)試質(zhì)量越低。 因項(xiàng)目周期、用戶缺陷反饋渠道等問(wèn)題,漏測(cè)Bug的統(tǒng)計(jì)可能遇到障礙。

            測(cè)試效率評(píng)價(jià)

          序號(hào) 評(píng)價(jià)指標(biāo) 指標(biāo)含義 指標(biāo)解讀 備注
           1 工作按計(jì)劃完成率1-(實(shí)際耗時(shí)-計(jì)劃耗時(shí))/計(jì)劃耗時(shí) 工作能夠按照計(jì)劃完成,表征測(cè)試過(guò)程控制合理,測(cè)試效率也得以保證。 前提是需要一份完整且可執(zhí)行性強(qiáng)的測(cè)試計(jì)劃。
           2 日均有效Bug加權(quán)數(shù)有效Bug加權(quán)數(shù)/測(cè)試工作日 日均有效Bug加權(quán)數(shù)越多,表征工作效率越高。  更適合于對(duì)個(gè)人工作效率的評(píng)價(jià),因?yàn)樾枰獧M向?qū)Ρ取?/td>
           3 測(cè)試文檔生產(chǎn)率文檔頁(yè)數(shù)*難度系數(shù)/撰寫文檔耗時(shí) 單位時(shí)間產(chǎn)出文檔越多,表征文檔生成效率越高。 文檔質(zhì)量單獨(dú)評(píng)價(jià),見(jiàn)下節(jié)。
           4 文檔評(píng)審效率(評(píng)審建議數(shù)+問(wèn)題數(shù))/評(píng)審耗時(shí) 單位時(shí)間內(nèi)評(píng)審出問(wèn)題越多,表征工作效率越高。 

            測(cè)試效率評(píng)價(jià)

          序號(hào)評(píng)價(jià)指標(biāo) 指標(biāo)含義 指標(biāo)解讀  備注
           測(cè)試計(jì)劃文檔質(zhì)量測(cè)試計(jì)劃的規(guī)范性,及指導(dǎo)測(cè)試的作用是否達(dá)到。 測(cè)試計(jì)劃體現(xiàn)測(cè)試人員對(duì)任務(wù)量估計(jì)、分工及風(fēng)險(xiǎn)的預(yù)估能力,文檔越規(guī)范、越有效,說(shuō)明文檔質(zhì)量越高,該項(xiàng)工作的質(zhì)量也越高。 測(cè)試文檔的質(zhì)量從某種程度上反映著測(cè)試的質(zhì)量。 
           2測(cè)試方案文檔質(zhì)量 測(cè)試方案的規(guī)范性,及指導(dǎo)測(cè)試的作用是否達(dá)到。測(cè)試方案體現(xiàn)測(cè)試人員對(duì)項(xiàng)目測(cè)試整體的把握能力,文檔越規(guī)范、越有效,說(shuō)明文檔質(zhì)量越高,該項(xiàng)工作的質(zhì)量也越高。  
           3測(cè)試設(shè)計(jì)/用例文檔質(zhì)量 測(cè)試設(shè)計(jì)和用例文檔的規(guī)范性,及指導(dǎo)測(cè)試的作用是否達(dá)到。 測(cè)試設(shè)計(jì)和用例體現(xiàn)測(cè)試人員的用例設(shè)計(jì)水平,即解決測(cè)試問(wèn)題的水平,文檔越規(guī)范、越有效,說(shuō)明文檔質(zhì)量越高,該項(xiàng)工作的質(zhì)量也越高。  
           4 缺陷報(bào)告單質(zhì)量缺陷報(bào)告單的規(guī)范性和有效性。 缺陷報(bào)告單越規(guī)范、越有效,對(duì)測(cè)試問(wèn)題定位幫助越大。  
           5 測(cè)試報(bào)告文檔質(zhì)量測(cè)試報(bào)告文檔的規(guī)范性,及指導(dǎo)測(cè)試的作用是否達(dá)到。 測(cè)試報(bào)告體現(xiàn)測(cè)試人員歸納、總結(jié)測(cè)試數(shù)據(jù),呈現(xiàn)測(cè)試結(jié)論的能力。文檔越規(guī)范、越有效,說(shuō)明文檔質(zhì)量越高,該項(xiàng)工作的質(zhì)量也越高。  

            測(cè)試過(guò)程評(píng)價(jià)

          序號(hào) 評(píng)價(jià)指標(biāo) 指標(biāo)含義 指標(biāo)解讀 備注
           1需求&設(shè)計(jì)評(píng)審過(guò)程評(píng)價(jià) 從流程執(zhí)行的規(guī)范性及評(píng)審效果兩方面評(píng)價(jià)。評(píng)審過(guò)程按流程要求進(jìn)行,評(píng)審對(duì)需求和設(shè)計(jì)的幫助越大,說(shuō)明該項(xiàng)工作質(zhì)量越高。
           2測(cè)試溝通過(guò)程評(píng)價(jià)從測(cè)試溝通過(guò)程的規(guī)范性及溝通結(jié)果進(jìn)行評(píng)價(jià)。測(cè)試溝通按流程要求進(jìn)行,溝通對(duì)形成測(cè)試方案和測(cè)試設(shè)計(jì)的幫助越大,說(shuō)明該項(xiàng)工作質(zhì)量越高。 
           3測(cè)試方案&設(shè)計(jì)&用例評(píng)審過(guò)程評(píng)價(jià) 從測(cè)試方案、設(shè)計(jì)、用例評(píng)審的過(guò)程及效果兩方面進(jìn)行評(píng)價(jià)。各評(píng)審過(guò)程按流程要求執(zhí)行,評(píng)審出的問(wèn)題越多、幫助越大,說(shuō)明該項(xiàng)工作質(zhì)量越高。 
           4 測(cè)試執(zhí)行過(guò)程評(píng)價(jià)從測(cè)試執(zhí)行的規(guī)范性及效果進(jìn)行評(píng)價(jià)。測(cè)試執(zhí)行規(guī)范,分工協(xié)作有效,溝通及時(shí)到位,進(jìn)度及時(shí)通報(bào),測(cè)試風(fēng)險(xiǎn)及時(shí)化解……說(shuō)明該項(xiàng)工作質(zhì)量越高。 

            評(píng)價(jià)注意事項(xiàng)

            1、評(píng)價(jià)雖應(yīng)盡可量客觀,但無(wú)法避免主觀因素。主觀評(píng)價(jià)有時(shí)也是最直接、最簡(jiǎn)單的評(píng)價(jià)方式,因此,建議可以主觀客觀結(jié)合去評(píng)價(jià),但應(yīng)以客觀評(píng)價(jià)為主。

            2、評(píng)價(jià)指標(biāo)的收集,往往需要有效的統(tǒng)計(jì)數(shù)據(jù)來(lái)源,因此,要評(píng)價(jià),還需要建立評(píng)價(jià)數(shù)據(jù)的收集機(jī)制。

            文章寫的比較簡(jiǎn)略,如需討論歡迎留言。

          posted @ 2012-05-24 09:18 順其自然EVO 閱讀(291) | 評(píng)論 (0)編輯 收藏

          QTP 錄制 回放 原理

          QTP 錄制 回放 原理 
             自動(dòng)化測(cè)試可以基于代碼,例如junit,cppunit,可以基于協(xié)議,例如loadrunner,QTP是基于GUI界面的自動(dòng)化測(cè)試工具。junit和cppunit屬于單元測(cè)試,loadrunner和QTP屬于系統(tǒng)測(cè)試。loadrunner用于系統(tǒng)的性能測(cè)試,QTP用于系統(tǒng)的功能測(cè)試。QTP是一款基于界面的功能自動(dòng)化測(cè)試工具。
              LR錄制的是協(xié)議和數(shù)據(jù)包,QTP錄制的是鼠標(biāo)和鍵盤的消息。QTP錄制回放時(shí)基于windows操作系統(tǒng)的消息機(jī)制。QTP在錄制時(shí)監(jiān)聽(tīng)?wèi)?yīng)用程序的消息,監(jiān)聽(tīng)到之后把消息放到容器里,而另外的監(jiān)聽(tīng)程序則從容器中取出容器中的消息,并調(diào)用對(duì)用的API處理函數(shù)。QTP截取的是用戶對(duì)應(yīng)用程序的操作,即錄制的是消息。對(duì)于C/S應(yīng)用程序,在回放時(shí)QTP根據(jù)對(duì)象的句柄(handle)和腳本內(nèi)容,調(diào)用API函數(shù);對(duì)于B/S應(yīng)用程序,在回放時(shí)基于DOM(document object model)來(lái)解析。
              RO(Runtime Object)和TO(Test Object)。RO是指GUI界面上的控件即對(duì)象本身,TO是QTP對(duì)象庫(kù)里的對(duì)象即在錄制時(shí)添加到對(duì)象庫(kù)的對(duì)象。RO是應(yīng)用程序上實(shí)際的對(duì)象,因此擁有對(duì)象的所有的屬性和方法;TO是QTP在錄制時(shí)獲取的應(yīng)用程序的對(duì)象的,而錄制時(shí) QTP只保存了應(yīng)用程序一部分常用的,能夠在回放時(shí)識(shí)別應(yīng)用程序上對(duì)象的一部分屬性,因此TO對(duì)象擁有應(yīng)用程序上對(duì)象的一部分屬性。另外QTP對(duì)象庫(kù)里保存的是TO對(duì)象。不過(guò)QTP可以使用Object Spy功能獲取應(yīng)用程序的所有屬性值,或者可以通過(guò)TO對(duì)象的getROproperty()和getROpropertys()獲取應(yīng)用程序的所有屬性值(呵呵,所有對(duì)象都沒(méi)有setROproperty()方法)。使用TO對(duì)象的setTOproperty()和getTOproperty()可以操作對(duì)象庫(kù)的TO對(duì)象。
              QTP的錄制原理:根據(jù)用戶在應(yīng)用程序界面上的操作,QTP采用Object Identification Tools工具對(duì)被操作的對(duì)象進(jìn)行識(shí)別,采用反編譯的原理看其屬于哪個(gè)插件類,從而進(jìn)一步識(shí)別其屬于什么控件類,然后QTP把對(duì)應(yīng)的控件類實(shí)例化一個(gè)對(duì)象,并把獲取的應(yīng)用程序的一部分屬性值(足以識(shí)別對(duì)象?)賦給新建的對(duì)象,并添加到對(duì)象庫(kù)里即TO對(duì)象,而把用戶對(duì)對(duì)象的操作添加到腳本里面。
              QTP的回放原理:QTP 根據(jù)腳本中記錄下來(lái)的對(duì)象操作的順序進(jìn)行回放。QTP從腳本中讀取到該對(duì)象,并根據(jù)對(duì)象的層次和名稱到對(duì)象庫(kù)中尋找相同名稱的測(cè)試庫(kù)對(duì)象,在測(cè)試庫(kù)找到相應(yīng)的對(duì)象,獲得對(duì)象的屬性,根據(jù)對(duì)象庫(kù)中對(duì)象的屬性,在運(yùn)行的應(yīng)用程序中進(jìn)行匹配,尋找運(yùn)行時(shí)對(duì)象,找到后根據(jù)腳本中記錄的對(duì)該對(duì)象執(zhí)行的動(dòng)作和參數(shù)值。 

          posted @ 2012-05-23 16:42 順其自然EVO 閱讀(836) | 評(píng)論 (0)編輯 收藏

          在QTP中環(huán)境變量的使用

          QTP使用環(huán)境變量

              為了在一次執(zhí)行腳本過(guò)程中向數(shù)據(jù)庫(kù)中插入多條數(shù)據(jù),可以參數(shù)化,在Data Table中輸入數(shù)值,但是現(xiàn)在我不想在Data Table中輸入,而是通過(guò)VBS自動(dòng)去生成。在這里聲明的變量如何給下個(gè)ACTION使用呢?摸索了2天再參考網(wǎng)上的資料想出了一個(gè)解決方法,就拿目前測(cè)試的軟件作為例子來(lái)講解吧!

              想往數(shù)據(jù)庫(kù)中插入多個(gè)產(chǎn)品(比如說(shuō)10個(gè)),但又不想在Data Table中輸入?yún)?shù),想到一個(gè)下面的方法:分別錄制一個(gè)登陸腳本和添加產(chǎn)品的腳本,然后在新建一空白test,call這兩個(gè)腳本,其中登陸腳本只執(zhí)行一次,而添加產(chǎn)品的腳本執(zhí)行多次。在添加產(chǎn)品的腳本中對(duì)產(chǎn)品名稱和產(chǎn)品編碼參數(shù)化。產(chǎn)品名稱暫時(shí)用“產(chǎn)品商標(biāo)+空格+數(shù)字+字母”組成(形如:LG 221BWX),而產(chǎn)品編碼就是產(chǎn)品名稱去掉前面的商標(biāo)跟空格。為了簡(jiǎn)單起見(jiàn),只有數(shù)字這項(xiàng)作變動(dòng),其它的都不變。聲明兩個(gè)變量,用來(lái)拼組產(chǎn)品名稱和產(chǎn)品編碼?,F(xiàn)在的問(wèn)題是怎么將變量的值作為參數(shù)使得其在添加產(chǎn)品腳本中被使用。現(xiàn)在的腳本如下:

          在QTP中環(huán)境變量的使用

          在QTP中環(huán)境變量的使用

          添加產(chǎn)品腳本一開(kāi)始錄制的腳本是這樣的:

          Browser("管理系統(tǒng) | 主頁(yè)").Page("管理系統(tǒng) | 產(chǎn)品詳細(xì)信息").WebEdit("productName").Set "LG 256BWX"
          Browser("管理系統(tǒng) | 主頁(yè)").Page("管理系統(tǒng) | 產(chǎn)品詳細(xì)信息").WebEdit("productCode").Set "256BWX"

          現(xiàn)在要做的就是把Dim productname,productcode 聲明的兩個(gè)變量的值傳到這里供使用,為了實(shí)現(xiàn)這個(gè)目的,需做以下操作:

          1.在File-Settings...中切換到Environment標(biāo)簽頁(yè),在Variable type下拉菜單中選擇User_defined,如下圖。

          在QTP中環(huán)境變量的使用

          然后點(diǎn)擊“+”圖標(biāo),會(huì)出現(xiàn)一個(gè)窗口,如下圖,在這里我們只需填入Name即可。

          在QTP中環(huán)境變量的使用

          2.將聲明變量的值傳給環(huán)境變量,代碼如下:

          Environment("productname")=productname
          Environment("productcode")=productcode

          在QTP中環(huán)境變量的使用

          3.修改添加產(chǎn)品腳本中以下代碼

          Browser("管理系統(tǒng) | 主頁(yè)").Page("管理系統(tǒng) | 產(chǎn)品詳細(xì)信息").WebEdit("productName").Set "LG 256BWX"
          Browser("管理系統(tǒng) | 主頁(yè)").Page("管理系統(tǒng) | 產(chǎn)品詳細(xì)信息").WebEdit("productCode").Set "256BWX"

          為:

          Browser("管理系統(tǒng) | 主頁(yè)").Page("管理系統(tǒng) | 產(chǎn)品詳細(xì)信息").WebEdit("productName").Set Environment("productname")
          Browser("管理系統(tǒng) | 主頁(yè)").Page("管理系統(tǒng) | 產(chǎn)品詳細(xì)信息").WebEdit("productCode").Set Environment("productcode")

          4.保存,run腳本,測(cè)試通過(guò)

          如何利用好qtp環(huán)境變量

          qtp自動(dòng)化測(cè)試過(guò)程中,經(jīng)常會(huì)需要一些預(yù)先的配置信息文件來(lái)用于不同的測(cè)試環(huán)境下。環(huán)境變量也就這樣應(yīng)運(yùn)而生了。在qtp中存在著兩種類型的環(huán)境變量:

          內(nèi)置環(huán)境變量

          介紹:它是qtp內(nèi)部已經(jīng)事先封裝好.

          方式:直接進(jìn)入到Settings –> Environment中選擇built-in選項(xiàng)即可查詢到所有的內(nèi)置環(huán)境變量。并且這些環(huán)境變量的值都是qtp已經(jīng)封裝好的。

          舉例: Msgbox Environment.Value(“TestName”)

          結(jié)果:直接可以獲取到當(dāng)前測(cè)試腳本名稱。

          自定義內(nèi)部環(huán)境變量

          介紹:它是qtp中的一種可以在qtp內(nèi)部進(jìn)行自定義的環(huán)境變量

          方式:直接進(jìn)入到Settings –> Environment中選擇User-defined選項(xiàng),點(diǎn)擊旁邊的”+”,即可定義name 和 value

          舉例:Msgbox Environment.Value(“自定義名稱”)

          結(jié)果:直接可以獲取到當(dāng)前自定義環(huán)境變量的值

          自定義外部環(huán)境變量

          介紹:直接從xml格式文件中進(jìn)行讀取環(huán)境變量

          方式:進(jìn)入Settings –> Environment中選中Load variables and values from external file并給出xml的文件路徑

          舉例:xml文件

          <Environment>
          <Variable>
          <Name>Url</Name>
          <Value>http://www.iquicktest.com</Value>
          </Variable>
          </Environment>

          Msgbox Environment.Value(“Url”)

          結(jié)果:直接打印結(jié)果為http://www.iquicktest.com

          注意:環(huán)境變量中的屬性名是大小寫敏感的,必須要注意。

          QTP使用環(huán)境變量


          QTP使用環(huán)境變量的方法有兩種,一種是自己設(shè)置環(huán)境變量,這種方法有很多朋友介紹過(guò),不過(guò)我在使用的時(shí)候,更喜歡把它寫在腳本中,這樣不管腳本是移植到哪臺(tái)機(jī)器上,環(huán)境變量都不用重新設(shè)置了,是不是方便很多,例如某個(gè)項(xiàng)目的主控腳本具體代碼如下:

          Dim Excel,Workbook,WorkSheet,run_value,scrīpt_name
          Dim filepath,bnpFileName

          Environment.Value("file_pash") = "C:\Documents and Settings\robel.yi\Desktop\BNP_scrīptS"

          filepath=environment("file_pash")
          bnpFileName=filepath & "\Data_file\Main_DATA.xlsx"

          Set Excel= CreateObject("Excel.Application")
          Set Workbook= Excel.Workbooks.Open(bnpFileName)
          Set WorkSheet= workbook.Worksheets("Sheet1")

          For i = 2 To 6
                  run_value=CStr(WorkSheet.Cells(i, 3))
                  If run_value = "Y" Then
                          RunAction CStr(WorkSheet.Cells(i, 2))
                  End If
          Next

          Excel.Quit
          Set Workbook = nothing
          Set WorkSheet = nothing

              這樣,每次如果你把腳本移植到了另外一個(gè)地方,把新的路徑賦值給環(huán)境變量file_pash就行了,其實(shí)也可以把它寫在主控腳本的EXCEL驅(qū)動(dòng)表里面,每次有變量在EXCEL里面修改就行了,對(duì)于把腳本給其他黑盒工程師來(lái)執(zhí)行的時(shí)候,更加容易使用,其實(shí)有時(shí)候我們?cè)趯懩_本的時(shí)候,一些小小的改動(dòng)就能使自動(dòng)化變得更智能方便,大家還有什么關(guān)于環(huán)境變量的使用的好的心得也不妨一起分享分享。

          posted @ 2012-05-23 16:20 順其自然EVO 閱讀(3479) | 評(píng)論 (0)編輯 收藏

          修改MYSQL最大連接數(shù)的3種方法

          MYSQL數(shù)據(jù)庫(kù)安裝完成后,默認(rèn)最大連接數(shù)是100,一般流量稍微大一點(diǎn)的論壇或網(wǎng)站這個(gè)連接數(shù)是遠(yuǎn)遠(yuǎn)不夠的,增加默認(rèn)MYSQL連接數(shù)的方法有兩個(gè)

          方法一:進(jìn)入MYSQL安裝目錄 打開(kāi)MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100   修改為 max_connections=1000 服務(wù)里重起MYSQL即可

          方法二:MySQL的最大連接數(shù)默認(rèn)是100客戶端登錄:mysql -uusername -ppassword

          設(shè)置新的最大連接數(shù)為200:mysql> set GLOBAL max_connections=200

          顯示當(dāng)前運(yùn)行的Query:mysql> show processlist

          顯示當(dāng)前狀態(tài):mysql> show status

          退出客戶端:mysql> exit

          查看當(dāng)前最大連接數(shù):mysqladmin -uusername -ppassword variables

          方法三:以centos 4.4 下面的mysql 5.0.33 手工編譯版本為例說(shuō)明:

            vi /usr/local/mysql/bin/mysqld_safe

            找到safe_mysqld編輯它,找到mysqld啟動(dòng)的那兩行,在后面加上參數(shù) :

            -O max_connections=1500

            具體一點(diǎn)就是下面的位置:

            用紅字特別說(shuō)明:

            then $NOHUP_NICENESS $ledir/$MYSQLD

            $defaults --basedir=$MY_BASEDIR_VERSION

            --datadir=$DATADIR $USER_OPTION

            --pid-file=$pid_file

            --skip-external-locking

            -O max_connections=1500

            >> $err_log 2>&1 else

            eval "$NOHUP_NICENESS $ledir/$MYSQLD

            $defaults --basedir=$MY_BASEDIR_VERSION

            --datadir=$DATADIR $USER_OPTION

            --pid-file=$pid_file

            --skip-external-locking $args

            -O max_connections=1500 >>

            $err_log 2>&1"

            保存。

            # service mysqld restart

            # /usr/local/mysql/bin/mysqladmin -uroot -p variables

            輸入root數(shù)據(jù)庫(kù)賬號(hào)的密碼后可看到

            max_connections 1500 即新改動(dòng)已經(jīng)生效。

            還有一種方法,

            修改原代碼:

            解開(kāi)MySQL的原代碼,進(jìn)入里面的sql目錄修改mysqld.cc找到下面一行:

            {"max_connections", OPT_MAX_CONNECTIONS,

            "The number of simultaneous clients allowed.", (gptr*) &max_connections,

            (gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,

            0},

            把它改為:

            {"max_connections", OPT_MAX_CONNECTIONS,

            "The number of simultaneous clients allowed.", (gptr*) &max_connections,

            (gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 1500, 1, 16384, 0, 1,

            0},

            存盤退出,然后./configure ;make;make install可以獲得同樣的效果。

          posted @ 2012-05-23 11:16 順其自然EVO 閱讀(433) | 評(píng)論 (0)編輯 收藏

          tomcat服務(wù)器連接池知識(shí)

          tomcat服務(wù)器連接池知識(shí)  

          什么是敏捷開(kāi)發(fā)

          簡(jiǎn)單的說(shuō),敏捷開(kāi)發(fā)是一種以人為核心、迭代、循序漸進(jìn)的開(kāi)發(fā)方法。在敏捷開(kāi)發(fā)中,軟件項(xiàng)目的構(gòu)建被切分成多個(gè)子項(xiàng)目,
          各個(gè)子項(xiàng)目的成果都經(jīng)過(guò)測(cè)試,具備集成和可運(yùn)行的特征。換言之,就是把一個(gè)大項(xiàng)目分為多個(gè)相互聯(lián)系,但也可獨(dú)立運(yùn)行的小項(xiàng)目,
          并分別完成,在此過(guò)程中軟件一直處于可使用狀態(tài)。

          Tomcat中配置連接池步驟

          本方法的原理是,在%CATALINA%\conf\server.xml中設(shè)置數(shù)據(jù)庫(kù)的連接屬性,
          在應(yīng)用目錄的/WEB-INF/web.xml中配置一個(gè)引用,
          然后在應(yīng)用中的/META-INF/context.xml中將以上兩個(gè)配置聯(lián)系起來(lái)。
          所以真正產(chǎn)生連接的是tomcat系統(tǒng)級(jí),因此數(shù)據(jù)庫(kù)驅(qū)動(dòng)應(yīng)該放在%CATALINA%\common\lib中

          以下是具體步驟:

          1.將數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的JAR文件放在Tomcat的 common/lib 中。

          2.在server.xml中設(shè)置數(shù)據(jù)源,以MySQL數(shù)據(jù)庫(kù)為例,如下:
          在<GlobalNamingResources> </GlobalNamingResources>節(jié)點(diǎn)中加入,
            <Resource
            name="jdbc/DBPool"
            type="javax.sql.DataSource"
            password="root"
            driverClassName="com.mysql.jdbc.Driver"
            maxIdle="2"
            maxWait="5000"
            username="root"
            url="jdbc:mysql://127.0.0.1:3306/test"
            maxActive="4"/>
            屬性說(shuō)明:name,數(shù)據(jù)源名稱,通常取”jdbc/XXX”的格式;
            type,”javax.sql.DataSource”;
            password,數(shù)據(jù)庫(kù)用戶密碼;
            driveClassName,數(shù)據(jù)庫(kù)驅(qū)動(dòng);
            maxIdle,最大空閑數(shù),數(shù)據(jù)庫(kù)連接的最大空閑時(shí)間。超過(guò)空閑時(shí)間,數(shù)據(jù)庫(kù)連
            接將被標(biāo)記為不可用,然后被釋放。設(shè)為0表示無(wú)限制。
            MaxActive,連接池的最大數(shù)據(jù)庫(kù)連接數(shù)。設(shè)為0表示無(wú)限制。
            maxWait ,最大建立連接等待時(shí)間。如果超過(guò)此時(shí)間將接到異常。設(shè)為-1表示
            無(wú)限制。

          3.在你的web應(yīng)用程序的web.xml中設(shè)置數(shù)據(jù)源參考,如下:
            在<web-app></web-app>節(jié)點(diǎn)中加入,
            <resource-ref>
            <description>MySQL DB Connection Pool</description>
            <res-ref-name>jdbc/DBPool</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Shareable</res-sharing-scope>
           </resource-ref>
            子節(jié)點(diǎn)說(shuō)明: description,描述信息;
            res-ref-name,參考數(shù)據(jù)源名字,同上一步的屬性name;
            res-type,資源類型,”javax.sql.DataSource”;
            res-auth,”Container”;
            res-sharing-scope,”Shareable”;

          4.在web應(yīng)用程序的/META-INF/context.xml中設(shè)置數(shù)據(jù)源鏈接,如下:
            在<Context></Context>中加入:
            <Context>
            <ResourceLink
            name="jdbc/DBPool" 
            type="javax.sql.DataSource" 
            global="jdbc/DBPool"/>
            </Context>
            屬性說(shuō)明:name,同第2步和第3步的屬性name值,和子節(jié)點(diǎn)res-ref-name值;
            type,同樣取”javax.sql.DataSource”;
            global,同name值。
           
          至此,設(shè)置完成,下面是如何使用數(shù)據(jù)庫(kù)連接池。
          1.建立一個(gè)連接池類,DBPool.java,用來(lái)創(chuàng)建連接池,代碼如下:
          import javax.naming.Context;
          import javax.naming.InitialContext;
          import javax.naming.NamingException;
          import javax.sql.DataSource;

          public class DBPool {
            private static DataSource pool;
            static {
            Context env = null;
            try {
            env = (Context) new InitialContext().lookup("java:comp/env");
            pool = (DataSource)env.lookup("jdbc/DBPool");
            if(pool==null) 
            System.err.println("'DBPool' is an unknown DataSource");
            } catch(NamingException ne) {
            ne.printStackTrace();
            }
            }
            public static DataSource getPool() {
            return pool;
            }
          }

          2.在要用到數(shù)據(jù)庫(kù)操作的類或jsp頁(yè)面中,用DBPool.getPool().getConnection(),
          獲得一個(gè)Connection對(duì)象,就可以進(jìn)行數(shù)據(jù)庫(kù)操作,最后別忘了對(duì)Connection對(duì)象調(diào)用close()方法,
          注意:這里不會(huì)關(guān)閉這個(gè)Connection,而是將這個(gè)Connection放回?cái)?shù)據(jù)庫(kù)連接池。

          數(shù)據(jù)源和數(shù)據(jù)庫(kù)共享連接池關(guān)系

          一、數(shù)據(jù)源簡(jiǎn)介:
          在Java語(yǔ)言中,DataSource對(duì)象就是一個(gè)代表數(shù)據(jù)源實(shí)體的對(duì)象。一個(gè)數(shù)據(jù)源就是一個(gè)用來(lái)存儲(chǔ)數(shù)據(jù)的工具,它可以是復(fù)雜的大型企業(yè)級(jí)數(shù)據(jù)庫(kù),
          也可以是簡(jiǎn)單得只有行和列的文件。數(shù)據(jù)源可以位于在服務(wù)器端,也可以位于客服端。

          應(yīng)用程序通過(guò)一個(gè)連接來(lái)訪問(wèn)數(shù)據(jù)源,那么一個(gè)DataSource對(duì)象就是用于提供連接數(shù)據(jù)源的工具。DataSource接口提供了兩個(gè)方法用于建立和數(shù)據(jù)源的連接,
          使用DataSource對(duì)象建立和數(shù)據(jù)庫(kù)的連接比起使用DriverManager接口更加高效,雖然兩者的使用范圍都很相似,并且都提供了方法用于建立和數(shù)據(jù)庫(kù)的連接,設(shè)置連接的最大超時(shí)時(shí)間,獲取流、登錄。
            
          但兩者之間的區(qū)別更加明顯。和DriverManager不同,一個(gè)DataSource對(duì)象能夠識(shí)別和描述它所代表的數(shù)據(jù)源的屬性,
          而且 DataSource對(duì)象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的關(guān)系, DataSource的建立、發(fā)布、獨(dú)立于應(yīng)用程序的管理都依靠JNDI技術(shù)。
             
          在JDBC2.0或JDBC3.0中,所有的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序提供商必須提供一個(gè)實(shí)現(xiàn)了DataSource接口的類,要使用數(shù)據(jù)源必須首先在JNDI中注冊(cè)該數(shù)據(jù)源對(duì)象。
          如果在JNDI中注冊(cè)了數(shù)據(jù)源對(duì)象,將會(huì)比起使用DriverManager來(lái)具有兩個(gè)方面的優(yōu)勢(shì):
          首先程序不需要像使用DriverManager一樣對(duì)加載的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序信息進(jìn)行硬編碼,程序員可以選擇先在JNDI中注冊(cè)這個(gè)數(shù)據(jù)源對(duì)象,然后在程序中使用一個(gè)邏輯名稱來(lái)引用它,
          JNDI會(huì)自動(dòng)根據(jù)你給出的名稱找到與這個(gè)名稱綁定的DataSource對(duì)象。然后就可以使用這個(gè)DataSource對(duì)象來(lái)建立和具體數(shù)據(jù)庫(kù)的連接了。

          其次,使用實(shí)現(xiàn)了DataSource接口的類所具有的第二個(gè)優(yōu)勢(shì)體現(xiàn)在連接池和分布式事務(wù)上。連接池通過(guò)對(duì)連接的復(fù)用而不是新建一個(gè)物理連接來(lái)顯著地提高程序的效率。
          從而適用于任務(wù)繁忙、負(fù)擔(dān)繁重的企業(yè)級(jí)分布式事務(wù)。

          二、JNDI簡(jiǎn)介:
          JNDI是用于向Java程序提供目錄和命名功能的API。它被設(shè)計(jì)成獨(dú)立于特定的目錄服務(wù),所以各種各樣的目錄都可以通過(guò)相同的方式進(jìn)行訪問(wèn)。

          可以簡(jiǎn)單地把JNDI理解為一種將對(duì)象和名字綁定的技術(shù),對(duì)象工廠負(fù)責(zé)生產(chǎn)出對(duì)象,這些對(duì)象都和惟一的名字綁定。外部程序可以通過(guò)名字來(lái)獲取對(duì)某個(gè)對(duì)象的引用。

          在Intranets (企業(yè)內(nèi)部網(wǎng))和Internates(互聯(lián)網(wǎng))中目錄服務(wù)(Directory service)扮演了一個(gè)非常重要的角色,它能夠在眾多的用戶、機(jī)器、網(wǎng)絡(luò)、服務(wù)、應(yīng)用程序中訪問(wèn)各種各樣的信息。
          目錄服務(wù)提供了一系列的命名措施,用人類可以理解的命名方式來(lái)刻畫(huà)各種各樣的實(shí)體之間的關(guān)系

          一個(gè)企業(yè)式計(jì)算環(huán)境(computing environment)通常是由若干代表不同部分的命名復(fù)合而成。比如在一個(gè)企業(yè)級(jí)環(huán)境中DNS (Domain Name System)通常被當(dāng)成頂層的命名方案(top-level namein facility)區(qū)分不同的部門或組織。而這些部門或組織自己又可以使用諸如LADP或NDS的目錄服務(wù)

          從用戶的角度來(lái)看,這些都是由不同的命名方案構(gòu)成的復(fù)合名稱。URL就是一個(gè)很典型的例子,它由多個(gè)命名方案構(gòu)成。使用目錄服務(wù)的應(yīng)用程序必須支持這種復(fù)合構(gòu)成方式

          使用目錄服務(wù)API的Java開(kāi)發(fā)人員獲得的好處不僅在于API獨(dú)立于特定的目錄或命名服務(wù),而且可以通過(guò)多層的命名方案無(wú)縫訪問(wèn) (seamless acess)目錄對(duì)象。實(shí)際上,
          任何的應(yīng)用程序都可以將自身的對(duì)象和特定的命名綁定起來(lái),這種功能可以使到任何的Java程序查找和獲取任何類型的對(duì)象

          終端用戶可以方便地使用邏輯名稱從而輕易地在網(wǎng)絡(luò)上查找和識(shí)別各種不同的對(duì)象,目錄服務(wù)的開(kāi)發(fā)人員可以使用API方便地在不同的客服端之間切換而不需要作任何更改


          三、數(shù)據(jù)源和連接池的關(guān)系:
          JDBC2.0提供了javax.sql.DataSource接口,它負(fù)責(zé)建立與數(shù)據(jù)庫(kù)的連接,在應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí)不需要編寫連接數(shù)據(jù)庫(kù)的代碼,可以直接從數(shù)據(jù)源獲得數(shù)據(jù)庫(kù)連接。
           
          在DataSource中事先建立了多個(gè)數(shù)據(jù)庫(kù)連接,這些數(shù)據(jù)庫(kù)連接保存在連接池(Connect Pool)中。Java程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí),只需要從連接池中取出空閑狀態(tài)的數(shù)據(jù)庫(kù)連接;
          當(dāng)程序訪問(wèn)數(shù)據(jù)庫(kù)結(jié)束,再將數(shù)據(jù)庫(kù)連接放回連接池。


          四、數(shù)據(jù)源和JNDI的關(guān)系:
          DataSource對(duì)象是由Tomcat提供的,因此不能在程序中采用創(chuàng)建一個(gè)實(shí)例的方式來(lái)生產(chǎn)DataSource對(duì)象,而需要采用Java的另一個(gè)技術(shù)JNDI,來(lái)獲得DataSource對(duì)象的引用。

          Tomcat把DataSource作為一種可以配置的JNDI資源來(lái)處理。生成DataSource對(duì)象的工廠為org.apache.commons.dbcp.BasicDataSourceFactory。

          在javax.naming包中提供了Context接口,該接口提供了將對(duì)象和名字綁定,以及通過(guò)名字檢索對(duì)象的方法。Context中的主要方法有:
          bind(String name,Object object):將對(duì)象與一個(gè)名字綁定
          lookup(String name):返回與指定的名字綁定的對(duì)象


          五、Tomcat中數(shù)據(jù)源的配置:
          數(shù)據(jù)源的配置涉及修改server.xml和web.xml,在server.xml中加入定義數(shù)據(jù)源的元素<Resource>,在web.xml加入<resource-ref>元素,聲明該Web應(yīng)用所引用的數(shù)據(jù)


          A.在server.xml中加入<Resource>元素:<Resource>元素用來(lái)定義JNDI Resource。
            
          屬性    描述
          name    指定Resource的JNDI名字
          auth    指定管理Resource的Manager,它有兩個(gè)可選值:Container、Application
          type    指定Resource所屬的Java類名

          <Resource name = "jdbc/BookDb" 
          auth = "Container" 
                  type = "javax.sql.DataSource" />

          B.在<Resource>元素中加入<ResourceParams>元素:<ResourceParams>元素用來(lái)指定各種參數(shù)值
            
          屬性    描述
          factory    指定生成的DataResource的factory類名
          maxActive    指定數(shù)據(jù)庫(kù)連接池中處于活動(dòng)狀態(tài)的最大連接數(shù)目,0表示不受限制
          maxIdle    指定數(shù)據(jù)庫(kù)連接池中處于空閑狀態(tài)的最大連接數(shù)目,0表示不受限制
          maxWait    指定連接池中連接處于空閑狀態(tài)的最長(zhǎng)時(shí)間,超過(guò)會(huì)拋出異常,-1表示無(wú)限
          username    指定連接數(shù)據(jù)庫(kù)的用戶名
          password    指定連接數(shù)據(jù)庫(kù)的口令
          driverClassName    指定連接數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序
          url             指定連接數(shù)據(jù)庫(kù)的URL

             <ResourceParams name = "jdbc/BookDb">

              <parameter>
                 <name>factory</name>
                 <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
              </parameter>

              <parameter>
                 <name>maxActive</name>
                 <value>100</value>
              </parameter>

              <parameter>
                 <name>maxIdle</name>
                 <value>30</value>
              </parameter>

              <parameter>
                 <name>maxWait</name>
                 <value>10000</value>
              </parameter>

              <parameter>
                 <name>username</name>
                 <value>user</value>
              </parameter>

              <parameter>
                 <name>password</name>
                 <value>1234</value>
              </parameter> 

              <parameter>
                 <name>driverClassName</name>
                 <value>com.mysql.jdbc.Driver</value>
              </parameter>

              <parameter>
                 <name>url</name>
                 <value>jdbc:mysql//localhost:3306/BookDb?autoReconnect=true</value>
              </parameter> 

          </ResourceParams>

          C.在web.xml中加入<resource-ref>元素:<resource-ref>元素表示在Web應(yīng)用中引用JNDI資源
            
          屬性                  描述
          description    對(duì)所引用的資源的說(shuō)明
          res-ref-name    指定所引用資源的JNDI名字,與<Resource>元素中的name屬性對(duì)應(yīng)
          res-type             指定所引用資源的類名字,與<Resource>元素中的type屬性對(duì)應(yīng)
          res-auth             指定所引用資源的Manager,與<Resource>元素中的auth屬性對(duì)應(yīng)

           

          六、在Web應(yīng)用中使用數(shù)據(jù)源:
          javax.naming.Context提供了查找JNDI Resource的接口,可以通過(guò)三個(gè)步驟來(lái)使用數(shù)據(jù)源對(duì)象:

          A.獲得對(duì)數(shù)據(jù)源的引用:
              Context ctx = new InitalContext();
          DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/BookDb");

              B.獲得數(shù)據(jù)庫(kù)連接對(duì)象:
                  Connection con = ds.getConnection();
            
              C.返回?cái)?shù)據(jù)庫(kù)連接到連接池:
                  con.close();

           

          在連接池中使用close()方法和在非連接池中使用close()方法的區(qū)別是:前者僅僅是把數(shù)據(jù)庫(kù)連接對(duì)象返回到數(shù)據(jù)庫(kù)連接池中,
          是連接對(duì)象又恢復(fù)到空閑狀態(tài),而非關(guān)閉數(shù)據(jù)庫(kù)連接,而后者將直接關(guān)閉和數(shù)據(jù)庫(kù)的連接


          七、發(fā)布使用數(shù)據(jù)源的Web應(yīng)用:
            如果直接同JDBC訪問(wèn)數(shù)據(jù)庫(kù),可以把JDBC驅(qū)動(dòng)程序拷貝到Web應(yīng)用的WEB-INF/lib目錄或者Tomcat安裝目錄下的common/lib目錄下。
            
            如果通過(guò)數(shù)據(jù)源訪問(wèn)數(shù)據(jù)庫(kù),由于數(shù)據(jù)源由Servlet容器創(chuàng)建并維護(hù),所以必須把JDBC驅(qū)動(dòng)程序拷貝到Tomcat安裝目錄下的common/lib目錄下,確保Servlet容器能夠訪問(wèn)驅(qū)動(dòng)程序。


          數(shù)據(jù)庫(kù)連接池的主要操作如下:
            
           ?。?)建立數(shù)據(jù)庫(kù)連接池對(duì)象(服務(wù)器啟動(dòng))。
            
           ?。?)按照事先指定的參數(shù)創(chuàng)建初始數(shù)量的數(shù)據(jù)庫(kù)連接(即:空閑連接數(shù))。
            
            (3)對(duì)于一個(gè)數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求,直接從連接池中得到一個(gè)連接。假如數(shù)據(jù)庫(kù)連接池對(duì)象中沒(méi)有空閑的連接,且連接數(shù)沒(méi)有達(dá)到最大(即:最大活躍連接數(shù)),創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接。
            
           ?。?)存取數(shù)據(jù)庫(kù)。
            
            (5)關(guān)閉數(shù)據(jù)庫(kù),釋放所有數(shù)據(jù)庫(kù)連接(此時(shí)的關(guān)閉數(shù)據(jù)庫(kù)連接,并非真正關(guān)閉,而是將其放入空閑隊(duì)列中。如實(shí)際空閑連接數(shù)大于初始空閑連接數(shù)則釋放連接)。
            
            (6)釋放數(shù)據(jù)庫(kù)連接池對(duì)象(服務(wù)器停止、維護(hù)期間,釋放數(shù)據(jù)庫(kù)連接池對(duì)象,并釋放所有連接)。

          posted @ 2012-05-23 10:59 順其自然EVO 閱讀(661) | 評(píng)論 (0)編輯 收藏

          軟件測(cè)試Bug之優(yōu)先級(jí)

           Bug的優(yōu)先級(jí)是bug管理過(guò)程中必須考慮的問(wèn)題。對(duì)于優(yōu)先級(jí)的劃分,不同的軟件公司有自身的一套制度,因此筆者介紹的也僅僅是自己比較喜歡的一種方式。

            為了便于bug的提交和管理,也為了方便于與開(kāi)發(fā)人員進(jìn)行交流,筆者傾向于在項(xiàng)目中將bug劃分為三個(gè)等級(jí),而不是網(wǎng)絡(luò)上流傳的五等級(jí)版本甚至七等級(jí)版本(在成熟的軟件組織中,使用更細(xì)的bug等級(jí)劃分有利于bug分類,質(zhì)量評(píng)審等工作的順利進(jìn)行)。這三個(gè)優(yōu)先級(jí)分別即優(yōu)先級(jí)1(嚴(yán)重的),優(yōu)先級(jí)2(比較嚴(yán)重的)和優(yōu)先級(jí)3(一般的)。

            筆者劃分bug等級(jí)的指導(dǎo)思想很簡(jiǎn)單,嚴(yán)重影響測(cè)試執(zhí)行的bug是最嚴(yán)重的,即優(yōu)先級(jí)1 的bug,除此之外所有導(dǎo)致應(yīng)用程序崩潰掉的bug也列入到優(yōu)先級(jí)1中;其他功能性bug列入比較嚴(yán)重的bug的隊(duì)伍,即優(yōu)先級(jí)2;界面上的bug列為一般的,即優(yōu)先級(jí)3。

            作者在實(shí)踐過(guò)程中推行的就是這種bug分級(jí)制度。這種分級(jí)制度看起來(lái)過(guò)于主觀,而不像網(wǎng)絡(luò)上流傳的各個(gè)bug優(yōu)先級(jí)劃分的版本中,將每個(gè)優(yōu)先級(jí)的bug的表現(xiàn)都一五一十列出來(lái),如下是筆者以前使用到一個(gè)bug優(yōu)先級(jí)劃分文檔中列出的優(yōu)先級(jí)1的bug特征:

            a)應(yīng)用程序某個(gè)模塊功能未實(shí)現(xiàn)(包括整個(gè)模塊不能運(yùn)行)

            b)用戶的信息被破壞或者丟失

            c)可重現(xiàn)的不可避免的崩潰,死鎖

            d)功能和性能急劇衰退

            e)嚴(yán)重的內(nèi)存泄漏

            f)導(dǎo)致功能無(wú)法正常使用的UI設(shè)計(jì)(UI響應(yīng)遲緩)

            g)其他

            的確,這些bug優(yōu)先級(jí)劃分很明確,讓人一目了然并且覺(jué)得很有道理,可是拿到實(shí)際中一用,麻煩開(kāi)始來(lái)了。因?yàn)槟承┟枋鋈匀徊粔蛟敿?xì),含混不清的描述諸如“功能和性能急劇衰退”,碰到這種描述,不同的人會(huì)有不同的理解,而不同的理解必然會(huì)帶來(lái)各種各樣的問(wèn)題。因此,筆者在實(shí)踐中逐漸摒棄了這種做法(當(dāng)然,筆者并不排除將來(lái)可能還是會(huì)回到一些比較正規(guī)的管理方法上來(lái),但是目前這種“標(biāo)準(zhǔn)”方法并不適合筆者所在的公司~),并開(kāi)始逐步推廣筆者自己剛才提到的粗放式bug優(yōu)先級(jí)劃分方法。

            對(duì)于該劃分方法,筆者還需要進(jìn)一步的說(shuō)明。筆者剛才提到的“嚴(yán)重影響測(cè)試執(zhí)行的bug”其實(shí)也是指系統(tǒng)的基本功能或者核心功能,比如新建編輯刪除功能中,對(duì)于同樣是信息為保存到數(shù)據(jù)庫(kù)——即新建后記錄未添加到數(shù)據(jù)庫(kù),編輯后記錄未更新,刪除后數(shù)據(jù)仍然存在于數(shù)據(jù)庫(kù)中——這時(shí)候筆者僅僅將新建功能的該bug置于優(yōu)先級(jí)1中,編輯刪除bug則置于優(yōu)先級(jí)2中。這種方法與很多正統(tǒng)的方法很不一致,因?yàn)樵诤芏鄤澐址椒ㄖ?#8220;信息未保存”都是優(yōu)先級(jí)1的bug。但是筆者自認(rèn)為這樣做是有理由的:當(dāng)新建功能發(fā)生該類型bug而編輯刪除功能正常時(shí),編輯刪除功能仍然無(wú)法測(cè)試或者實(shí)現(xiàn)(因?yàn)闆](méi)有數(shù)據(jù)?。?,這在客戶的江渡看來(lái)會(huì)直接視為新建編輯刪除功能均未實(shí)現(xiàn)。新建功能正常而編輯或者刪除功能失效,則不會(huì)影響到其他功能的使用(當(dāng)僅編輯功能失效的時(shí)候,新建和刪除功能并不會(huì)受到影響),測(cè)試人員仍然進(jìn)行新建刪除功能的功能測(cè)試,客戶依然可以使用新建和刪除功能。

            當(dāng)然,筆者使用上面的劃分方式還有其他的原因——基于bug管理和測(cè)試開(kāi)發(fā)工作的順利推進(jìn)。讀者可能會(huì)注意到,使用上面的bug劃分方式會(huì)減少優(yōu)先級(jí)1的bug的數(shù)量,筆者這樣做是因?yàn)楣P者在bug管理中推介的方式是優(yōu)先級(jí)1的bug不允許推遲到下一個(gè)工作日修改。試想,如果優(yōu)先級(jí)1的bug的數(shù)量如果過(guò)多自然會(huì)導(dǎo)致這種管理方式推行的極大阻力——沒(méi)有哪個(gè)開(kāi)發(fā)人員會(huì)喜歡讓自己一整天的時(shí)間花費(fèi)在修復(fù)bug上。當(dāng)我們提交的優(yōu)先級(jí)1的bug都是非常緊急的,會(huì)影響到開(kāi)發(fā)或者測(cè)試的進(jìn)度的話,開(kāi)發(fā)人員就自知理虧不得不去修復(fù)這些bug了,這就保證了即使到了項(xiàng)目很急迫的時(shí)間,我們項(xiàng)目的主體功能還是穩(wěn)定可用的,并有效遏制了嚴(yán)重bug的生存期。

            對(duì)于優(yōu)先級(jí)2與優(yōu)先級(jí)3 的劃分點(diǎn),只是筆者個(gè)人看法,因?yàn)楣P者目前所經(jīng)歷的項(xiàng)目都是功能性為主,因此對(duì)于UI相關(guān)的要求相對(duì)較低,因此筆者采取了這種粗放的方式(將UI相關(guān)bug歸納為優(yōu)先級(jí)3,其他的非UI的非優(yōu)先級(jí)1的bug全部塞到優(yōu)先級(jí)2 的集裝箱中~)。

            PS:感謝下面一位同仁的回復(fù),優(yōu)先級(jí)1類的bug還應(yīng)該包括功能嚴(yán)重不符合產(chǎn)品說(shuō)明書(shū)這種類型的bug。

            以上為個(gè)人意見(jiàn),如有意見(jiàn)建議,歡迎一起交流。

          posted @ 2012-05-23 10:07 順其自然EVO 閱讀(977) | 評(píng)論 (0)編輯 收藏

          Linux中的兩種文件鎖——協(xié)同鎖與強(qiáng)制鎖

           Linux文件鎖的示例

            為了理解文件鎖是如何工作的,我們建立程序文件file_lock.c:

          #include <stdio.h>
          #include <fcntl.h>
            
          int main(int argc, char **argv) {
            if (argc > 1) {
              int fd = open(argv[1], O_WRONLY);
              if(fd == -1) {
                printf("Unable to open the file\n");
                exit(1);
              }
              static struct flock lock;
            
              lock.l_type = F_WRLCK;
              lock.l_start = 0;
              lock.l_whence = SEEK_SET;
              lock.l_len = 0;
              lock.l_pid = getpid();
            
              int ret = fcntl(fd, F_SETLKW, &lock);
              printf("Return value of fcntl:%d\n",ret);
              if(ret==0) {
                while (1) {
                  scanf("%c", NULL);
                }
              }
            }
          }

            用gcc編譯此程序:

          # cc -o file_lock file_lock.c

            使用mount命令帶“mand”參數(shù)來(lái)重新掛載根文件系統(tǒng),如下所示。這將在文件系統(tǒng)級(jí)別使能強(qiáng)制鎖功能。

            注意:你必須切換到root用戶才能執(zhí)行下面的命令。

          # mount -oremount,mand /

            在可執(zhí)行的(file_lock所在的)目錄中創(chuàng)建兩個(gè)名為“advisory.txt”和“mandatory.txt”的文件。對(duì)于“mandatory.txt”使能Set-Group-ID,同時(shí)不使能Group-Execute-Bit,如下所示:

          # touch advisory.txt
          # touch mandatory.txt
          # chmod g+s,g-x mandatory.txt

            測(cè)試協(xié)同鎖:執(zhí)行示例程序,以“advisory.txt”作為參數(shù)。

          # ./file_lock advisory.txt

            此程序?qū)⒌却脩舻妮斎?。從另一個(gè)終端或控制臺(tái),嘗試輸入以下命令行:

          # ls >>advisory.txt

            在上面的例子中,ls命令會(huì)將其輸出寫入到advisory.txt文件中。即使我們獲得了一個(gè)寫入鎖,仍然會(huì)有一些進(jìn)程(非合作)能夠往文件里寫入數(shù)據(jù)。這就是所謂的“協(xié)同”鎖。

            測(cè)試強(qiáng)制鎖:再次執(zhí)行示例程序,以“mandatory.txt”作為參數(shù)。

          # ./file_lock mandatory.txt

            從另一個(gè)終端或控制臺(tái),嘗試輸入以下命令行:

          # ls >>mandatory.txt

            在上面的例子中,ls命令在將其輸出寫入到mandatory.txt文件之前,會(huì)等待文件鎖被刪除。雖然它仍然是一個(gè)非合作進(jìn)程,但強(qiáng)制鎖起了作用。

           文件鎖是一種文件讀寫機(jī)制,在任何特定的時(shí)間只允許一個(gè)進(jìn)程訪問(wèn)一個(gè)文件。利用這種機(jī)制能夠使讀寫單個(gè)文件的過(guò)程變得更安全。

            在這篇文章中,我們將探討Linux中不同類型的文件鎖,并通過(guò)示例程序來(lái)理解它們之間的不同之處。

            我們將采取以下的例子來(lái)解釋為什么需要使用文件鎖。

            1、進(jìn)程“A”打開(kāi)和讀取一個(gè)文件,此文件包含賬戶相關(guān)的一些信息。

            2、進(jìn)程“B”也打開(kāi)了這個(gè)文件,并讀取了文件中的信息。

            3、現(xiàn)在,進(jìn)程“A”更改了其副本中的一條余額記錄,并將其寫入文件。

            4、此時(shí),進(jìn)程“B”并不知道上次讀取的文件已經(jīng)被更改,它還保存著原始的文件副本。然后,進(jìn)程“B”更改了“A”操作的那條相同的記錄,并將記錄寫入文件。

            5、此時(shí),文件中將只保存了進(jìn)程“B”更改過(guò)的記錄。

            為了避免這種事情發(fā)生,就要使用文件鎖來(lái)確保操作的“序列化”。

            以下是Linux系統(tǒng)中兩種常用的文件鎖:

            1、協(xié)同鎖

            2、強(qiáng)制鎖

            1、協(xié)同鎖

            協(xié)同鎖要求參與操作的進(jìn)程之間協(xié)同合作。假設(shè)進(jìn)程“A”獲得一個(gè)WRITE鎖,并開(kāi)始向文件中寫入內(nèi)容;此時(shí),進(jìn)程“B”并沒(méi)有試圖獲取一個(gè)鎖,它仍然可以打開(kāi)文件并向文件中寫入內(nèi)容。在此過(guò)程中,進(jìn)程“B”就是一個(gè)非合作進(jìn)程。如果進(jìn)程“B”試圖獲取一個(gè)鎖,那么整個(gè)過(guò)程就是一個(gè)合作的過(guò)程,從而可以保證操作的“序列化”。

            只有當(dāng)參與操作的進(jìn)程是協(xié)同合作的時(shí)候,協(xié)同鎖才能發(fā)揮作用。協(xié)同鎖有時(shí)也被稱為“非強(qiáng)制”鎖。

            2、強(qiáng)制鎖

            強(qiáng)制鎖不需要參與操作的進(jìn)程之間保持協(xié)同合作。它利用內(nèi)核來(lái)查檢每個(gè)打開(kāi)、讀取、寫入操作,從而保證在調(diào)用這些操作時(shí)不違反文件上的鎖規(guī)則。關(guān)于強(qiáng)制鎖的更多信息,可以在kernal.org上找到。

            為了使能Linux中的強(qiáng)制鎖功能,你需要在文件系統(tǒng)級(jí)別上打開(kāi)它,同時(shí)在單個(gè)文件上打開(kāi)它。其步驟是:

            1、掛載文件系統(tǒng)時(shí)使用“-omand”參數(shù)。

            2、對(duì)于要打開(kāi)強(qiáng)制鎖功能的文件lock_file,必須打開(kāi)set-group-ID位,關(guān)閉group-execute位。(選擇此方法的原因是,當(dāng)你關(guān)閉group-execute時(shí),設(shè)置set-group-ID就沒(méi)有實(shí)際的意義了)

          posted @ 2012-05-23 09:32 順其自然EVO 閱讀(4106) | 評(píng)論 (0)編輯 收藏

          鳥(niǎo)也能飛:SQL數(shù)據(jù)庫(kù)實(shí)戰(zhàn)專業(yè)教程(一)

          寫在前面的話:這個(gè)教程本來(lái)是想重點(diǎn)介紹SQL數(shù)據(jù)庫(kù),但是寫著寫著發(fā)現(xiàn)已經(jīng)有很多關(guān)于數(shù)據(jù)的知識(shí)了,索性把項(xiàng)目整個(gè)開(kāi)發(fā)過(guò)程都寫了下來(lái)。由于時(shí)間確實(shí)很緊,教程收尾比較匆忙,感覺(jué)寫的很對(duì)不起大家,但是基本上一個(gè)項(xiàng)目的流程就這么多了(不包括后期測(cè)試),什么時(shí)候該做什么,該用什么工具,有什么技巧,都差不多說(shuō)到了,我的能力也就到這了。補(bǔ)充一點(diǎn):每個(gè)階段都要產(chǎn)生相應(yīng)的文檔,這可是非常重要的,真正做項(xiàng)目的時(shí)候不要忽略了!

            直到現(xiàn)在,接觸數(shù)據(jù)庫(kù)的時(shí)間大約有一年了,剛開(kāi)始用的時(shí)候真是一點(diǎn)也不懂,就那么硬生生的用,經(jīng)過(guò)一年的積累,雖然還算是小菜,但是也懂得點(diǎn)東西。為了整理知識(shí),同時(shí)幫助更多的人能更好的學(xué)習(xí)數(shù)據(jù)庫(kù),我決定把我學(xué)到的東西整理下來(lái)。鑒于網(wǎng)絡(luò)上有很多關(guān)于數(shù)據(jù)庫(kù)的教程,但很多都是孤立的知識(shí)點(diǎn),這樣初學(xué)者很難從整體上把握數(shù)據(jù)庫(kù),學(xué)習(xí)起來(lái)比較困難,也會(huì)產(chǎn)生一定的畏懼心理;同時(shí),面對(duì)網(wǎng)絡(luò)上繁多的資料,初學(xué)者往往很難正確選擇比較的好的方法,很可能掌握的是過(guò)時(shí)或者不太實(shí)用的技術(shù),當(dāng)然包括我在內(nèi)也是這樣。

            基于以上情況,本教程基于數(shù)據(jù)庫(kù)實(shí)際應(yīng)用,展示一個(gè)完整的數(shù)據(jù)庫(kù)項(xiàng)目開(kāi)發(fā)過(guò)程,其中會(huì)涉及一些數(shù)據(jù)庫(kù)設(shè)計(jì)的經(jīng)驗(yàn)技巧、項(xiàng)目開(kāi)發(fā)過(guò)程中一些工具的使用、三層架構(gòu)等。當(dāng)然,本人也是小菜,再加上時(shí)間有限,不可能把所有的知識(shí)點(diǎn)都說(shuō)到,一些基礎(chǔ)的知識(shí)一帶而過(guò),重在宏觀指導(dǎo),重在應(yīng)用體驗(yàn),細(xì)節(jié)讀者自己去百度或google。教程的目的是引導(dǎo)初學(xué)者成為一名專業(yè)的數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)者。本教程以SQL2005數(shù)據(jù)庫(kù)和C#為例,構(gòu)建一個(gè)簡(jiǎn)單的學(xué)生管理系統(tǒng)。本教程雖然為初級(jí)教程,但也不適合0基礎(chǔ)的童鞋,適合處于迷茫狀態(tài)的童鞋。廢話少說(shuō),進(jìn)入正題。

            一、為什么要選擇SQL數(shù)據(jù)庫(kù)。

            作為國(guó)際慣例,要先說(shuō)一下為什么要選擇SQL數(shù)據(jù)庫(kù)。其實(shí)也不是SQL數(shù)據(jù)庫(kù)有多好,比SQL優(yōu)秀的數(shù)據(jù)庫(kù)俺這種小菜就知道好幾個(gè),主要原因是SQL數(shù)據(jù)相對(duì)于其他數(shù)據(jù)庫(kù)較為簡(jiǎn)單,包括安裝、配置、使用,數(shù)據(jù)庫(kù)原理都是相同的,把這個(gè)學(xué)好了其他的也不成問(wèn)題;另一方面SQL數(shù)據(jù)庫(kù)已經(jīng)很專業(yè)了,學(xué)習(xí)的性價(jià)比高,總比學(xué)習(xí)Access數(shù)據(jù)庫(kù)要好吧?其實(shí),俺也只懂SQL而已。至于SQL數(shù)據(jù)庫(kù)具體是什么、有什么特點(diǎn),這個(gè)就留給讀者去尋找答案了,相信地球人都能找到。

            二、數(shù)據(jù)庫(kù)原理簡(jiǎn)介。

            數(shù)據(jù)庫(kù),顧名思義,就是存放數(shù)據(jù)的地方。SQL server 2005就是一個(gè)大型的數(shù)據(jù)庫(kù)管理系統(tǒng),在這個(gè)大型系統(tǒng)中我們可以建立很多數(shù)據(jù)庫(kù),用來(lái)為不同的程序服務(wù),一般一個(gè)應(yīng)用程序只有一個(gè)數(shù)據(jù)庫(kù)。有了數(shù)據(jù)庫(kù)就涉及數(shù)據(jù)具體內(nèi)容,SQL數(shù)據(jù)庫(kù)中包含了N個(gè)表,每個(gè)表都包括行和列,其中每個(gè)列叫做一個(gè)字段,每一行叫做一條記錄,就好像坐標(biāo)一樣,x軸是記錄,y軸是字段。字段是創(chuàng)建表時(shí)就定義好的,它有名稱和類型,這些字段連在一起就是一條記錄,所以理論上表可以有無(wú)限個(gè)記錄。一個(gè)數(shù)據(jù)庫(kù)中的N個(gè)表,通過(guò)關(guān)系聯(lián)系在一起,就是傳說(shuō)中的關(guān)系型數(shù)據(jù)庫(kù)。好像有些亂,下面來(lái)個(gè)圖:

            這些都是最基本的知識(shí),為什么要提這些?說(shuō)實(shí)話,我當(dāng)初是費(fèi)了好大勁才理解這個(gè)的,在這提出來(lái),就是想給讀者一些點(diǎn)播。

          三、權(quán)限配置。

            其實(shí)權(quán)限配置你完全不懂,也可以正常使用數(shù)據(jù)庫(kù),一般都是直接使用sa賬戶。作為一個(gè)完整的數(shù)據(jù)庫(kù)教程,并且號(hào)稱是專業(yè)的教程,必須涉及權(quán)限配置,可以不懂,但必須了解。

            SQL server作為一個(gè)數(shù)據(jù)庫(kù)平臺(tái),肯定不是給一個(gè)人用的,既然多人使用,就要涉及權(quán)限問(wèn)題。比如A用戶不能隨意更改B用戶的數(shù)據(jù)庫(kù)、作為用戶的A不能有系統(tǒng)管理員的權(quán)限等。說(shuō)道權(quán)限就不得不提角色,什么是角色呢?簡(jiǎn)單的講,就是某些權(quán)限的集合,也可以說(shuō)是一組權(quán)限。這樣一來(lái),想讓某個(gè)用戶具有某類功能,只要指定角色就可以了,而不用一個(gè)一個(gè)的去分配權(quán)限,這樣使權(quán)限分配變得更加快捷方便,并且有統(tǒng)一性。

            SQL server中的角色圖:

            需要注意的是,服務(wù)器角色是在整個(gè)SQL平臺(tái)層面上的角色,它只有固定角色(系統(tǒng)定義好的權(quán)限組);數(shù)據(jù)庫(kù)角色是數(shù)據(jù)庫(kù)層次上的角色,一個(gè)用戶是A數(shù)據(jù)庫(kù)的db_owner角色,不一定是B數(shù)據(jù)庫(kù)的db_owner角色,它分為固定角色和自定義角色。

            學(xué)習(xí)這些現(xiàn)在可能用不到,但是權(quán)限管理作為數(shù)據(jù)庫(kù)一個(gè)重要特色,在將來(lái)的工作中一定有用武之地?,F(xiàn)在看不懂也沒(méi)事,了解即可。在這只列舉了角色類型,并沒(méi)有給出創(chuàng)建方法,google吧!

          posted @ 2012-05-23 09:31 順其自然EVO 閱讀(213) | 評(píng)論 (0)編輯 收藏

          程序員的7個(gè)壞習(xí)慣

            1、所有的代碼都是垃圾,除了我的以外

            哥們兒,我有一個(gè)壞消息要告訴你,你的代碼很垃圾。不管你花費(fèi)了多少精力,總是有很多程序員認(rèn)為你的代碼是垃圾,他們可以比你做的10倍更好。

            怎么解決:不要只顧著批評(píng),你也是寫代碼的人。嘗試去客觀的評(píng)價(jià),而不是審判!謙虛一點(diǎn)。

            2、“馬上搞定”帶來(lái)的災(zāi)難

            大家都喜歡走捷徑,每個(gè)人都做過(guò)。有時(shí)候走捷徑是必須的,但是大部分情況下走捷徑是危險(xiǎn)的,非常危險(xiǎn),所以我們應(yīng)該盡量避免。一個(gè)捷徑可能省了你幾個(gè)小時(shí)的時(shí)間,但是可能為你帶來(lái)幾個(gè)月的痛苦。

            怎么解決:不要一個(gè)人偷偷的把事情搞定,而是和別人商量,請(qǐng)別人檢查你的工作。假如你要采取捷徑的方法,請(qǐng)必須經(jīng)過(guò)所有相關(guān)人員,包括你的經(jīng)理的同意。

            3、錯(cuò)誤的估算時(shí)間

            我住在巴塞羅那,我們那里有非常有名的 Sagrada Familia 教堂。它出名的原因是因?yàn)樗浅>?,并且預(yù)計(jì)的建造時(shí)間非常長(zhǎng),從1882年開(kāi)始。我想這個(gè)項(xiàng)目在做時(shí)間預(yù)算的時(shí)候沒(méi)有程序員參與,否則建造完成時(shí)間可能是兩個(gè)禮拜。

            怎么解決:首先,準(zhǔn)確的預(yù)估軟件開(kāi)發(fā)的時(shí)間是不可能的,我們只能猜。在開(kāi)發(fā)的過(guò)程中你可能遇到各種你沒(méi)有遇見(jiàn)的問(wèn)題,所以我們往往在預(yù)估的時(shí)間上乘以2。

            4、盲目自大

            程序員之間的討論有時(shí)候看起來(lái)像是公雞打架而不是人類談話。這往往發(fā)生在設(shè)計(jì)和架構(gòu)的會(huì)議上。在你的眼里,其他人的意見(jiàn)都是扯蛋,扯蛋,扯蛋……

            怎么解決:把自大留在家里,冷靜的聽(tīng)聽(tīng)別人在說(shuō)什么,再做決定。

            5、“這不是我干的!”

            我們總是給自己找借口。我們往往給自己開(kāi)脫,比如在正常情況下,我永遠(yuǎn)也不會(huì)犯那樣的錯(cuò)誤云云。

            怎么解決:誰(shuí)都會(huì)犯錯(cuò)誤,調(diào)整你的態(tài)度,“是的,這是我的問(wèn)題,我們現(xiàn)在需要修復(fù)它”就是一種非常專業(yè)的態(tài)度。它會(huì)幫助你建立你的聲望,并獲得同事的好感。

            6、缺乏耐心

            雖然重復(fù)的簡(jiǎn)單工作很枯燥,但是那也是必須完成的任務(wù)。程序員往往抵制,反感這些任務(wù),導(dǎo)致工作效率低下。

            怎么解決:紀(jì)律!記住,再激動(dòng)人心的項(xiàng)目也有枯燥無(wú)味的任務(wù)要完成!

            7、不成熟

            如果編程是做愛(ài)的話,一定有很多沒(méi)有被滿足的電腦。你不能簡(jiǎn)單的進(jìn)入,做到一半然后就睡覺(jué)了。很多程序員都沒(méi)有搞明白“完成”是什么概念。請(qǐng)記?。和瓿梢馕吨?a target="_self" style="word-break: break-all; color: #202859; text-decoration: none; line-height: normal !important; ">測(cè)試通過(guò)(不僅僅是單元測(cè)試),文檔完整,提交,合并……

            怎么解決:這一條很難,很多看起來(lái)不必要的任務(wù)加在一起很復(fù)雜。但這是完成一個(gè)項(xiàng)目所必須的工作,需要通過(guò)紀(jì)律和訓(xùn)練來(lái)完成。

          posted @ 2012-05-23 09:25 順其自然EVO 閱讀(194) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共394頁(yè): First 上一頁(yè) 324 325 326 327 328 329 330 331 332 下一頁(yè) Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 阿拉尔市| 三江| 汉中市| 二连浩特市| 汉沽区| 怀宁县| 平泉县| 上高县| 盐池县| 犍为县| 云林县| 安阳市| 金乡县| 疏附县| 疏勒县| 彭水| 囊谦县| 牡丹江市| 曲周县| 阿克| 沐川县| 吉首市| 勃利县| 枣强县| 云龙县| 南康市| 京山县| 根河市| 桃园市| 平湖市| 同德县| 绥宁县| 平乡县| 封开县| 临夏市| 衡南县| 恩平市| 库尔勒市| 沂水县| 大新县| 龙里县|