構(gòu)建感測(cè)是一個(gè)用在持續(xù)集成周期中,用以描述構(gòu)建長(zhǎng)期統(tǒng)計(jì)數(shù)據(jù)的術(shù)語(yǔ)。Bamboo,一個(gè)不錯(cuò)的CI工具,它提供了很高級(jí)的構(gòu)建特性。構(gòu)建感測(cè)為你提供了關(guān)于構(gòu)建要花多久,是否成功,以及解決這個(gè)構(gòu)建失敗問(wèn)題要花多久等等之類的信息。這些數(shù)據(jù)很重要,因?yàn)樗梢宰屇阒罉?gòu)建過(guò)程長(zhǎng)期以來(lái)是什么樣的。正是這種數(shù)據(jù),而不是單個(gè)構(gòu)建的結(jié)果,可以幫助你終優(yōu)化構(gòu)建過(guò)程。

  一定數(shù)量和頻率的構(gòu)建失敗一直是一個(gè)不錯(cuò)的著手點(diǎn)。隔離的構(gòu)建失敗通常不需要擔(dān)心??你需要做的是去檢查一系列反復(fù)出現(xiàn)的構(gòu)建失敗。當(dāng)一個(gè)構(gòu)建反復(fù)失敗時(shí),也許是因?yàn)殚_(kāi)發(fā)人員正糾結(jié)于一段非常麻煩的代碼,或者是團(tuán)隊(duì)人員沒(méi)注意到。雖然這兩問(wèn)題的原因不一樣,并且解決的方法也不一樣,但是它們都應(yīng)當(dāng)被進(jìn)一步地調(diào)查。

  通過(guò)深入分析測(cè)試結(jié)果,你可以了解到更多關(guān)于為什么構(gòu)建會(huì)失敗的信息。許多現(xiàn)代的CI工具都可以讓你研究長(zhǎng)期的測(cè)試行為,例如,把一直經(jīng)常失敗的、或者要花很長(zhǎng)時(shí)間進(jìn)行解決的測(cè)試跟其他測(cè)試隔離開(kāi)來(lái)。如果同樣的測(cè)試不斷失敗的話,這意味著有什么地方過(guò)于復(fù)雜或者代碼過(guò)于脆弱,這種情況下可以做一些重構(gòu)。除此之外,這些工具還能讓你知道測(cè)試運(yùn)行了多久,這是另一類問(wèn)題發(fā)生的源頭。

  事實(shí)上,構(gòu)建失敗不是減慢開(kāi)發(fā)進(jìn)程的原因。緩慢的構(gòu)建過(guò)程是另一個(gè)罪魁禍?zhǔn)住?/FONT>

  導(dǎo)致構(gòu)建過(guò)程緩慢的常見(jiàn)的原因是結(jié)構(gòu)混亂的測(cè)試套件。經(jīng)驗(yàn)豐富的Java開(kāi)發(fā)人員常常會(huì)將單元測(cè)試與集成測(cè)試分開(kāi)來(lái)。雖然兩者區(qū)別大差不差,但是一般來(lái)說(shuō),單元測(cè)試是相對(duì)孤立的、較小的、快速的、輕量級(jí)的測(cè)試類。它們主要是用來(lái)確保類能夠獨(dú)立地正常工作。而另一方面,集成測(cè)試則較為緩慢,需要更長(zhǎng)的運(yùn)行時(shí)間,并且可能會(huì)訪問(wèn)外部的資源如測(cè)試數(shù)據(jù)庫(kù),或者加載復(fù)雜的配置文件。它們被用來(lái)測(cè)試應(yīng)用程序中的不同模塊和類如何共同工作。性能測(cè)試和集成測(cè)試差不多,但是兩者的目標(biāo)有所不同。

  輕量級(jí)且運(yùn)行很快的單元測(cè)試可以被迅速的執(zhí)行完,并且在測(cè)試失敗時(shí)能夠給出很快的反饋。而另一方面,如果緩慢運(yùn)行的集成測(cè)試與單元測(cè)試混在一起,那么單元測(cè)試將要花上更多的時(shí)間來(lái)執(zhí)行,結(jié)果開(kāi)發(fā)人員也要等更久才會(huì)得到關(guān)于單元測(cè)試失敗的消息。解決之道是為單元測(cè)試和集成/性能測(cè)試創(chuàng)建單獨(dú)的構(gòu)建計(jì)劃。使用這種方式后,如果單元測(cè)試構(gòu)建計(jì)劃失敗了,由于其執(zhí)行速度很快,開(kāi)發(fā)人員不再需要等待很長(zhǎng)時(shí)間才被通知到構(gòu)建失敗。如果單元測(cè)試成功后,集成測(cè)試和性能測(cè)試計(jì)劃才會(huì)開(kāi)始。

  另外,還有一個(gè)補(bǔ)充方法??可以使用分布式構(gòu)建。例如,如果你的web功能測(cè)試由于要在幾個(gè)不同的瀏覽器上運(yùn)行并因此消耗很長(zhǎng)時(shí)間,那么可以為每一個(gè)瀏覽器設(shè)立一個(gè)構(gòu)建作業(yè),以讓它們(可能在不同的機(jī)器上)并行運(yùn)行。

  另一個(gè)問(wèn)題來(lái)自過(guò)于緩慢和效率低下的測(cè)試用例。有許多方法可以用來(lái)監(jiān)測(cè)這些緩慢的測(cè)試。提高測(cè)試上的運(yùn)行時(shí)間意味著有些測(cè)試會(huì)由于所需時(shí)間太長(zhǎng)而無(wú)法運(yùn)行。這也許是因?yàn)樗鼈儽辉O(shè)計(jì)的很糟糕,也許是因?yàn)樾阅軉?wèn)題(需要進(jìn)步一深究),抑或是集成測(cè)試偽裝成了單元測(cè)試。

  密切關(guān)注代碼質(zhì)量

  持續(xù)集成服務(wù)器不應(yīng)當(dāng)僅僅是一個(gè)自動(dòng)構(gòu)建的機(jī)器。它應(yīng)當(dāng)成為你團(tuán)隊(duì)中溝通的中樞,尤其在代碼質(zhì)量上。時(shí)刻關(guān)注編碼規(guī)范和一些度量值如代碼覆蓋率以及代碼復(fù)雜度,它們可以讓應(yīng)用程序更加可靠且更易維護(hù)。

  有很多的工具可以幫助維護(hù)應(yīng)用程序中良好規(guī)范的代碼。靜態(tài)分析工具如Checkstyle,PMD和FindBugs,它們根據(jù)代碼標(biāo)準(zhǔn)、佳實(shí)踐或者潛在的bug來(lái)對(duì)代碼進(jìn)行分析。你所有使用的工具如何配置要依賴于你想要達(dá)到的目標(biāo)。例如,Checkstyle更多關(guān)注于編碼規(guī)范和佳實(shí)踐,而 Findbugs則更傾向于找出錯(cuò)誤的,破碎的或者危險(xiǎn)的代碼。所有的這些工具可以很輕松地集成到自動(dòng)化構(gòu)建過(guò)程中,并且可以和Ant、Maven一起很好地工作。

  覆蓋測(cè)試率是代碼質(zhì)量的另一個(gè)方面。它用來(lái)衡量測(cè)試執(zhí)行時(shí)所訪問(wèn)的代碼行數(shù)。Java開(kāi)發(fā)人員中對(duì)覆蓋測(cè)試率統(tǒng)計(jì)的相對(duì)值仍然有著分歧。事實(shí)上,雖然它可以告訴你應(yīng)用程序中的哪些行被執(zhí)行,但是沒(méi)法知道那些測(cè)試是寫得很徹底、寫得很好,抑或僅僅是簡(jiǎn)單的走馬觀花?偠灾,測(cè)試覆蓋率不能保證你的測(cè)試質(zhì)量很高??只有人工進(jìn)行代碼檢查時(shí)才能確保如此。然而覆蓋測(cè)試率的度量值可以很好地展示出哪些代碼沒(méi)有被測(cè)試過(guò)。在Java世界里,用得多的代碼覆蓋率測(cè)試工具當(dāng)屬Clover和Cobertura,前者是一個(gè)非常強(qiáng)大的商業(yè)代碼覆蓋率測(cè)試工具,而后者是一個(gè)更加輕量級(jí)的開(kāi)源工具。它們都可以很容易地集成到基于Ant和Maven的構(gòu)建腳本中。