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

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

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

    qileilove

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

    對(duì)比AppScan Source和Fortify掃描AltoroJ的結(jié)果

    1、漏洞總數(shù)
      AppScan Source:91
      Fortify:121
      2、Disclaimer.htm:34(Cross-Site Scripting:DOM)的漏洞Fortify能掃描出來(lái),AppScan Source掃描不出來(lái)
      另外,F(xiàn)ortify能掃描出比較多Persistent類(lèi)型的XSS漏洞
      并且歸類(lèi)比較好(分DOM、Persistent、Reflected類(lèi)型列出)
      3、AdminLoginServlet.java:35(Password Management:Hardcoded Password)的漏洞Fortify能掃描出來(lái),AppScan Source掃描不出來(lái)
      4、Fortify掃出的DBUtil.java:238(Access Control:Database)在AppScan中被歸類(lèi)到SQL Injection
      5、admin.jsp:18(Password Management:Empty Password)屬于誤報(bào)
    <script language="javascript">
    function confirmpass(myform)
    {
    if (myform.password1.value.length && (myform.password1.value==myform.password2.value))
    {
    return true;
    }
    else
    {
    myform.password1.value="";
    myform.password2.value="";
    myform.password1.focus();
    alert ("Passwords do not match");
    return false;
    }
    }
    </script>
      6、Fortify會(huì)報(bào)比較多這類(lèi)問(wèn)題:
    Code Correctness:Class Does Not Implement equals
    Hardcoded Domain in HTML
    Hidden Field
    J2EE Bad Practices
    J2EE Misconfiguration
    Missing Check against Null
    Password Management:Password in Comment
    Poor Error Handling
    System Information Leak:Incomplete Servlet Error Handling
      7、Fortify會(huì)報(bào)比較多transfer.jsp:32(Cross-Site Request Forgery)這類(lèi)CSRF的問(wèn)題,而AppScan Source沒(méi)有掃出來(lái)
      8、Fortify有掃出ServletUtil.java(Missing XML Validation)的問(wèn)題,而AppScan Source沒(méi)有掃出來(lái)
      9、Fortify有掃出AdminServlet.java:65(Redundant Null Check)的問(wèn)題,而AppScan Source沒(méi)有掃出來(lái)

    posted @ 2014-09-16 09:50 順其自然EVO 閱讀(1524) | 評(píng)論 (0)編輯 收藏

    Junit單元測(cè)試筆記

    什么是單元測(cè)試
      單元測(cè)試是開(kāi)發(fā)者編寫(xiě)的一小段代碼,用于檢驗(yàn)被測(cè)代碼的一個(gè)很小的、很明確的功能是否正確。
      單元測(cè)試目的?
      執(zhí)行單元測(cè)試,是為了證明某段代碼的行為確實(shí)和開(kāi)發(fā)者所期望的一致。
      白盒測(cè)試和單元測(cè)試的區(qū)別:
      1 測(cè)試目的,一個(gè)是測(cè)試程序的整體邏輯,另一個(gè)是測(cè)試程序中一個(gè)獨(dú)立的模塊
      2 通常的執(zhí)行人員不一樣,白盒一般是由專(zhuān)門(mén)的白盒測(cè)試人員完成,單元測(cè)試一般由程序員自己完
      計(jì)劃你的單元測(cè)試:
      設(shè)計(jì)一系列的輸入和預(yù)期結(jié)果
      Eclipse中使用Junit:
      eclipse中已經(jīng)內(nèi)置Junit,無(wú)需自己再安裝
      選擇一個(gè)需要單元測(cè)試的工程,右鍵點(diǎn)擊Properties
      添加Junit依賴(lài)
      選擇Junit
    新建一個(gè)單元測(cè)試類(lèi)
      運(yùn)行單元測(cè)試
      單元測(cè)試結(jié)果
      單元測(cè)試標(biāo)注
      @Test標(biāo)注,以表明這是一個(gè)測(cè)試方法。
      @Ignore標(biāo)注,這個(gè)標(biāo)注的含義就是某些方法尚未完成,暫不參與此次測(cè)試
      @Before 標(biāo)注,在任何一個(gè)測(cè)試執(zhí)行之前必須執(zhí)行的代碼,就是一個(gè)Fixture。
      @After標(biāo)注,在任何測(cè)試執(zhí)行之后需要進(jìn)行的收尾工作的代碼,也是一個(gè)Fixture。
      Junit一些高級(jí)特性
      (1)限時(shí)測(cè)試
      @Test(timeout  =   1000 )
      timeout 參數(shù)表明了你要設(shè)定的時(shí)間,單位為毫秒,
      (2)參數(shù)化測(cè)試
      只寫(xiě)一個(gè)測(cè)試函數(shù),把這若干種情況作為參數(shù)傳遞進(jìn)去,一次性的完成測(cè)試。
      PS:其實(shí)就是測(cè)試一個(gè)單元的多種參數(shù)的情況。

    posted @ 2014-09-16 09:48 順其自然EVO 閱讀(159) | 評(píng)論 (0)編輯 收藏

    怎樣選擇配置管理工具

    每一個(gè)軟件項(xiàng)目,不管是project類(lèi)項(xiàng)目,還是產(chǎn)品類(lèi)項(xiàng)目,都必須經(jīng)歷需求分析、系統(tǒng)設(shè)計(jì)、編碼實(shí)現(xiàn)、集成測(cè)試、部署、交付、維護(hù)和支持的過(guò)程。在這個(gè)過(guò)程中,將生成各種各樣不同的工件,包含文檔、源程序、可執(zhí)行代碼、支持庫(kù)。更可怕的是,頻繁出現(xiàn)的變更是不可避免的,因此面向如此龐大且不斷變動(dòng)的信息集,怎樣使其有序、高效地存放、查找和利用就成為了一個(gè)突出的問(wèn)題。
      針對(duì)這一問(wèn)題,最早的開(kāi)發(fā)者嘗試過(guò)的解決的方法是通過(guò)手工來(lái)實(shí)現(xiàn):
      1)文檔:每次改動(dòng)時(shí)都另存為一個(gè)新的文件,然后通過(guò)文件名稱(chēng)進(jìn)行區(qū)分,比如 "XXX 軟件需求說(shuō)明書(shū)V1.0, XXX軟件需求說(shuō)明書(shū)V1.1, XXX 軟件需求說(shuō)明書(shū)V2.0.",并且在文件里注明每次版本號(hào)變化的內(nèi)容;
      2) 源碼:每次要改動(dòng)時(shí)就將整個(gè)project文件夾復(fù)制一份,將原來(lái)的文件夾進(jìn)行改名,比如 "XX 項(xiàng)目V1.0、 XX 項(xiàng)目1.01、 .",然后在新的文件夾中進(jìn)行改動(dòng);
      可是這樣的方法,不僅十分繁瑣,easy出錯(cuò),并且會(huì)帶來(lái)大量的垃圾數(shù)據(jù)。假設(shè)是團(tuán)隊(duì)協(xié)同開(kāi)發(fā)或者是項(xiàng)目規(guī)模較大時(shí),還是會(huì)造成非常大的混亂。非常顯然,這樣簡(jiǎn)陋的方法是無(wú)法應(yīng)對(duì)這一問(wèn)題的。
      后來(lái),有人嘗試從制造工業(yè)領(lǐng)域引入了" 配置管理"這一概念,通過(guò)不懈的研究與實(shí)踐,終于形成了一套管理辦法和活動(dòng)原則,這也就是軟件配置管理。
      通過(guò)軟件配置管理,將對(duì)軟件系統(tǒng)中的多重版本號(hào)實(shí)施系統(tǒng)的管理;全面記載系統(tǒng)開(kāi)發(fā)的歷史過(guò)程,包含為什么改動(dòng),誰(shuí)作了改動(dòng),改動(dòng)了什么;管理和追蹤開(kāi)發(fā)過(guò)程中危害軟件質(zhì)量以及影響開(kāi)發(fā)周期的缺陷和變化。并對(duì)開(kāi)發(fā)過(guò)程進(jìn)行有效地管理和控制,完整、明白地記載開(kāi)發(fā)過(guò)程中的歷史變更,形成規(guī)范化的文檔,不僅使日后的維護(hù)和升級(jí)得到保證,并且更重要的是,這還會(huì)保護(hù)寶貴的代碼資源,積累軟件財(cái)富,提高軟件重用率,加快投資回報(bào)。
      常見(jiàn)的配置管理工具
      正如前面所述,因?yàn)檐浖渲霉芾磉^(guò)程十分繁雜,管理對(duì)象錯(cuò)綜復(fù)雜,假設(shè)是採(cǎi)用人工的辦法不僅費(fèi)時(shí)費(fèi)力,還easy出錯(cuò),產(chǎn)生大量的廢品。因此,引入一些自己主動(dòng)化工具是十分有裨益的,這也是做好配置管理的必要條件。
      正是因?yàn)槿绱耍袌?chǎng)上出現(xiàn)了大量的自己主動(dòng)化配置管理工具,這些工具的實(shí)現(xiàn)原理與基本機(jī)制均十分接近,但因?yàn)槠涠ㄎ徊煌虼烁饔刑攸c(diǎn),下面我們就對(duì)一些常見(jiàn)的配置管理工具做一簡(jiǎn)單的介紹。
      元老:CCC 、SCCS、 RCS
      上個(gè)世紀(jì)七十年代初期加利福利亞大學(xué)的Leon Presser 教授撰寫(xiě)了一篇論文,提出控制變更和配置的概念,之后在1975年,他成立了一家名為 SoftTool的公司,開(kāi)發(fā)了自己的配置管理工具:CCC,這也是最早的配置管理工具之中的一個(gè)。
      在軟件配置管理工具發(fā)展史上,繼CCC之后,最具有里程碑式的是兩個(gè)自由軟件: Marc Rochkind 的SCCS (Source Code Control System) 和 Walter Tichy 的RCS (Revision Control System),它們對(duì)配置管理工具的發(fā)展做出了重大的貢獻(xiàn),直到如今絕大多數(shù)配置管理工具基本上都源于它們的設(shè)計(jì)思想和體系架構(gòu)。
      中堅(jiān):Rational ClearCase
      Rational 公司是全球最大的軟件CASE 工具提供商,現(xiàn)已被IBM 收購(gòu)。或許是受到其拳頭產(chǎn)品、可視化建模第一工具Rose 的影響,它開(kāi)發(fā)的配置管理工具ClearCase 也是深受用戶的喜愛(ài),是如今應(yīng)用面最廣的企業(yè)級(jí)、跨平臺(tái)的配置管理工具之中的一個(gè)。
      ClearCase提供了比較全面的配置管理支持,當(dāng)中包含版本號(hào)控制、工作空間管理、Build管理等,并且開(kāi)發(fā)者無(wú)需針對(duì)其改變現(xiàn)有的環(huán)境、工具和工作方式。
      其最大的缺點(diǎn)就在于其價(jià)格不菲,每一個(gè)client用戶許可證大約須要幾千美金,所以在國(guó)內(nèi)應(yīng)用群體有限。
      1) 版本號(hào)控制
      ClearCase 不僅能夠?qū)ξ募⑽募A、鏈接進(jìn)行版本號(hào)控制,同一時(shí)候還提供了先進(jìn)的版本號(hào)分支和歸本功能用于支持并行開(kāi)發(fā)。另外,它還支持廣泛的文件類(lèi)型。
      2)工作空間管理
      能夠?yàn)殚_(kāi)發(fā)者提供私人存儲(chǔ)區(qū),同一時(shí)候能夠?qū)崿F(xiàn)成員之間的信息共享,從而為每一位開(kāi)發(fā)者提供一致、靈活、可重用的工作空間域。
      3) Build管理
      對(duì)ClearCase 控制的數(shù)據(jù),既能夠使用定制腳本,也可使用本機(jī)提供的make 程序。
      其最大的缺點(diǎn)就在于其價(jià)格不菲,每一個(gè)client用戶許可證大約須要幾千美金,所以在國(guó)內(nèi)應(yīng)用群體有限。
      新秀:Hansky Firefly
      做為Hansky公司軟件開(kāi)發(fā)管理套件中重要一員的Firefly,能夠輕松管理、維護(hù)整個(gè)企業(yè)的軟件資產(chǎn),包含程序代碼和相關(guān)文檔。 Firefly是一個(gè)功能完好、執(zhí)行速度極快的軟件配置管理系統(tǒng),能夠支持不同的操作系統(tǒng)和多種集成開(kāi)發(fā)環(huán)境,因此它能在整個(gè)企業(yè)中的不同團(tuán)隊(duì),不同項(xiàng)目中得以應(yīng)用。
      Firefly基于真正的客戶機(jī)/ server體系結(jié)構(gòu),不依賴(lài)于不論什么特殊的網(wǎng)絡(luò)文件系統(tǒng),能夠平滑地執(zhí)行在不同的LAN、WAN 環(huán)境中。它的安裝配置過(guò)程簡(jiǎn)單易用,F(xiàn)irefly 能夠自己主動(dòng)、安全地保存代碼的每一次變化內(nèi)容,避免代碼被無(wú)意中覆蓋、改動(dòng)。項(xiàng)目管理人員使用 Firefly能夠有效地組織開(kāi)發(fā)力量進(jìn)行并行開(kāi)發(fā)和管理項(xiàng)目中各階段點(diǎn)的各種資源,使得產(chǎn)品公布易于管理;并能夠高速地回溯到任一歷史版本號(hào)。系統(tǒng)管理員使用Firefly 的內(nèi)置工具能夠方便的進(jìn)行存儲(chǔ)庫(kù)的備份和恢復(fù),而不依賴(lài)于不論什么第三方工具。
      開(kāi)源奇葩: CVS
      CVS 是Concurrent Versions System 的縮寫(xiě),它是開(kāi)放源碼軟件世界的一個(gè)偉大杰作,因?yàn)槠浜?jiǎn)單易用、功能強(qiáng)大,跨平臺(tái),支持并發(fā)版本號(hào)控制,并且免費(fèi),它在全球中小型軟件企業(yè)中得到了廣泛使用。
      其最大的遺憾就是缺少對(duì)應(yīng)的技術(shù)支持,很多問(wèn)題的解決須要自已尋找資料,甚至是讀源碼。
      小工作組級(jí):Merant PVCS
      MERANT 公司的 PVCS 能夠提供對(duì)軟件配置管理的基本支持,通過(guò)使用其圖形界面或相似SCCS 的命令,能夠基本滿足小型項(xiàng)目開(kāi)發(fā)的配置管理需求。 PVCS 盡管功能上也基本能夠滿足需求,可是其性能表現(xiàn)一直較差,逐漸地被市場(chǎng)所冷落。
      入門(mén)級(jí):Microsoft Visual Source Safe
      Visual Source Safe,即VSS ,是微軟公司為Visual Studio配套開(kāi)發(fā)的一個(gè)小型的配置管理工具,準(zhǔn)確來(lái)說(shuō),它僅能夠稱(chēng)得上是一個(gè)小型的版本號(hào)控制軟件。 VSS的優(yōu)點(diǎn)在于其與Visual Studio實(shí)現(xiàn)了無(wú)縫集成,使用簡(jiǎn)單。提供了歷史版本號(hào)記錄、改動(dòng)控制、文件比較、日志等基本功能。
      但其缺點(diǎn)也是十分明顯的,僅僅支持Windows平臺(tái),不支持并行開(kāi)發(fā),通過(guò) Check out - Modify - Check in的管理方式,一個(gè)時(shí)間僅僅同意一個(gè)人改動(dòng)代碼,并且速度慢、伸縮性差,不支持異地開(kāi)發(fā)。甚至于微軟本身也不採(cǎi)用其做為配置管理工具,而是使用一個(gè)名為SLM 的內(nèi)部工具。
    English »
     
     怎樣選擇配置管理工具
      面對(duì)這些形形色色,各有千秋的配置管理工具,怎樣依據(jù)組織特點(diǎn)、開(kāi)發(fā)團(tuán)隊(duì)須要,選擇切合適用的工具呢?筆者就結(jié)合工作實(shí)踐中的經(jīng)驗(yàn)與大家做一些交流與探討。
      配置管理工具的選擇所需考慮的因素大體包含下面幾個(gè)因素:
      功能是否符合實(shí)際需求?是否符合團(tuán)隊(duì)特點(diǎn)?性能是否愜意?費(fèi)用能否夠接受?售后服務(wù)怎樣?接下來(lái),我們就這幾方面逐一深入地探討:
      1)功能是否符合實(shí)際需求,是否符合團(tuán)隊(duì)特點(diǎn)
      工具就是用來(lái)幫助您解決這個(gè)問(wèn)題的,因此功能是否符合實(shí)際需求是最重要的推斷因素。而大多數(shù)主流配置管理工具的基本功能都能夠滿足,因此主要須要推斷下面幾個(gè)因素:
      并行開(kāi)發(fā)支持
      在團(tuán)隊(duì)協(xié)作開(kāi)發(fā)過(guò)程中,有兩種基本的模式:集體代碼權(quán)和個(gè)體代碼權(quán)。採(cǎi)用集體代碼權(quán)模式進(jìn)行開(kāi)發(fā)時(shí),一段代碼可能同一時(shí)候會(huì)被多個(gè)開(kāi)發(fā)者同一時(shí)候改動(dòng);而採(cǎi)用個(gè)體代碼權(quán)模式進(jìn)行開(kāi)發(fā)時(shí),每一段代碼都始終被一個(gè)開(kāi)發(fā)者獨(dú)享,別人須要改動(dòng)時(shí)也會(huì)通過(guò)該開(kāi)發(fā)者完畢。
      而配置管理軟件針對(duì)這一情況,也採(cǎi)用了不同的策略:Copy-Modify-Merge(拷貝、改動(dòng)、合并 ) 的并行開(kāi)發(fā)模式、Check out-Modify-Check in(簽出、改動(dòng)、簽入)的獨(dú)占開(kāi)發(fā)模式。在并行開(kāi)發(fā)模式下,開(kāi)發(fā)者能夠并行開(kāi)發(fā)、更改代碼, Firefly會(huì)自己主動(dòng)檢測(cè)到代碼沖突,并自己主動(dòng)合并,或提示開(kāi)發(fā)者手動(dòng)解決。
      表一、并行開(kāi)發(fā)支持比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      Copy-Modify-Merge 模式
      Firefly
      Copy-Modify-Merge 模式
      CVS
      Copy-Modify-Merge 模式
      PVCS
      Check out-Modify-Check in 模式
      VSS
      Check out-Modify-Check in 模式
      異地開(kāi)發(fā)支持
      假設(shè)你的開(kāi)發(fā)團(tuán)隊(duì)分布在不同的開(kāi)發(fā)地點(diǎn),就須要對(duì)工具的異地開(kāi)發(fā)功能進(jìn)行細(xì)致的評(píng)估了。大多數(shù)工具都提供基于 Web的界面,用戶能夠通過(guò)瀏覽器執(zhí)行配置管理的相關(guān)操作,并且有些工具就通過(guò)這樣的方法來(lái)實(shí)現(xiàn)對(duì)異地開(kāi)發(fā)的支持。
      這樣的實(shí)現(xiàn)方法有太多的局限性,比如網(wǎng)絡(luò)(Internet)連接帶寬的限制、防火墻以及安全問(wèn)題等。真正意義上的異地開(kāi)發(fā)支持,是指在不同的開(kāi)發(fā)地點(diǎn)建立各自的存儲(chǔ)庫(kù),通過(guò)工具提供同步功能自己主動(dòng)或手動(dòng)同步。這樣做的優(yōu)點(diǎn)是與網(wǎng)絡(luò)無(wú)關(guān),即便各個(gè)開(kāi)發(fā)地點(diǎn)之間沒(méi)有實(shí)時(shí)連通的網(wǎng)絡(luò),也能夠通過(guò) E-Mail 附件等其他方式將同步包發(fā)給對(duì)方,實(shí)現(xiàn)手動(dòng)的同步。
      表二異地開(kāi)發(fā)支持比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      提供MultiSite 模塊,通過(guò)自己主動(dòng)或手動(dòng)同步位于不同開(kāi)發(fā)地點(diǎn)的存儲(chǔ)庫(kù)的方式,支持異地開(kāi)發(fā)
      Firefly
      提供ServerSync 模塊,通過(guò)自己主動(dòng)或手動(dòng)同步位于不同開(kāi)發(fā)地點(diǎn)的存儲(chǔ)庫(kù)的方式,支持異地開(kāi)發(fā)
      CVS
      無(wú)專(zhuān)門(mén)支持的模塊
      PVCS
      無(wú)專(zhuān)門(mén)支持的模塊
      VSS
      無(wú)專(zhuān)門(mén)支持的模塊
      值得說(shuō)明的是,在不同開(kāi)發(fā)點(diǎn)建立各自存儲(chǔ)庫(kù)的方式,主要適用于兩個(gè)或兩個(gè)以上位于不同地點(diǎn)的開(kāi)發(fā)團(tuán)隊(duì)協(xié)作開(kāi)發(fā)的情況。假設(shè)僅是採(cǎi)用虛擬團(tuán)隊(duì)合作的方式,開(kāi)發(fā)者以個(gè)體的形式散落在不同地方,則更適合通過(guò) Internet 直接操作遠(yuǎn)程的配置管理server。
      跨平臺(tái)開(kāi)發(fā)支持
      假設(shè)企業(yè)須要從事多個(gè)不同平臺(tái)下的開(kāi)發(fā)工作,就須要配置管理工具能夠?qū)缙脚_(tái)開(kāi)發(fā)提供支持,否則勢(shì)必會(huì)給開(kāi)發(fā)、測(cè)試、公布等各個(gè)環(huán)節(jié)帶來(lái)不便,將使大量的時(shí)間被浪費(fèi)于代碼的手工上傳、下載中。
      表三跨平臺(tái)開(kāi)發(fā)支持比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      支持常見(jiàn)的平臺(tái)
      Firefly
      軟件本身基于Java開(kāi)發(fā),可在 Windows、Linux、 Solaris、HP-UX、 AIX等常見(jiàn)平臺(tái)上使用,平臺(tái)之間的移植也非常方便
      CVS
      支持差點(diǎn)兒全部的操作系統(tǒng)
      PVCS
      軟件本身基于Java 開(kāi)發(fā),能夠支持常見(jiàn)的平臺(tái)
      VSS
      僅支持Windows 操作系統(tǒng)
      與開(kāi)發(fā)工具的集成性
      配置管理工具與開(kāi)發(fā)工具是編碼過(guò)程中最經(jīng)常使用到兩種工具,因此它們之間的集成性直接影響到開(kāi)發(fā)者的便利性,假設(shè)無(wú)法良好集成,開(kāi)發(fā)者將不可避免地在配置管理工具與開(kāi)發(fā)工具之間來(lái)回切換。
      表四與開(kāi)發(fā)工具集成性比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      直接與資源管理器集成,十分易用
      Firefly
      與常見(jiàn)開(kāi)發(fā)工具無(wú)縫集成
      CVS
      對(duì)開(kāi)發(fā)工具集成性較差
      PVCS
      僅支持Windows 操作系統(tǒng)
      VSS
      與Visual Studio開(kāi)發(fā)工具包無(wú)縫連接,其他開(kāi)發(fā)工具集成性差
      2)性能是否愜意
      配置管理工具軟件的一些性能指標(biāo)對(duì)于終于的選擇也有著至關(guān)重要的影響。
      執(zhí)行性能
      假設(shè)開(kāi)發(fā)團(tuán)隊(duì)規(guī)模不大的情況下,配置管理工具軟件的性能不會(huì)造成非常大影響,但假設(shè)項(xiàng)目規(guī)模比較大,團(tuán)隊(duì)成員逐漸增多的情況下,其執(zhí)行性能就會(huì)帶來(lái)非常大的影響。
      表五執(zhí)行性能比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      server採(cǎi)用多進(jìn)程機(jī)制,使用自帶多版本號(hào)文件系統(tǒng)MVFS,對(duì)性能有較大負(fù)面影響。做為一款企業(yè)級(jí)、全面的開(kāi)發(fā)配置管理工具,適用于大型開(kāi)發(fā)團(tuán)隊(duì)
      Firefly
      server採(cǎi)用了多線程的應(yīng)用server,性能表現(xiàn)優(yōu)秀,做為一款企業(yè)級(jí)、全面的開(kāi)發(fā)配置管理,能適用于50人到上千人的團(tuán)隊(duì)
      CVS
      較高的執(zhí)行性能,適用于各種級(jí)別的開(kāi)發(fā)團(tuán)隊(duì)
      PVCS
      server採(cǎi)用文件系統(tǒng)共享方式,對(duì)CPU、內(nèi)存及網(wǎng)絡(luò)要求較高,性能一般,僅適用于中小型項(xiàng)目團(tuán)隊(duì),不適合于企業(yè)級(jí)應(yīng)用
      VSS
      相對(duì)功能單一、簡(jiǎn)陋,適用于幾個(gè)人的小型團(tuán)隊(duì),在數(shù)據(jù)量不大的情況下,性能能夠接受
      易用性
      表六易用性比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      安裝、配置、使用相對(duì)較復(fù)雜,須要進(jìn)行團(tuán)隊(duì)培訓(xùn)
      Firefly
      在提供全面配置管理功能的情況下,安裝、配置、使用較為簡(jiǎn)單,包含安裝、配置、培訓(xùn)在內(nèi)的整個(gè)實(shí)施周期一般不會(huì)超過(guò)一個(gè)月。
      CVS
      安裝、配置較復(fù)雜,但使用比較簡(jiǎn)單,僅僅需對(duì)配置管理做簡(jiǎn)單培訓(xùn)就可以
      PVCS
      使用比較簡(jiǎn)單,僅僅需對(duì)配置管理做簡(jiǎn)單培訓(xùn)就可以
      VSS
      安裝、配置、使用均較簡(jiǎn)單,非常easy上手使用
      從用戶界面、與開(kāi)發(fā)工具的集成性角度來(lái)說(shuō),這幾款主流的配置管理軟件均有較好的設(shè)計(jì),均有較好的易用性。
      安全性
      表七安全性比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      採(cǎi)用C/S模式,須要共享server上的存儲(chǔ)文件夾以供client訪問(wèn),這將帶來(lái)一定安全隱患
      Firefly
      server上的存儲(chǔ)文件夾不用共享,對(duì)client不透明,client不可直接訪問(wèn)存儲(chǔ)文件夾,使系統(tǒng)更安全可靠
      CVS
      採(cǎi)用C/S 模式,不須要共享server上的存儲(chǔ)文件夾,安全性較好
      PVCS
      基于文件系統(tǒng)共享,并且須要以"可寫(xiě) "的權(quán)限共享存儲(chǔ)文件夾,存在較大的安全隱患
      VSS
      基于文件系統(tǒng)共享實(shí)現(xiàn)對(duì)server的訪問(wèn),須要共享存儲(chǔ)文件夾,這將帶來(lái)一定安全隱患
      3)費(fèi)用能否夠接受
      Rational ClearCase 、Hansky Firefly 兩款均屬于企業(yè)級(jí)配置管理工具軟件 ,ClearCase價(jià)格較貴,,相比之下 Hansky Firefly 是一款不錯(cuò)的選擇。
      而 PVCS其價(jià)格大約是每client幾百美元的水平,對(duì)于國(guó)內(nèi)企業(yè)來(lái)說(shuō),性?xún)r(jià)比不太劃算。 VSS 是微軟打包在Visual Studio開(kāi)發(fā)工具包之中的,顯然花費(fèi)的精力不大,價(jià)格也比較廉價(jià),能夠做為個(gè)人、小項(xiàng)目團(tuán)隊(duì)版本號(hào)控制之用。
      而 CVS則是一款全然免費(fèi)的開(kāi)源軟件,性能較之企業(yè)級(jí)配置管理工具差距不大,也是一種不錯(cuò)的選擇。
      4) 售后服務(wù)怎樣
      表八售后服務(wù)比較表
      工具名稱(chēng)
      說(shuō)明
      ClearCase
      大型商用軟件,已被IBM公司收購(gòu),但國(guó)內(nèi)市場(chǎng)拓展有限,因此服務(wù)支持會(huì)受到限制。如今中國(guó)用戶的支持是由位于澳大利亞悉尼的支持中心聯(lián)系
      Firefly
      大型商用軟件,已在中國(guó)成立分公司,全面拓展市場(chǎng)之中,在北京設(shè)有支持中心
      CVS
      做為開(kāi)源軟件,無(wú)官方支持,須要用戶自己查找資料解決技術(shù)問(wèn)題,如今也出現(xiàn)專(zhuān)門(mén)為CVS 做技術(shù)支持的公司
      PVCS
      在中國(guó)市場(chǎng)開(kāi)拓有限,國(guó)內(nèi)沒(méi)有支持中心
      VSS
      做為微軟的非核心產(chǎn)品,技術(shù)支持有限。在其站點(diǎn)上有提供一些常見(jiàn)問(wèn)題,僅僅有對(duì)正式購(gòu)買(mǎi)的用戶提供一定的技術(shù)支持
      售后服務(wù)與產(chǎn)品支持也是一個(gè)非常重要的考察點(diǎn),工具在使用過(guò)程中出現(xiàn)這樣那樣的問(wèn)題是非常尋常的事,有些是因?yàn)槭褂貌划?dāng),有些則是工具本身的缺陷。這些問(wèn)題都會(huì)直接影響到開(kāi)發(fā)團(tuán)隊(duì)的使用,因此隨時(shí)能夠找到專(zhuān)業(yè)技術(shù)人員解決這些問(wèn)題就變成十分重要。
      實(shí)例說(shuō)明
      最后,筆者介紹幾個(gè)實(shí)際的案例,希望對(duì)大家選擇軟件配置管理工具軟件有幫助。
      案例一
      某公司擁有10 名專(zhuān)職開(kāi)發(fā)者以及一些兼職的開(kāi)發(fā)者,主要從事 Windows和Linux 平臺(tái)下的軟件開(kāi)發(fā),採(cǎi)用的工具包含Visual Studio 系列、 GCC 等。為了能夠加強(qiáng)版本號(hào)控制與配置管理工作,決定引入一些自己主動(dòng)化配置管理工具。
      經(jīng)過(guò)謹(jǐn)慎的選擇,採(cǎi)用了兩步走的方法:
      1) 首先採(cǎi)用了Visual Studio 軟件包中的 VSS做為配置管理工具;
      <SPAN style="FONT-SIZE: 9pt;"word-break: break-all; line-height: 21.6000003814697px; margin: 10px 0px; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">  ...

    posted @ 2014-09-16 09:43 順其自然EVO 閱讀(243) | 評(píng)論 (0)編輯 收藏

    維護(hù)需求與新增需求的理解

     一般來(lái)說(shuō),維護(hù)需求的項(xiàng)目時(shí)間都是比較緊急的,維護(hù)嘛,用戶等著上線用的啊,其實(shí)在這里,我們對(duì)維護(hù)需求和新增需求的定義都不太清晰。
      怎么理解呢?我個(gè)人的理解:
      維護(hù)需求,是指用戶提出在系統(tǒng)使用過(guò)程中的問(wèn)題以及整合目前用戶覺(jué)得需要改進(jìn)系統(tǒng)的一些功能的需求文檔。
      新增需求,就是指用戶在不滿足當(dāng)前系統(tǒng)使用功能的前提下提出一些不包含之前的需求文檔內(nèi)的新增的功能而形成的需求文檔,它沒(méi)有包含用戶繼續(xù)解決的用戶bug。
      因此,我個(gè)人從定義上區(qū)分,維護(hù)需求多數(shù)只是針對(duì)用戶問(wèn)題去修復(fù)并驗(yàn)證bug,當(dāng)然也有摻入一些用戶界面體驗(yàn)、新增的小功能點(diǎn)吧。而新增需求,在項(xiàng)目開(kāi)發(fā)中可能就不是一個(gè)小新增功能點(diǎn)了,更多的是大的項(xiàng)目系統(tǒng)分支、功能模塊,需求業(yè)務(wù)規(guī)則的編寫(xiě)程度需要更明細(xì)。

    posted @ 2014-09-16 09:40 順其自然EVO 閱讀(161) | 評(píng)論 (0)編輯 收藏

    數(shù)據(jù)庫(kù)索引的作用和長(zhǎng)處缺點(diǎn)

    為什么要?jiǎng)?chuàng)建索引呢?這是由于,創(chuàng)建索引能夠大大提高系統(tǒng)的性能。
      第一,通過(guò)創(chuàng)建唯一性索引,能夠保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
      第二,能夠大大加快 數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最基本的原因。
      第三,能夠加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
      第四,在使用分組和排序 子句進(jìn)行數(shù)據(jù)檢索時(shí),相同能夠顯著降低查詢(xún)中分組和排序的時(shí)間。
      第五,通過(guò)使用索引,能夠在查詢(xún)的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
      或許會(huì)有人要問(wèn):添加索引有如此多的長(zhǎng)處,為什么不正確表中的每個(gè)列創(chuàng)建一個(gè)索引呢?這樣的想法固然有其合理性,然而也有其片面性。盡管,索引有很多長(zhǎng)處, 可是,為表中的每個(gè)列都添加索引,是很不明智的。這是由于,添加索引也有很多不利的一個(gè)方面。
      第一,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這樣的時(shí)間隨著數(shù)據(jù) 量的添加而添加。
      第二,索引須要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每個(gè)索引還要占一定的物理空間,假設(shè)要建立聚簇索引,那么須要的空間就會(huì)更大。
      第三,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行添加、刪除和改動(dòng)的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就減少了數(shù)據(jù)的維護(hù)速度。
      索引是建立在數(shù)據(jù)庫(kù)表中的某些列的上面。因此,在創(chuàng)建索引的時(shí)候,應(yīng)該細(xì)致考慮在哪些列上能夠創(chuàng)建索引,在哪些列上不能創(chuàng)建索引。一般來(lái)說(shuō),應(yīng)該在這些列 上創(chuàng)建索引,比如:
      在常常須要搜索的列上,能夠加快搜索的速度;
      在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);
      在常常常使用在連接的列上,這 些列主要是一些外鍵,能夠加快連接的速度;
      在常常須要依據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,由于索引已經(jīng)排序,其指定的范圍是連續(xù)的;
      在常常須要排序的列上創(chuàng) 建索引,由于索引已經(jīng)排序,這樣查詢(xún)能夠利用索引的排序,加快排序查詢(xún)時(shí)間;
      在常常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的推斷速度。
      相同,對(duì)于有些列不應(yīng)該創(chuàng)建索引。一般來(lái)說(shuō),不應(yīng)該創(chuàng)建索引的的這些列具有下列特點(diǎn):
      第一,對(duì)于那些在查詢(xún)中非常少使用或者參考的列不應(yīng)該創(chuàng)建索引。這是因 為,既然這些列非常少使用到,因此有索引或者無(wú)索引,并不能提高查詢(xún)速度。相反,由于添加了索引,反而減少了系統(tǒng)的維護(hù)速度和增大了空間需求。
      第二,對(duì)于那 些僅僅有非常少數(shù)據(jù)值的列也不應(yīng)該添加索引。這是由于,由于這些列的取值非常少,比如人事表的性別列,在查詢(xún)的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的非常大比 例,即須要在表中搜索的數(shù)據(jù)行的比例非常大。添加索引,并不能明顯加快檢索速度。
      第三,對(duì)于那些定義為text, image和bit數(shù)據(jù)類(lèi)型的列不應(yīng)該添加索引。這是由于,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值非常少。
      第四,當(dāng)改動(dòng)性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索 引。這是由于,改動(dòng)性能和檢索性能是互相矛盾的。當(dāng)添加索引時(shí),會(huì)提高檢索性能,可是會(huì)減少改動(dòng)性能。當(dāng)減少索引時(shí),會(huì)提高改動(dòng)性能,減少檢索性能。因 此,當(dāng)改動(dòng)性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。
      創(chuàng)建索引的方法和索引的特征
      創(chuàng)建索引的方法
      創(chuàng)建索引有多種方法,這些方法包含直接創(chuàng)建索引的方法和間接創(chuàng)建索引的方法。直接創(chuàng)建索引,比如使用CREATE INDEX語(yǔ)句或者使用創(chuàng)建索引向?qū)Вg接創(chuàng)建索引,比如在表中定義主鍵約束或者唯一性鍵約束時(shí),同一時(shí)候也創(chuàng)建了索引。盡管,這兩種方法都能夠創(chuàng)建索引,但 是,它們創(chuàng)建索引的詳細(xì)內(nèi)容是有差別的。
      使用CREATE INDEX語(yǔ)句或者使用創(chuàng)建索引向?qū)?lái)創(chuàng)建索引,這是最主要的索引創(chuàng)建方式,而且這樣的方法最具有柔性,能夠定制創(chuàng)建出符合自己須要的索引。在使用這樣的方式 創(chuàng)建索引時(shí),能夠使用很多選項(xiàng),比如指定數(shù)據(jù)頁(yè)的充滿度、進(jìn)行排序、整理統(tǒng)計(jì)信息等,這樣能夠優(yōu)化索引。使用這樣的方法,能夠指定索引的類(lèi)型、唯一性和復(fù)合 性,也就是說(shuō),既能夠創(chuàng)建聚簇索引,也能夠創(chuàng)建非聚簇索引,既能夠在一個(gè)列上創(chuàng)建索引,也能夠在兩個(gè)或者兩個(gè)以上的列上創(chuàng)建索引。
      通過(guò)定義主鍵約束或者唯一性鍵約束,也能夠間接創(chuàng)建索引。主鍵約束是一種保持?jǐn)?shù)據(jù)完整性的邏輯,它限制表中的記錄有相同的主鍵記錄。在創(chuàng)建主鍵約束時(shí),系 統(tǒng)自己主動(dòng)創(chuàng)建了一個(gè)唯一性的聚簇索引。盡管,在邏輯上,主鍵約束是一種重要的結(jié)構(gòu),可是,在物理結(jié)構(gòu)上,與主鍵約束相相應(yīng)的結(jié)構(gòu)是唯一性的聚簇索引。換句話 說(shuō),在物理實(shí)現(xiàn)上,不存在主鍵約束,而僅僅存在唯一性的聚簇索引。相同,在創(chuàng)建唯一性鍵約束時(shí),也同一時(shí)候創(chuàng)建了索引,這樣的索引則是唯一性的非聚簇索引。因此, 當(dāng)使用約束創(chuàng)建索引時(shí),索引的類(lèi)型和特征基本上都已經(jīng)確定了,由用戶定制的余地比較小。
      當(dāng)在表上定義主鍵或者唯一性鍵約束時(shí),假設(shè)表中已經(jīng)有了使用CREATE INDEX語(yǔ)句創(chuàng)建的標(biāo)準(zhǔn)索引時(shí),那么主鍵約束或者唯一性鍵約束創(chuàng)建的索引覆蓋曾經(jīng)創(chuàng)建的標(biāo)準(zhǔn)索引。也就是說(shuō),主鍵約束或者唯一性鍵約束創(chuàng)建的索引的優(yōu)先 級(jí)高于使用CREATE INDEX語(yǔ)句創(chuàng)建的索引。
    索引的特征
      索引有兩個(gè)特征,即唯一性索引和復(fù)合索引。
      唯一性索引保證在索引列中的所有數(shù)據(jù)是唯一的,不會(huì)包括冗余數(shù)據(jù)。假設(shè)表中已經(jīng)有一個(gè)主鍵約束或者唯一性鍵約束,那么當(dāng)創(chuàng)建表或者改動(dòng)表時(shí),SQL Server自己主動(dòng)創(chuàng)建一個(gè)唯一性索引。然而,假設(shè)必須保證唯一性,那么應(yīng)該創(chuàng)建主鍵約束或者唯一性鍵約束,而不是創(chuàng)建一個(gè)唯一性索引。當(dāng)創(chuàng)建唯一性索引 時(shí),應(yīng)該認(rèn)真考慮這些規(guī)則:當(dāng)在表中創(chuàng)建主鍵約束或者唯一性鍵約束時(shí),SQL Server自己主動(dòng)創(chuàng)建一個(gè)唯一性索引;假設(shè)表中已經(jīng)包括有數(shù)據(jù),那么當(dāng)創(chuàng)建索引時(shí),SQL Server檢查表中已有數(shù)據(jù)的冗余性;每當(dāng)使用插入語(yǔ)句插入數(shù)據(jù)或者使用改動(dòng)語(yǔ)句改動(dòng)數(shù)據(jù)時(shí),SQL Server檢查數(shù)據(jù)的冗余性:假設(shè)有冗余值,那么SQL Server取消該語(yǔ)句的運(yùn)行,而且返回一個(gè)錯(cuò)誤消息;確保表中的每一行數(shù)據(jù)都有一個(gè)唯一值,這樣能夠確保每個(gè)實(shí)體都能夠唯一確認(rèn);僅僅能在能夠保證實(shí)體 完整性的列上創(chuàng)建唯一性索引,比如,不能在人事表中的姓名列上創(chuàng)建唯一性索引,由于人們能夠有同樣的姓名。
      復(fù)合索引就是一個(gè)索引創(chuàng)建在兩個(gè)列或者多個(gè)列上。在搜索時(shí),當(dāng)兩個(gè)或者多個(gè)列作為一個(gè)關(guān)鍵值時(shí),最好在這些列上創(chuàng)建復(fù)合索引。當(dāng)創(chuàng)建復(fù)合索引時(shí),應(yīng)該考慮 這些規(guī)則:最多能夠把16個(gè)列合并成一個(gè)單獨(dú)的復(fù)合索引,構(gòu)成復(fù)合索引的列的總長(zhǎng)度不能超過(guò)900字節(jié),也就是說(shuō)復(fù)合列的長(zhǎng)度不能太長(zhǎng);在復(fù)合索引中,所 有的列必須來(lái)自同一個(gè)表中,不能跨表建立復(fù)合列;在復(fù)合索引中,列的排列順序是很重要的,因此要認(rèn)真排列列的順序,原則上,應(yīng)該首先定義最唯一的列,例 如在(COL1,COL2)上的索引與在(COL2,COL1)上的索引是不同樣的,由于兩個(gè)索引的列的順序不同;為了使查詢(xún)優(yōu)化器使用復(fù)合索引,查詢(xún)語(yǔ) 句中的WHERE子句必須參考復(fù)合索引中第一個(gè)列;當(dāng)表中有多個(gè)關(guān)鍵列時(shí),復(fù)合索引是很實(shí)用的;使用復(fù)合索引能夠提高查詢(xún)性能,降低在一個(gè)表中所創(chuàng)建的 索引數(shù)量。

    posted @ 2014-09-15 10:51 順其自然EVO 閱讀(192) | 評(píng)論 (0)編輯 收藏

    測(cè)試用例的關(guān)鍵的認(rèn)知

    無(wú)論缺陷預(yù)防工作貫徹落實(shí)地多好,軟件組件總有缺陷。這很明顯,因?yàn)殚_(kāi)發(fā)商無(wú)法阻止/消除軟件開(kāi)發(fā)周期的所有缺陷。因此,軟件必須進(jìn)行徹底的測(cè)試,然后才交付給最終用戶。測(cè)試人員的責(zé)任是:設(shè)計(jì)既可以(ⅰ)找軟件缺陷,又能(ii )評(píng)估該軟件的性能,可用性和可靠性等方面的測(cè)試。
      現(xiàn)在,為了實(shí)現(xiàn)這些目標(biāo),測(cè)試人員必須(往往是從一個(gè)非常大的執(zhí)行域中)選擇和/或制定測(cè)試用例的有限數(shù)量。不幸的是,完整的測(cè)試通常不是在這個(gè)范圍,預(yù)算和時(shí)間的約束內(nèi)實(shí)現(xiàn)和/或執(zhí)行的。重要的是,當(dāng)測(cè)試開(kāi)始失控且不按計(jì)劃地運(yùn)行時(shí),由于預(yù)期無(wú)法實(shí)際,測(cè)試人員往往承受了來(lái)自管理層和利益相關(guān)者的巨大壓力。
      因此,測(cè)試人員必須有效地計(jì)劃測(cè)試并制定正確的測(cè)試用例,選擇并執(zhí)行合適的用例,監(jiān)控過(guò)程,以確保有效利用工作資源和時(shí)間。所以,要列出這些無(wú)疑是一項(xiàng)艱巨的任務(wù);要有效地實(shí)施,測(cè)試人員需要受過(guò)適當(dāng)?shù)慕逃团嘤?xùn)并擁有贏得管理層支持的能力。
      一般情況下,測(cè)試人員會(huì)用兩種不同的測(cè)試方法,其中,使用常規(guī)方法,測(cè)試人員主要是嘗試用所有可能的輸入去測(cè)試一個(gè)模塊或組件,用所有可能的軟件結(jié)構(gòu)去實(shí)踐。盡管這種做法仍在使用,測(cè)試人員卻在慢慢灌輸推理軟件的一切的價(jià)值,最終使他們能夠檢測(cè)出所有可能存在的缺陷。但見(jiàn)多識(shí)廣且有學(xué)問(wèn)的測(cè)試員們都明白,這在現(xiàn)實(shí)或經(jīng)濟(jì)上是不可行,不可實(shí)現(xiàn)的目標(biāo)。
      現(xiàn)在,另一種方法可能就是讓測(cè)試員們隨機(jī)選擇測(cè)試輸入,希望這些測(cè)試能將大的缺陷找出來(lái)。不過(guò),測(cè)試專(zhuān)家認(rèn)為,隨機(jī)生成的測(cè)試輸入在評(píng)估系統(tǒng)的質(zhì)量屬性方面表現(xiàn)紀(jì)錄欠佳。所以,從測(cè)試的角度來(lái)看,這是一個(gè)無(wú)休止的爭(zhēng)論和懸而未決的問(wèn)題。盡管如此,我們還是認(rèn)為,測(cè)試員的最終目標(biāo)是了解測(cè)試的功能、輸入/輸出域和使用環(huán)境,等等。
      同樣,對(duì)于某些特定類(lèi)型的測(cè)試,測(cè)試人員也需要詳細(xì)地了解代碼是如何構(gòu)造的。此外,測(cè)試人員也需要利用關(guān)于常在軟件開(kāi)發(fā)或維護(hù)過(guò)程中生成的特定缺陷的知識(shí)。有了這些信息,測(cè)試者就必須明智地選擇測(cè)試輸入的子集,以及被認(rèn)為最有可能找測(cè)試過(guò)程中條件和限制內(nèi)的缺陷的測(cè)試輸入組合。然而,這個(gè)過(guò)程需要時(shí)間和精力。所以,測(cè)試人員知道且贊同:只有開(kāi)發(fā)出基于執(zhí)行的測(cè)試的有效測(cè)試用例,才能最大化和/或優(yōu)化對(duì)時(shí)間和資源的利用。
      “有效測(cè)試用例”我們是指:“一個(gè)很可能找出缺陷的測(cè)試用例” 。因此,制定有效測(cè)試用例的能力對(duì)于一個(gè)組織邁向一個(gè)更高質(zhì)量的測(cè)試過(guò)程來(lái)說(shuō)是非常重要的;反過(guò)來(lái),一個(gè)組織邁向一個(gè)更高質(zhì)量的測(cè)試過(guò)程對(duì)制定有效測(cè)試用例的能力也有許多積極影響。
      例如,如果測(cè)試用例是有效的,那么:
      檢測(cè)缺陷的概率更大。
      更有效地利用組織資源。
      測(cè)試再用的可能性更高。
      更符合測(cè)試、項(xiàng)目進(jìn)度、預(yù)算,更重要地,提供更高質(zhì)量的軟件產(chǎn)品的可能性。
      測(cè)試用例設(shè)計(jì)方法 - 概念化
      上面介紹了有效測(cè)試用例的種種好處,但縝密考慮測(cè)試人員用來(lái)設(shè)計(jì)這些有效測(cè)試用例的方法也同樣重要。為了回答這個(gè)問(wèn)題,有必要把軟件作為一個(gè)精心設(shè)計(jì)的產(chǎn)品來(lái)查看和/或檢查。現(xiàn)在,有了這個(gè)觀念,就有兩個(gè)基本方法可以用來(lái)設(shè)計(jì)測(cè)試用例:
      黑盒(有時(shí)也稱(chēng)為功能或規(guī)格)測(cè)試方法。
      白盒(有時(shí)也稱(chēng)為clear或透明盒 )測(cè)試方法。
      使用黑盒測(cè)試方法,測(cè)試人員把SUT (測(cè)試中的軟件)當(dāng)作一個(gè)不知道其內(nèi)部結(jié)構(gòu)(即如何運(yùn)作)的不透明盒子,測(cè)試人員只知道它的作用。使用這種方法的SUT的大小可以是一個(gè)簡(jiǎn)單的模塊、成員函數(shù)、對(duì)象群、一個(gè)子系統(tǒng)、或一個(gè)完整的軟件系統(tǒng)。此外, SUT的基礎(chǔ)行為或功能的描述可以由正式規(guī)格,輸入/處理/輸出圖( IPO),或一套定義明確的先決、后置條件來(lái)提供;重要的是,另一個(gè)值得一提的信息來(lái)源是:需求規(guī)格說(shuō)明文檔,通常描述SUT的功能,輸入及預(yù)期輸出。現(xiàn)在,鑒于上述來(lái)源,測(cè)試員提供指定輸入到SUT,進(jìn)行測(cè)試運(yùn)行,然后確定所產(chǎn)生的輸出是否與說(shuō)明文檔中提供的一致。因?yàn)楹诤袦y(cè)試方法只考慮了軟件的行為和功能,它通常被稱(chēng)為功能測(cè)試,或基于規(guī)范的測(cè)試。這種方法特別有用,極有助于找到要求和規(guī)格中的缺陷。
      與此相反,白盒測(cè)試方法關(guān)注將被測(cè)試的軟件的內(nèi)部結(jié)構(gòu)。因此,使用白盒測(cè)試方法來(lái)設(shè)計(jì)測(cè)試用例,測(cè)試人員應(yīng)該先了解結(jié)構(gòu),且為了實(shí)現(xiàn)這一目標(biāo),必須可隨時(shí)參考和理解代碼或適當(dāng)?shù)念?lèi)偽代碼的要求。一旦對(duì)結(jié)構(gòu)有了必要的了解,測(cè)試者就可以選擇合適的測(cè)試用例去實(shí)踐特定的內(nèi)部結(jié)構(gòu)要素,并確定它們是否正常工作。例如,測(cè)試用例通常被設(shè)計(jì)來(lái)實(shí)踐所有語(yǔ)句或發(fā)生在一個(gè)模塊或成員函數(shù)中的真/假分支。但是,由于白盒測(cè)試的設(shè)計(jì),執(zhí)行和結(jié)果分析非常耗時(shí),這種方法被限制和/或通常只適用于軟件的小部分,如模塊或成員函數(shù)。然而,白盒測(cè)試方法對(duì)于找出設(shè)計(jì)和基于代碼的控件的邏輯缺陷和順序缺陷,初始化缺陷和數(shù)據(jù)流缺陷等特別有用。
      然而,從測(cè)試員的角度來(lái)看,要實(shí)現(xiàn)向用戶提供低缺陷高質(zhì)量的軟件的目標(biāo),必須把這兩種方法都用來(lái)設(shè)計(jì)測(cè)試用例。另外,這兩種方法都支持測(cè)試員選擇有限數(shù)量的將被用于測(cè)試的測(cè)試用例。這兩種方法可以相互補(bǔ)充,因?yàn)槊總€(gè)都或許有助于找到某些特定類(lèi)型的缺陷。重要的是,有了使用這兩種方法設(shè)計(jì)出的一組測(cè)試用例,測(cè)試員找到SUT中各種不同類(lèi)型缺陷的機(jī)會(huì)就增加了。
      測(cè)試員還有一套有效的可再用的用來(lái)進(jìn)行回歸測(cè)試(更改后的重新測(cè)試),以及軟件測(cè)試的新版本。
      上面是一份概要:使用任一設(shè)計(jì)方法制定測(cè)試用例的各種可用方法。
      但是,在使用任一設(shè)計(jì)方法準(zhǔn)備測(cè)試用例前有一些因素需要考慮清楚。它們分別是:
      測(cè)試相關(guān)風(fēng)險(xiǎn)。
      預(yù)期缺陷類(lèi)型。
      測(cè)試員的知識(shí)和經(jīng)驗(yàn)。
      測(cè)試水平和必須進(jìn)行分組和管理的小組活動(dòng)。
      用于執(zhí)行測(cè)試用例的工具。
      應(yīng)用程序,軟件和問(wèn)題域的類(lèi)型。
      客戶要求,等等。

    posted @ 2014-09-15 10:49 順其自然EVO 閱讀(137) | 評(píng)論 (0)編輯 收藏

    阿里外包的測(cè)試經(jīng)驗(yàn)

    本人現(xiàn)在外包到阿里工作,最近被分配的一個(gè)工作就是--路由器app測(cè)試,寫(xiě)這個(gè)文章是為了記錄一下,方便自己查看。
      剛分到阿里,各種不適應(yīng)。1.路由器板子性能超級(jí)差,還沒(méi)開(kāi)始測(cè)就掛了。2.分到手的電腦超級(jí)爛,打開(kāi)一個(gè)頁(yè)面都要卡上好久。再加到對(duì)那邊環(huán)境的不熟悉,導(dǎo)致心情非常煩躁。幸虧那邊接口人幫我們換了好的電腦,開(kāi)發(fā)們也一直加班加點(diǎn),第二天來(lái),基本功能能操作,說(shuō)明基本能測(cè)試了。
      這個(gè)路由器有兩個(gè)頻段,2.4G和5G,可以通過(guò)web頁(yè)面和手機(jī)app控制路由器,而我主要測(cè)的是蘋(píng)果手機(jī)app的軟件測(cè)試。由于測(cè)試過(guò)程中會(huì)有bug,我們必須提交手機(jī)端與路由器端的日志。手機(jī)端要抓日志,裝了一個(gè)itool,itunes。通過(guò)這個(gè)工具可以實(shí)時(shí)抓捕手機(jī)日志。還可能通過(guò)airplay,映射圖片到電腦,進(jìn)行截圖。至于路由器端的日志,可以裝一個(gè)串口工具。而我因?yàn)榘遄哟谟袉?wèn)題,只能裝一個(gè)xshell,遠(yuǎn)程通過(guò)命令訪問(wèn)路由器。
      測(cè)試總共經(jīng)歷了二周半,以下幾點(diǎn),用于提醒自己以后測(cè)試中注意:
      1.在正式測(cè)試前,了解所有的功能需求,以防測(cè)試過(guò)程中出現(xiàn)誤解。
      2.如果有app與web端,兩者可以交互測(cè)試。比如web端修改密碼,手機(jī)端的反映。還有另外的一些,看會(huì)不會(huì)有影響。
      3.同一個(gè)軟件,再兩個(gè)或兩個(gè)以上的手機(jī)上操作會(huì)怎么樣。
      4.測(cè)一個(gè)功能A時(shí),能不能連帶測(cè)另一個(gè)功能B。再看看會(huì)不會(huì)影響A的功能。
      5.軟件重啟或恢復(fù)出廠設(shè)置,會(huì)不會(huì)影響升級(jí)。
      6.文本框名稱(chēng)密碼,是否支持特殊字符,中文字符,全角字符。
      7.了解一些基本的接口名稱(chēng),可以通過(guò)日志知道,定位問(wèn)題,知道是路由器的問(wèn)題還是手機(jī)app的問(wèn)題。
      8.如果測(cè)了ios,就要再去測(cè)測(cè)android,因?yàn)閕os比android穩(wěn)定,可能你會(huì)發(fā)現(xiàn)更多android的問(wèn)題。也有可能通過(guò)android測(cè)試發(fā)現(xiàn)一些android問(wèn)題,交互測(cè)試也很重要。
      以上是我現(xiàn)在能想到的一些,有新的內(nèi)容,再補(bǔ)充。

    posted @ 2014-09-15 10:45 順其自然EVO 閱讀(450) | 評(píng)論 (0)編輯 收藏

    Linux進(jìn)程的睡眠和喚醒簡(jiǎn)析

     1、Linux進(jìn)程的睡眠和喚醒
      在Linux中,僅等待CPU時(shí)間的進(jìn)程稱(chēng)為就緒進(jìn)程,它們被放置在一個(gè)運(yùn)行隊(duì)列中,一個(gè)就緒進(jìn)程的狀 態(tài)標(biāo)志位為T(mén)ASK_RUNNING。一旦一個(gè)運(yùn)行中的進(jìn)程時(shí)間片用完, Linux 內(nèi)核的調(diào)度器會(huì)剝奪這個(gè)進(jìn)程對(duì)CPU的控制權(quán),并且從運(yùn)行隊(duì)列中選擇一個(gè)合適的進(jìn)程投入運(yùn)行。
      當(dāng)然,一個(gè)進(jìn)程也可以主動(dòng)釋放CPU的控制權(quán)。函數(shù) schedule()是一個(gè)調(diào)度函數(shù),它可以被一個(gè)進(jìn)程主動(dòng)調(diào)用,從而調(diào)度其它進(jìn)程占用CPU。一旦這個(gè)主動(dòng)放棄CPU的進(jìn)程被重新調(diào)度占用 CPU,那么它將從上次停止執(zhí)行的位置開(kāi)始執(zhí)行,也就是說(shuō)它將從調(diào)用schedule()的下一行代碼處開(kāi)始執(zhí)行。
      有時(shí)候,進(jìn)程需要等待直到某個(gè)特定的事件發(fā)生,例如設(shè)備初始化完成、I/O 操作完成或定時(shí)器到時(shí)等。在這種情況下,進(jìn)程則必須從運(yùn)行隊(duì)列移出,加入到一個(gè)等待隊(duì)列中,這個(gè)時(shí)候進(jìn)程就進(jìn)入了睡眠狀態(tài)。 
      Linux 中的進(jìn)程睡眠狀態(tài)有兩種:
      一種是可中斷的睡眠狀態(tài),其狀態(tài)標(biāo)志位TASK_INTERRUPTIBLE;
      另一種是不可中斷的睡眠狀態(tài),其狀態(tài)標(biāo)志位為T(mén)ASK_UNINTERRUPTIBLE。可中斷的睡眠狀態(tài)的進(jìn)程會(huì)睡眠直到某個(gè)條件變?yōu)檎妫热缯f(shuō)產(chǎn)生一個(gè)硬件中斷、釋放 進(jìn)程正在等待的系統(tǒng)資源或是傳遞一個(gè)信號(hào)都可以是喚醒進(jìn)程的條件。不可中斷睡眠狀態(tài)與可中斷睡眠狀態(tài)類(lèi)似,但是它有一個(gè)例外,那就是把信號(hào)傳遞到這種睡眠 狀態(tài)的進(jìn)程不能改變它的狀態(tài),也就是說(shuō)它不響應(yīng)信號(hào)的喚醒。不可中斷睡眠狀態(tài)一般較少用到,但在一些特定情況下這種狀態(tài)還是很有用的,比如說(shuō):進(jìn)程必須等 待,不能被中斷,直到某個(gè)特定的事件發(fā)生。
      在現(xiàn)代的Linux操作系統(tǒng)中,進(jìn)程一般都是用調(diào)用schedule()的方法進(jìn)入睡眠狀態(tài)的,下面的代碼演示了如何讓正在運(yùn)行的進(jìn)程進(jìn)入睡眠狀態(tài)。
      sleeping_task = current;
      set_current_state(TASK_INTERRUPTIBLE);
      schedule();
      func1();
      /* Rest of the code ... */
      在第一個(gè)語(yǔ)句中,程序存儲(chǔ)了一份進(jìn)程結(jié)構(gòu)指針sleeping_task,current 是一個(gè)宏,它指向正在執(zhí)行的進(jìn)程結(jié)構(gòu)。set_current_state()將該進(jìn)程的狀態(tài)從執(zhí)行狀態(tài)TASK_RUNNING 變成睡眠狀態(tài)TASK_INTERRUPTIBLE。 如果schedule()是被一個(gè)狀態(tài)為T(mén)ASK_RUNNING 的進(jìn)程調(diào)度,那么schedule()將調(diào)度另外一個(gè)進(jìn)程占用CPU;如果schedule()是被一個(gè)狀態(tài)為T(mén)ASK_INTERRUPTIBLE 或TASK_UNINTERRUPTIBLE 的進(jìn)程調(diào)度,那么還有一個(gè)附加的步驟將被執(zhí)行:當(dāng)前執(zhí)行的進(jìn)程在另外一個(gè)進(jìn)程被調(diào)度之前會(huì)被從運(yùn)行隊(duì)列中移出,這將導(dǎo)致正在運(yùn)行的那個(gè)進(jìn)程進(jìn)入睡眠,因?yàn)樗呀?jīng)不在運(yùn)行隊(duì)列中了。
      我們可以使用下面的這個(gè)函數(shù)將剛才那個(gè)進(jìn)入睡眠的進(jìn)程喚醒。
      wake_up_process(sleeping_task);  
      在調(diào)用了wake_up_process()以后,這個(gè)睡眠進(jìn)程的狀態(tài)會(huì)被設(shè)置為T(mén)ASK_RUNNING,而且調(diào)度器會(huì)把它加入到運(yùn)行隊(duì)列中去。當(dāng)然,這個(gè)進(jìn)程只有在下次被調(diào)度器調(diào)度到的時(shí)候才能真正地投入運(yùn)行。
      2、無(wú)效喚醒
      幾乎在所有的情況下,進(jìn)程都會(huì)在檢查了某些條件之后,發(fā)現(xiàn)條件不滿足才進(jìn)入睡眠。可是有的時(shí)候進(jìn)程卻會(huì)在 判定條件為真后開(kāi)始睡眠,如果這樣的話進(jìn)程就會(huì)無(wú)限期地休眠下去,這就是所謂的無(wú)效喚醒問(wèn)題。在操作系統(tǒng)中,當(dāng)多個(gè)進(jìn)程都企圖對(duì)共享數(shù)據(jù)進(jìn)行某種處理,而 最后的結(jié)果又取決于進(jìn)程運(yùn)行的順序時(shí),就會(huì)發(fā)生競(jìng)爭(zhēng)條件,這是操作系統(tǒng)中一個(gè)典型的問(wèn)題,無(wú)效喚醒恰恰就是由于競(jìng)爭(zhēng)條件導(dǎo)致的。
      設(shè)想有兩個(gè)進(jìn)程A 和B,A 進(jìn)程正在處理一個(gè)鏈表,它需要檢查這個(gè)鏈表是否為空,如果不空就對(duì)鏈表里面的數(shù)據(jù)進(jìn)行一些操作,同時(shí)B進(jìn)程也在往這個(gè)鏈表添加節(jié)點(diǎn)。當(dāng)這個(gè)鏈表是空的時(shí)候,由于無(wú)數(shù)據(jù)可操作,這時(shí)A進(jìn)程就進(jìn)入睡眠,當(dāng)B進(jìn)程向鏈表里面添加了節(jié)點(diǎn)之后它就喚醒A 進(jìn)程,其代碼如下:
      A進(jìn)程:
    1 spin_lock(&list_lock);
    2 if(list_empty(&list_head)) {
    3 spin_unlock(&list_lock);
    4 set_current_state(TASK_INTERRUPTIBLE);
    5 schedule();
    6 spin_lock(&list_lock);
    7 }
    8
    9 /* Rest of the code ... */
    10 spin_unlock(&list_lock);
      B進(jìn)程:
      100 spin_lock(&list_lock);
      101 list_add_tail(&list_head, new_node);
      102 spin_unlock(&list_lock); 
      103 wake_up_process(processa_task);
      這里會(huì)出現(xiàn)一個(gè)問(wèn)題,假如當(dāng)A進(jìn)程執(zhí)行到第3行后第4行前的時(shí)候,B進(jìn)程被另外一個(gè)處理器調(diào)度投入運(yùn)行。在這個(gè)時(shí)間片內(nèi),B進(jìn)程執(zhí)行完了它所有的指令,因此它試圖喚醒A進(jìn)程,而此時(shí)的A進(jìn)程還沒(méi)有進(jìn)入睡眠,所以喚醒操作無(wú)效。在這之后,A 進(jìn)程繼續(xù)執(zhí)行,它會(huì)錯(cuò)誤地認(rèn)為這個(gè)時(shí)候鏈表仍然是空的,于是將自己的狀態(tài)設(shè)置為T(mén)ASK_INTERRUPTIBLE然后調(diào)用schedule()進(jìn)入睡眠。由于錯(cuò)過(guò)了B進(jìn)程喚醒,它將會(huì)無(wú)限期的睡眠下去,這就是無(wú)效喚醒問(wèn)題,因?yàn)榧词规湵碇杏袛?shù)據(jù)需要處理,A 進(jìn)程也還是睡眠了。
      3、避免無(wú)效喚醒
      如何避免無(wú)效喚醒問(wèn)題呢?我們發(fā)現(xiàn)無(wú)效喚醒主要發(fā)生在檢查條件之后和進(jìn)程狀態(tài)被設(shè)置為睡眠狀態(tài)之前, 本來(lái)B進(jìn)程的wake_up_process()提供了一次將A進(jìn)程狀態(tài)置為T(mén)ASK_RUNNING 的機(jī)會(huì),可惜這個(gè)時(shí)候A進(jìn)程的狀態(tài)仍然是TASK_RUNNING,所以wake_up_process()將A進(jìn)程狀態(tài)從睡眠狀態(tài)轉(zhuǎn)變?yōu)檫\(yùn)行狀態(tài)的努力 沒(méi)有起到預(yù)期的作用。要解決這個(gè)問(wèn)題,必須使用一種保障機(jī)制使得判斷鏈表為空和設(shè)置進(jìn)程狀態(tài)為睡眠狀態(tài)成為一個(gè)不可分割的步驟才行,也就是必須消除競(jìng)爭(zhēng)條 件產(chǎn)生的根源,這樣在這之后出現(xiàn)的wake_up_process ()就可以起到喚醒狀態(tài)是睡眠狀態(tài)的進(jìn)程的作用了。
      找到了原因后,重新設(shè)計(jì)一下A進(jìn)程的代碼結(jié)構(gòu),就可以避免上面例子中的無(wú)效喚醒問(wèn)題了。
      A進(jìn)程:
    1 set_current_state(TASK_INTERRUPTIBLE);
    2 spin_lock(&list_lock);
    3 if(list_empty(&list_head)) {
    4 spin_unlock(&list_lock);
    5 schedule();
    6 spin_lock(&list_lock);
    7 }
    8 set_current_state(TASK_RUNNING);
    9
    10 /* Rest of the code ... */
    11 spin_unlock(&list_lock);
      可以看到,這段代碼在測(cè)試條件之前就將當(dāng)前執(zhí)行進(jìn)程狀態(tài)轉(zhuǎn)設(shè)置成TASK_INTERRUPTIBLE了,并且在鏈表不為空的情況下又將自己置為T(mén)ASK_RUNNING狀態(tài)。這樣一來(lái)如果B進(jìn)程在A進(jìn)程進(jìn)程檢查了鏈表為空以后調(diào)用wake_up_process(),那么A進(jìn)程的狀態(tài)就會(huì)自動(dòng)由原來(lái)TASK_INTERRUPTIBLE變成TASK_RUNNING,此后即使進(jìn)程又調(diào)用了schedule(),由于它現(xiàn)在的狀態(tài)是TASK_RUNNING,所以仍然不會(huì)被從運(yùn)行隊(duì)列中移出,因而不會(huì)錯(cuò)誤的進(jìn)入睡眠,當(dāng)然也就避免了無(wú)效喚醒問(wèn)題。
      4、Linux內(nèi)核的例子
      在Linux操作系統(tǒng)中,內(nèi)核的穩(wěn)定性至關(guān)重要,為了避免在Linux操作系統(tǒng)內(nèi)核中出現(xiàn)無(wú)效喚醒問(wèn)題,Linux內(nèi)核在需要進(jìn)程睡眠的時(shí)候應(yīng)該使用類(lèi)似如下的操作:
      /* ‘q’是我們希望睡眠的等待隊(duì)列 */
      DECLARE_WAITQUEUE(wait,current);
      add_wait_queue(q, &wait);
      set_current_state(TASK_INTERRUPTIBLE);
      /* 或TASK_INTERRUPTIBLE */
      while(!condition) /* ‘condition’ 是等待的條件*/
      schedule(); 
      set_current_state(TASK_RUNNING);
      remove_wait_queue(q, &wait);
      上面的操作,使得進(jìn)程通過(guò)下面的一系列步驟安全地將自己加入到一個(gè)等待隊(duì)列中進(jìn)行睡眠:首先調(diào)用DECLARE_WAITQUEUE ()創(chuàng)建一個(gè)等待隊(duì)列的項(xiàng),然后調(diào)用add_wait_queue()把自己加入到等待隊(duì)列中,并且將進(jìn)程的狀態(tài)設(shè)置為 TASK_INTERRUPTIBLE 或者TASK_INTERRUPTIBLE。然后循環(huán)檢查條件是否為真:如果是的話就沒(méi)有必要睡眠,如果條件不為真,就調(diào)用schedule()。當(dāng)進(jìn)程 檢查的條件滿足后,進(jìn)程又將自己設(shè)置為T(mén)ASK_RUNNING 并調(diào)用remove_wait_queue()將自己移出等待隊(duì)列。
      從上面可以看到,Linux的內(nèi)核代碼維護(hù)者也是在進(jìn)程檢查條件之前就設(shè)置進(jìn)程的狀態(tài)為睡眠狀態(tài),
      然后才循環(huán)檢查條件。如果在進(jìn)程開(kāi)始睡眠之前條件就已經(jīng)達(dá)成了,那么循環(huán)會(huì)退出并用set_current_state()將自己的狀態(tài)設(shè)置為就緒,這樣同樣保證了進(jìn)程不會(huì)存在錯(cuò)誤的進(jìn)入睡眠的傾向,當(dāng)然也就不會(huì)導(dǎo)致出現(xiàn)無(wú)效喚醒問(wèn)題。
      下面讓我們用linux 內(nèi)核中的實(shí)例來(lái)看看Linux 內(nèi)核是如何避免無(wú)效睡眠的,這段代碼出自Linux2.6的內(nèi)核(linux-2.6.11/kernel/sched.c: 4254):
      4253 /* Wait for kthread_stop */
      4254 set_current_state(TASK_INTERRUPTIBLE);
      4255 while (!kthread_should_stop()) {
      4256 schedule();
      4257 set_current_state(TASK_INTERRUPTIBLE);
      4258 }
      4259 __set_current_state(TASK_RUNNING);
      4260 return 0; 
      上面的這些代碼屬于遷移服務(wù)線程migration_thread,這個(gè)線程不斷地檢查kthread_should_stop(),直到kthread_should_stop()返回1它才可以退出循環(huán),也就是說(shuō)只要kthread_should_stop()返回0該進(jìn)程就會(huì)一直睡 眠。從代碼中我們可以看出,檢查kthread_should_stop()確實(shí)是在進(jìn)程的狀態(tài)被置為T(mén)ASK_INTERRUPTIBLE后才開(kāi)始執(zhí)行的。因此,如果在條件檢查之后但是在schedule()之前有其他進(jìn)程試圖喚醒它,那么該進(jìn)程的喚醒操作不會(huì)失效。
      小結(jié)
      通過(guò)上面的討論,可以發(fā)現(xiàn)在Linux 中避免進(jìn)程的無(wú)效喚醒的關(guān)鍵是在進(jìn)程檢查條件之前就將進(jìn)程的狀態(tài)置為T(mén)ASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE,并且如果檢查的條件滿足的話就應(yīng)該將其狀態(tài)重新設(shè)置為T(mén)ASK_RUNNING。這樣無(wú)論進(jìn)程等待的條件是否滿足, 進(jìn)程都不會(huì)因?yàn)楸灰瞥鼍途w隊(duì)列而錯(cuò)誤地進(jìn)入睡眠狀態(tài),從而避免了無(wú)效喚醒問(wèn)題。

    posted @ 2014-09-15 10:44 順其自然EVO 閱讀(209) | 評(píng)論 (0)編輯 收藏

    Selenium Grid深入學(xué)習(xí)

     應(yīng)網(wǎng)友要求寫(xiě)一個(gè)用Selenium Grid控制多系統(tǒng)多瀏覽器并行執(zhí)行test case的例子。
      因?yàn)槲疫@里有兩臺(tái)機(jī)子,我打算這樣演示:
      一臺(tái)機(jī)子啟動(dòng)一個(gè)作為主點(diǎn)節(jié)的hub 和 一個(gè)作為次節(jié)點(diǎn)的hub(系統(tǒng)windows 瀏覽器為ie) ip為:192.168.40.24
      另一臺(tái)機(jī)子啟動(dòng)兩個(gè)次節(jié)點(diǎn)hub,一個(gè)次節(jié)點(diǎn)瀏覽器為firefox,另一個(gè)瀏覽器為chrome (系統(tǒng)為windows),ip為:192.168.40.67
      啟動(dòng)各節(jié)點(diǎn)hub
      啟動(dòng)主節(jié)點(diǎn)hub命令:
      java -jar selenium-server-standalone-2.24.1.jar -role hub
      啟動(dòng)與主節(jié)點(diǎn)同一機(jī)子的次節(jié)點(diǎn)hub命令:
      java -jar selenium-server-standalone-2.24.1.jar -role node  -hub http://localhost:4444/grid/register -browser browserName="internet explorer"
      啟動(dòng)另外一臺(tái)機(jī)子的兩個(gè)節(jié)點(diǎn)hub命令分別為:
      啟動(dòng)firefox的
      java -jar selenium-server-standalone-2.24.1.jar   -Dwebdriver.firefox.bin="D:/Program Files/Mozilla Firefox/firefox.exe" -role webdriver  -hub http://192.168.40.24:4444/grid/register -browser browserName=firefox
      其中-Dwebdriver.firefox.bin="D:/Program Files/Mozilla Firefox/firefox.exe"這個(gè)是傳我的firefox瀏覽器安裝地址,不然找不到。
      啟動(dòng)chrome的
      java -jar selenium-server-standalone-2.24.1.jar   -Dwebdriver.chrome.driver="D:/chromedriver.exe" -role webdriver  -hub http://192.168.40.24:4444/grid/register -port 6666 -browser browserName=chrome
      其中-Dwebdriver.chrome.driver="D:/chromedriver.exe",這個(gè)是傳入我chromedriver.exe的放置地址。端口設(shè)為6666,防止和上面firefox的重復(fù)。
      鏈接好后,可以在http://localhost:4444/grid/console可以查看到三個(gè)子節(jié)點(diǎn)的狀態(tài)。啟動(dòng)詳細(xì)方法可以參考前面的文章
      Selenium Grid只是提供多系統(tǒng)、多瀏覽器的執(zhí)行環(huán)境,而不是說(shuō)任務(wù)一個(gè)test case丟給它就能并行運(yùn)行。并行的運(yùn)行我這里就交給testng了。看下面代碼和配制。
      testcase 代碼 和 testng.xml
      testcase代碼:
    package driver;
    import java.net.MalformedURLException;
    import java.net.URL;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.openqa.selenium.remote.RemoteWebDriver;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;
    public class GridParallelTests {
    private WebDriver dr;
    DesiredCapabilities test;
    String baseUrl;
    @Parameters({"browser","nodeUrl","webSite"})
    @BeforeMethod
    public void setUp(String browser,String nodeUrl,String webSite){
    baseUrl = webSite;
    if(browser.equals("ie")) test = DesiredCapabilities.internetExplorer();
    else if(browser.equals("ff")) test = DesiredCapabilities.firefox();
    else if(browser.equals("chrome")) test = DesiredCapabilities.chrome();
    else System.out.println("browser參數(shù)有誤,只能為ie、 ff、chrome");
    String url = nodeUrl + "/wd/hub";
    URL urlInstance = null;
    try {
    urlInstance = new URL(url);
    } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    System.out.println("實(shí)例化url出錯(cuò),檢查一下url格式是否正確,格式為:http://192.168.40.67:5555");
    }
    dr = new RemoteWebDriver(urlInstance,test);
    dr.get(webSite);
    }
    @Test
    public void test(){
    dr.get(baseUrl);
    dr.findElement(By.id("kw")).sendKeys("selenium");
    dr.findElement(By.id("su")).click();
    try {
    Thread.sleep(10000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("title:"+dr.getTitle());
    }
    @AfterMethod
    public void quit(){
    dr.close();
    }
    }
     testng.xml:
    <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
    <suite name="Suite1"  parallel="tests" thread-count="5">
    <test name="test1">
    <parameter name="browser" value="ff"/>
    <parameter name="nodeUrl" value="http://192.168.40.67:5555"/>
    <parameter name="webSite" value="http://www.baidu.com"/>
    <classes>
    <class name="driver.GridParallelTests"></class>
    </classes>
    </test>
    <test name="test2">
    <parameter name="browser" value="chrome"/>
    <parameter name="nodeUrl" value="http://192.168.40.67:6666"/>
    <parameter name="webSite" value="http://www.baidu.com"/>
    <classes>
    <class name="driver.GridParallelTests"></class>
    </classes>
    </test>
    <test name="test3">
    <parameter name="browser" value="ie"/>
    <parameter name="nodeUrl" value="http://192.168.40.24:5555"/>
    <parameter name="webSite" value="http://www.baidu.com"/>
    <classes>
    <class name="driver.GridParallelTests"></class>
    </classes>
    </test>
    </suite>
      運(yùn)行testng.xml就可以了。
      如果你是用ant把上面的參數(shù)傳進(jìn)去也是可以的。我這里就直接簡(jiǎn)單地放在testng.xml了。

    posted @ 2014-09-15 10:33 順其自然EVO 閱讀(194) | 評(píng)論 (0)編輯 收藏

    LoadRunner啟動(dòng)自帶例子Web Tours報(bào)錯(cuò)

    1.啟動(dòng)Samples-Web-Start Web Server時(shí),提示Could not open port 1080-Port is already used by another server(wsaeaddrinuse)
      解決方法:
      找到xitami.cgf,將protbase=1000改為2000
      [C:\Program Files\HP\LoadRunner\WebTours]
      2.啟動(dòng)Samples-Web-Start Web Server時(shí),提示your request was unsuccessful,Cannot create CGI process
      解決方法:
      a.可能未安裝strawberry-perl.
      b.如正常安裝,請(qǐng)打開(kāi)WebTours文件夾下的run.bat,查看其SET PATH路徑設(shè)置是否正確,尤其是perl安裝路徑,此BAT后默認(rèn)perl安裝在C盤(pán),c:\strawberry\c\bin;c:\strawberry\perl\bin  如你安裝strawberry并非此路路徑,在此修改BAT保存是沒(méi)用的,需重新安裝perl到C盤(pán),或COPY一份到C盤(pán)下。重啟start web server.服務(wù).
      3.LoadRunner Sample WebTours 點(diǎn)擊Flights出現(xiàn)空白解決方法
      解決方法:找環(huán)境變量,發(fā)現(xiàn)PERL5LIB變量中的值與LOG文件的匹配,值為:D:\oracle\product\10.2.0\db_2\perl\5.8.3\lib\MSWin32-x86;D:\oracle\product\10.2.0\db_2\perl\5.8.3\lib;D:\oracle\product\10.2.0\db_2\perl\5.8.3\lib\MSWin32-x86;D:\oracle\product\10.2.0\db_2\perl\site\5.8.3;D:\oracle\product\10.2.0\db_2\perl\site\5.8.3\lib;D:\oracle\product\10.2.0\db_2\sysman\admin\scripts;
      去除所有帶5.8.3的值,修改后的值為D:\oracle\product\10.2.0\db_2\sysman\admin\scripts;
      此時(shí)sample運(yùn)行正常。但不知道對(duì)ORACLE有什么影響。
      怕對(duì)oracle有影響,我在StartServer.bat里加上了對(duì)這個(gè)變量的設(shè)置
      編輯StartServer.bat  在最上面加上SET PERL5LIB=C:\oracle\product\10.2.0\db_1\sysman\admin\scripts

    posted @ 2014-09-15 10:32 順其自然EVO 閱讀(1981) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共394頁(yè): First 上一頁(yè) 47 48 49 50 51 52 53 54 55 下一頁(yè) Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 精品国产亚洲一区二区三区| 成人免费无码H在线观看不卡| 成年女人18级毛片毛片免费| 亚洲天堂一区二区三区四区| 亚洲欧美日韩中文无线码| 国产91色综合久久免费| 亚洲中文字幕在线第六区| 一级毛片免费在线播放| 亚洲午夜日韩高清一区| 国产精品玖玖美女张开腿让男人桶爽免费看 | 在线播放免费人成视频在线观看| 国产精品亚洲精品青青青| 人禽杂交18禁网站免费| 亚洲av无码一区二区三区乱子伦 | 亚洲精品无码av中文字幕| 毛片a级毛片免费播放下载| 亚洲偷自拍另类图片二区| 女人张开腿给人桶免费视频| 亚洲七久久之综合七久久| 在线免费观看韩国a视频| 男人和女人高潮免费网站 | 亚洲va成无码人在线观看| 免费A级毛片无码免费视| 亚洲日韩国产一区二区三区在线| 四虎成人精品一区二区免费网站| 欧美激情综合亚洲一二区| 亚洲v国产v天堂a无码久久| 精品无码一级毛片免费视频观看| 亚洲人成网77777色在线播放| 国产精品99久久免费观看| 亚洲精品国产日韩无码AV永久免费网| 窝窝影视午夜看片免费| 永久黄网站色视频免费| 色婷婷精品免费视频| 亚洲中文字幕无码不卡电影| 亚洲免费精彩视频在线观看| 亚洲va成无码人在线观看| 国产99视频精品免费视频7| 久久国产免费直播| 亚洲网站在线观看| 成人奭片免费观看|