qileilove

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

          Java字節(jié)碼深入解析

               摘要: 一:Java字節(jié)代碼的組織形式  類文件{  OxCAFEBABE,小版本號,大版本號,常量池大小,常量池?cái)?shù)組,訪問控制標(biāo)記,當(dāng)前類信息,父類信息,實(shí)現(xiàn)的接口個數(shù),實(shí)現(xiàn)的接口信息數(shù)組,域個數(shù),域信息數(shù)組,方法個數(shù),方法信息數(shù)組,屬性個數(shù),屬性信息數(shù)組  }  二:查看方法 --- javap命令  例子:有一個Java類Demo.javapublic class Demo&nb...  閱讀全文

          posted @ 2011-12-06 11:10 順其自然EVO 閱讀(7947) | 評論 (0)編輯 收藏

          可用性測試的權(quán)衡之道

          可用性測試的權(quán)衡之道(一)

            對于可用性測試,業(yè)內(nèi)人士存在一些普遍認(rèn)可的原則。它們神圣地如同自然科學(xué)里的理論,似乎我們只能對其言聽計(jì)從、俯首稱臣才能踐行出“好的可用性測試”。其實(shí),即便是科學(xué),它的一個特征也是“可證偽性”——理論的正確性總是存在前提條件的。真理再向前一步就成為謬誤!

            可用性測試中的原則同樣如此,需要根據(jù)目的、資源、環(huán)境的不同,靈活把握、權(quán)衡取舍,而非一味恪守某一個或某幾個原則,也許這才是可用性從業(yè)人員經(jīng)驗(yàn)重要性的體現(xiàn)。

            一、任務(wù)設(shè)置:精細(xì) VS 寬泛

            制定的任務(wù)過于精細(xì),一般原則上是反對的。理由很清楚,如果你的任務(wù)精細(xì)到一步一步“引導(dǎo)”用戶進(jìn)行操作,那太不符合用戶現(xiàn)實(shí)中的使用情境,平時沒有人在旁邊“引導(dǎo)”用戶的每一步操作;而且過于控制用戶的操作步驟,用戶缺乏真實(shí)使用時的靈活性。

            是不是我們設(shè)置的任務(wù)只能是寬泛的,不能細(xì)化呢?這就必須根據(jù)研究的目的來做抉擇。如果產(chǎn)品處在設(shè)計(jì)的初期,我們需要關(guān)注一些宏大的問題(如:網(wǎng)站的整體架構(gòu)、導(dǎo)航和分類的合理性、頁面的邏輯關(guān)系),此時就需要通過寬泛而有彈性的任務(wù),來查找宏觀層面的問題。如果產(chǎn)品的設(shè)計(jì)已經(jīng)非常完善,開始進(jìn)行細(xì)節(jié)的修改迭代,此時就需要通過設(shè)置相對具體的任務(wù)來查找特定的細(xì)節(jié)問題(如:對某個命名的理解、按鈕的使用、鏈接的點(diǎn)擊、表單的填寫)。按照《Don’t make me think》一書的觀點(diǎn):一般用戶使用互聯(lián)網(wǎng)產(chǎn)品時滿足于能用就行,不會尋求最好的使用方法;只掃描網(wǎng)頁,不會仔細(xì)閱讀。所以,如果完全寬泛有彈性地設(shè)置任務(wù),雖然更吻合實(shí)際使用情況,但是很可能用戶直接跳過你想考察的細(xì)節(jié)。

            實(shí)際工作中,由于時間和資源的限制,無法做到每個產(chǎn)品從設(shè)計(jì)初期到上線前后進(jìn)行多次可用性測試。可能在一次的可用性測試中即需要同時關(guān)注宏觀方面和細(xì)節(jié)上的問題。此時,還是需要和產(chǎn)品經(jīng)理、交互設(shè)計(jì)師反復(fù)溝通,確認(rèn)測試的主要目的,同時通過對任務(wù)設(shè)置精細(xì)程度的權(quán)衡把握,使次要目的也盡量得以滿足。

            不過,即便是想考察細(xì)節(jié)的任務(wù),也要盡量避免“直接指導(dǎo)操作”式的語言描述方式,這樣能讓任務(wù)與真實(shí)使用情境不會相距太遠(yuǎn)。例如:想考察豆瓣讀書頁面【想要】按鈕是否能被看到、是否具備可點(diǎn)擊感。下面列出兩種表述方式,以作對比:

            A、請找到您喜歡的那本書,并在該頁面點(diǎn)擊【想要】。(×)

            B、請找到您喜歡的那本書,并在該頁面對其作個標(biāo)記。(√)

            二、任務(wù)數(shù)量:多VS少

            任務(wù)數(shù)量的多少與可用性測試考察范圍有關(guān),與任務(wù)的精細(xì)程度也有關(guān)。如果對網(wǎng)站全站進(jìn)行考察和只對其中某個頁面、某個操作流程進(jìn)行考察,所需的任務(wù)數(shù)量自然不一樣。在同樣的考察范圍下,如果任務(wù)設(shè)置得越精細(xì),所需任務(wù)數(shù)量也就越多。

            Lindgaard和Chattratichart(2007)的研究發(fā)現(xiàn)任務(wù)數(shù)量與發(fā)現(xiàn)可用性問題比例存在顯著的相關(guān)關(guān)系(r=0.82,p<0.01)。為了盡可能多地發(fā)現(xiàn)可用性問題,我們就盡量多地設(shè)置任務(wù)給用戶嗎?

            此時要考慮任務(wù)數(shù)量過多可能帶來的弊端:學(xué)習(xí)效應(yīng)和疲勞效應(yīng),尤其是靠后的任務(wù)更可能會受影響。心理學(xué)實(shí)驗(yàn)中處理此問題的方法是順序平衡,抵消影響。但是可用性測試中設(shè)置的場景和任務(wù)存在特定的先后次序,不適合采用順序平衡的方法。基于我們的經(jīng)驗(yàn),還是通過對測試的任務(wù)數(shù)量進(jìn)行控制,確保正式測試環(huán)節(jié)最多不超過1小時,加上前后的歡迎語、訪談、問答等,整個過程不超過1.5小時。

            此外,任務(wù)數(shù)量的多少還會間接影響到測試所需參與者數(shù)量的多少。

            三、用戶人數(shù):5個足夠VS 5個不夠

            Nielsen的研究發(fā)現(xiàn),5個用戶可以發(fā)現(xiàn)80%以上的可用性問題。這個結(jié)論得到許多人的推崇,因此稱之為“魔法數(shù)字5”。這個結(jié)論的來源依據(jù)是每個用戶平均可以發(fā)現(xiàn)30%的可用性問題,且假設(shè)所有問題都有同等被發(fā)現(xiàn)的概率。不過,當(dāng)設(shè)置的任務(wù)數(shù)量過多,且任務(wù)的精細(xì)程度和難度多種多樣時,這個前提有可能不成立。

            Lindgaard和Chattratichart(2007)的研究發(fā)現(xiàn)測試用戶數(shù)量與發(fā)現(xiàn)的可用性問題比例并不存在顯著的相關(guān)關(guān)系。這個結(jié)論似乎又支持我們選擇少量用戶進(jìn)行測試即可。
          \

           其實(shí),在用戶招募階段,比用戶數(shù)量更需要重視是用戶的代表性的問題。能否招募到有代表性的用戶將直接影響可用性測試的成敗。如測試一個醫(yī)療軟件產(chǎn)品,招募到醫(yī)護(hù)人員和患者作為測試用戶,那5個用戶可能就足夠了;但如果只招募到醫(yī)學(xué)實(shí)習(xí)生來測試,就必須超過5個以上的用戶(即便這樣,也未必能推論到整個產(chǎn)品的用戶群)。

            由此看來,招募用戶的人數(shù)和任務(wù)的數(shù)量、精細(xì)程度、用戶的代表性也是息息相關(guān)的。參考Tom Tullis(2009)和本人經(jīng)驗(yàn):當(dāng)可用性測試范圍限定在一定的范圍(20個任務(wù)內(nèi)、或30個網(wǎng)頁之內(nèi)),且招募到很強(qiáng)代表性的用戶,那么5個足夠了。如果存在著差別較大的亞群體,爭取做到每個亞群組有5個左右的代表性的用戶(當(dāng)然,目標(biāo)用戶的特征及分類應(yīng)該是在可用性測試之前的用戶調(diào)研階段就解決的問題);一次測試最多不會超過12個用戶。

            四、用戶表現(xiàn):行為VS言語

            在可用性測試中強(qiáng)調(diào)對用戶操作行為的關(guān)注,是毋庸置疑的。因?yàn)椋?/p>

            1、用戶的行為指標(biāo)更明確、具體、客觀,易觀察和記錄。

            2、如果完全把關(guān)注點(diǎn)放在用戶的操作行為上,那么就無需跟用戶進(jìn)行多余的(指導(dǎo)語之外的)語言交流。類似于心理學(xué)研究規(guī)范,對實(shí)驗(yàn)或測試中的指導(dǎo)語進(jìn)行統(tǒng)一,對一切無關(guān)變量(包括主試的語言、體態(tài)表情)進(jìn)行控制,以減少對研究過程的干擾。

            3、即便你直接詢問用戶某些問題,也極可能得到錯誤的答案。30年前Richard Nisbett和Timothy Wilson的實(shí)驗(yàn)、2年前Peter Johansson在《science》的文章,都證實(shí)了某些情況下人們無法解釋清楚自己行為的真正原因。另外,用戶還可能揣摩主試的喜好,回答他們認(rèn)為主試期望的答案。

            因此,有必要強(qiáng)調(diào)在可用性測試過程中關(guān)注的重點(diǎn)永遠(yuǎn)應(yīng)該是用戶的操作行為,而且盡量減少任何無關(guān)變量的干擾。但這個原則被有些人引申到極端,認(rèn)為只有觀察用戶的操作行為才有意義,其他信息都是無需關(guān)注的,甚至輕率地懷疑用戶的話都是不可信的。

            可用性測試的主要目的雖然是發(fā)現(xiàn)問題,但也需要了解問題背后的原因,而僅僅依靠觀察用戶的操作行為是無法獲悉所有問題背后的原因的,此時,我們就希望用戶能采用“出聲思維法”,出聲思維就是集中于如何與產(chǎn)品進(jìn)行交互的意識流。如果測試中的氛圍比較平等、自然、融洽,用戶又特別愿意表達(dá),那么用戶就會在進(jìn)行任務(wù)操作同時,表達(dá)他們想做什么、打算如何做、背后的原因是什么。此時,不僅是操作行為、用戶表達(dá)出來的想法和原因、以及語言中透露出的疑惑、失望、不滿、驚訝、猶豫等情緒同樣是需要我們加以關(guān)注的。但是,有些用戶比較內(nèi)向,不善于主動表達(dá)自己的想法,此時就需要主試跟他進(jìn)行簡單的交流,以引導(dǎo)用戶說出背后的原因(注:不是引導(dǎo)用戶說出你期望得到答案)。

            所以,在實(shí)際的可用性測試,基本應(yīng)該以關(guān)注用戶的行為為主,少量、適時地進(jìn)行詢問交流也是需要的。但這個度如何把握呢?

            1、當(dāng)用戶出現(xiàn)猶豫、驚訝、任務(wù)失敗(過程節(jié)點(diǎn)上出現(xiàn)自然而然地稍微中斷/暫停)的時候才進(jìn)行簡單的詢問。

            2、詢問采用一般疑問句的句式,重復(fù)用戶剛才的行為表現(xiàn)(要具體客觀):“你剛才沒有……,是嗎?”——雖然沒有直接問“為什么”,但暗示了希望聽到他進(jìn)一步的解釋。

            3、如果用戶沒有自己主動說出原因,可以“順便”問一下“為什么?”或通過身體前傾、目光注視等非語言方式來暗示用戶你希望能聽到更多內(nèi)容。若用戶很快、堅(jiān)定地說出原因,則該理由的可信度較高;如果用戶猶豫、或難以說出原因,就不要繼續(xù)追問。

            除了上述的語言、情緒、行為都需要得到關(guān)注,還有一種特殊情況是需要聽懂用戶“沒有說的”語言。例如,我們預(yù)計(jì)網(wǎng)站的某二級導(dǎo)航標(biāo)簽和一級導(dǎo)航標(biāo)簽存在分類邏輯上的不合理;但用戶在測試中,導(dǎo)航相關(guān)的操作步驟進(jìn)行得很流暢,用戶也什么都沒說。這通常表明用戶認(rèn)為這些是理所當(dāng)然的、不影響操作的——此時你需要聽懂用戶“沒有說的”語言。如果你簡單粗暴地打斷用戶并詢問:“你覺得這兩個導(dǎo)航標(biāo)簽如何?”,則變成了一種誘導(dǎo)性地提問。

            總結(jié)一下關(guān)于此部分內(nèi)容的實(shí)踐應(yīng)用:

            1、用戶的操作行為永遠(yuǎn)是可用性測試的重點(diǎn)。

            2、鼓勵用戶采用“出聲思維法”。

            3、適時、少量地向用戶提問,禁止對同一個問題反復(fù)追問“為什么”。

            4、采用真正地“傾聽”技術(shù)保持和用戶的交流狀態(tài),而非通過過多的話語。

            5、開放、不預(yù)設(shè)立場地觀察、傾聽用戶“沒有說的”語言。

            在可用性測試中考慮需要遵循的原則時,一定要理解它的適用條件,以及它和其它原則之間的互相影響,并結(jié)合本次用戶研究的目的、資源、環(huán)境綜合考慮,以盡可能形成一個最優(yōu)方案。由于博文長度所限,先總結(jié)這么多,在下次的文章中會繼續(xù)總結(jié)其它幾方面的原則。

          可用性測試的權(quán)衡之道(二)

            繼續(xù)討論可用性測試中各種原則的靈活運(yùn)用和注意事項(xiàng)。

            五、發(fā)現(xiàn)問題:真的 VS 假的

            判斷發(fā)現(xiàn)問題的真假,初看上去似乎不是個困難。多數(shù)或全部參與者都遇到的問題毫無疑問是明顯的可用性問題。或許有人會建議,根據(jù)參與者中發(fā)現(xiàn)該問題的人數(shù)比例來判斷:比例高是真問題,比例低是假問題。前半句話可以接受,后半句話則有待商榷。

            雖然可用性測試是相對嚴(yán)謹(jǐn)?shù)挠脩粞芯糠椒ǎ瞧鋵o關(guān)變量控制的嚴(yán)格程度和真正的心理學(xué)實(shí)驗(yàn)還是有一定的差距;并且心理學(xué)實(shí)驗(yàn)對每組參與者數(shù)量的最低要求是30人,這樣得出的結(jié)論(數(shù)量比例)才具有推論至一般的意義。而可用性測試一般才8人左右的參與人數(shù)(盡管招募的參與者在質(zhì)的方面非常具有代表性),但卻無法把可用性測試中出現(xiàn)的所有數(shù)量比例簡單推論至一般。8個參與者中有1人發(fā)現(xiàn)某個問題,不代表現(xiàn)實(shí)中出現(xiàn)同樣問題的真實(shí)用戶只有12.5%,更不代表這個問題不是真正的/嚴(yán)重的可用性問題。

            問題的真假除了根據(jù)問題出現(xiàn)的次數(shù)比例,還有很重要的考慮點(diǎn)是:用戶“錯誤行為”背后的認(rèn)知/思考方式是否合乎邏輯?

            這里順便借用一下諾曼《設(shè)計(jì)心理學(xué)》里談到的理論:概念模型——系統(tǒng)表象——心理模型。概念模型可認(rèn)為是產(chǎn)品設(shè)計(jì)人員對產(chǎn)品的設(shè)計(jì)思想;系統(tǒng)表象可認(rèn)為是產(chǎn)品展現(xiàn)出的交互界面;而心理模型則是用戶按照既往經(jīng)驗(yàn)對如何操作該產(chǎn)品的設(shè)想。從這個角度來認(rèn)識,可用性問題則是“概念模型、系統(tǒng)表象、心理模型”三者的不吻合或矛盾。

            通過分析用戶行為背后的認(rèn)知是否符合邏輯,來判斷發(fā)現(xiàn)的問題的真假,主要體現(xiàn)在以下幾點(diǎn):

            1、“概念模型、系統(tǒng)表象”的不一致

            產(chǎn)品設(shè)計(jì)人員突然發(fā)現(xiàn),界面的交互形式根本沒有反映出他原先的設(shè)計(jì)思想!

            2、“系統(tǒng)表象、心理模型”的不一致

            (1)用戶的思維方式受已有的同類產(chǎn)品的影響,并內(nèi)化接受,而新產(chǎn)品的“系統(tǒng)表象”和已有同類產(chǎn)品并不一致。

            (2)用戶在日常生活經(jīng)驗(yàn)中形成了許多并不科學(xué)地通俗理解世界的方式(比如通俗物理學(xué)、通俗心理學(xué)),但產(chǎn)品設(shè)計(jì)人員沒有意識到用戶在以這樣一種“自認(rèn)正確”的錯誤方式來理解和使用產(chǎn)品。

            如果發(fā)現(xiàn)的可用性問題屬于以上情況,那么即使只有一個參與者碰到,它也非常可能是一個真正的可用性問題。

            例如:讓用戶登錄購彩網(wǎng)站,查看自己上次購彩結(jié)果。大多數(shù)用戶點(diǎn)擊【個人中心】去查看,有2個用戶點(diǎn)擊【開獎公告】去查看,發(fā)現(xiàn)只有開獎號碼,沒有任何購彩結(jié)果信息后,再去點(diǎn)擊【個人中心】。僅2個人出現(xiàn)了稍微的偏差,而且很快就找到了正確的頁面,這貌似應(yīng)該不算什么問題。

            但若追究其行為背后的邏輯,并與其他用戶的反饋(“我上次買的號碼沒有直接顯示出來?”“這里看不到開獎的號碼啊?”)聯(lián)系起來,可以判斷用戶的心理模型和產(chǎn)品的系統(tǒng)表象不一致。用戶希望能同時對照著開獎號碼和自己買的號碼很方便地核對,而網(wǎng)站卻割裂兩部分放在不同的頁面,因此需要將這2個用戶碰到的問題當(dāng)作真正的可用性問題來對待。

           六、研究方法:定性 VS 定量

            可用性測試,很多時候被認(rèn)為是一種定性研究方法;但也有人說它是一種定量研究方法。究竟是怎么回事呢?

            個人認(rèn)為,可用性測試實(shí)質(zhì)上結(jié)合了定性和定量兩種方法的特點(diǎn),到底哪種成分更多,要看你的使用目的以及細(xì)節(jié)上如何操作。

            定量研究的思路是基于對一定數(shù)量樣本的測量,以將研究所得的結(jié)論推廣至總體。除了強(qiáng)調(diào)樣本的代表性,還對樣本的數(shù)量有具體的要求,同時會考慮抽樣誤差、置信度、置信區(qū)間的度量。并且定量研究過程中非常注重對某些自變量操控、及無關(guān)變量的控制。

            而定性研究重視對主觀意義的理解(如背后隱藏的原因),采用解釋建構(gòu)的方法,比如訪談法等。

            平時工作中以“形成式可用性”測試為主,即便它稍微偏向于定性研究,但在允許的范圍內(nèi),我個人還是盡可能地遵循著定量研究的方法去實(shí)施。這樣整個測試過程的嚴(yán)謹(jǐn)性能得到保證,結(jié)論的客觀程度相對更高(近幾個世紀(jì)來,量化研究一直是科學(xué)研究的主要范式,也正是這個原因)。具體做法如下:

            1、在任務(wù)的設(shè)置上:因?yàn)閰⑴c者可能存在差別較大的亞群體,不可能要求完成完全相同的任務(wù)。但必定會設(shè)置大部分基本的、都需要完成的公共任務(wù),再針對不同亞群體設(shè)置少量的特殊任務(wù)。在后期統(tǒng)計(jì)分析的時候,基本的公共任務(wù)則可以進(jìn)行數(shù)量化的統(tǒng)計(jì),并橫向比較。

            2、在測試過程中:關(guān)注參與者完成任務(wù)時的相關(guān)行為,用數(shù)字來記錄(以0、0.5、1分別表示失敗、幫助/提示下成功、成功)。主試盡量少地言語及體態(tài)姿勢的干擾,只在必要時進(jìn)行適當(dāng)?shù)匮哉Z交流。

            3、在報(bào)告呈現(xiàn):對任務(wù)完成情況(效率、完成率)統(tǒng)計(jì)呈現(xiàn),對不同任務(wù)的完成情況進(jìn)行比較,對亞群體間的任務(wù)完成情況進(jìn)行比較,對所有可用性問題按數(shù)量化指標(biāo)進(jìn)行排序等。或者比較迭代前后獨(dú)特問題的頻次是否減少,以及嚴(yán)重程度高的等級里面可用性問題數(shù)量的變化情況。

            4、測試過后,我們通常還會收集用戶自我報(bào)告式的數(shù)據(jù),作為“感知可用性”的一個總體反映。

            (1)推薦使用系統(tǒng)可用性量表(SUS),因?yàn)橛醒芯勘砻鱏US在少量樣本時即可產(chǎn)生較為一致的評分結(jié)果。

            (2)為減少用戶在填寫這些量表時的反應(yīng)心向,不要求填寫任何個人信息,且主試最好暫時回避。

            (3)只統(tǒng)計(jì)分析所有參與者SUS量表總分的平均值,切勿再拆分比較亞群體之間的差異,因?yàn)榧幢阈判Ф仍俑叩牧勘恚?dāng)樣本量極小時都會變得很不靠譜!

            七、問題優(yōu)先級:單指標(biāo) VS 多指標(biāo)

            除了在可用性測試過程中,最終報(bào)告也必須體現(xiàn)出量化、客觀地特點(diǎn)。例如,報(bào)告發(fā)現(xiàn)的可用性問題的列表,我也會以量化的方式排列出問題的優(yōu)先級別。

            這樣做的好處在于:首先,發(fā)現(xiàn)的可用性問題肯定有一些比另一些更嚴(yán)重;其次,考慮到產(chǎn)品和設(shè)計(jì)人員的精力和資源總是有限的,必須幫助他們梳理出最亟需整改的問題。站在別人的角度考慮問題,這樣他們才能更“友好地”接受我們的報(bào)告。

            可用性問題列表的排序,涉及到采用單指標(biāo)還是多指標(biāo)、以及指標(biāo)分為幾級的問題。




          先就量化的客觀性而言,“出現(xiàn)頻率”指標(biāo)是最客觀、最易量化的;而其它三個指標(biāo)都需分析人員的主觀判斷。

            就指標(biāo)的代表意義而言,“嚴(yán)重程度”、“出現(xiàn)頻率”與用戶體驗(yàn)最相關(guān),與用研人員的職責(zé)也最相關(guān)。另兩個指標(biāo)可能更多地是產(chǎn)品人員的職責(zé)。

            就指標(biāo)的價值而言,多個指標(biāo)的綜合顯然比單一指標(biāo)更有價值。

            基于上述考慮,實(shí)際工作中我會選擇“嚴(yán)重程度”和“出現(xiàn)頻率”兩個指標(biāo)的綜合,作為可用性問題的優(yōu)先級指標(biāo)。“嚴(yán)重程度”分為3級,而不是5級(分析人員主觀判斷時,3級指標(biāo)的誤差率要低于5級指標(biāo));“出現(xiàn)頻率”采用計(jì)算的具體數(shù)值,而非4級分類。這兩個指標(biāo)合并時,采用1:1的權(quán)重,具體公式為:

            問題優(yōu)先級=嚴(yán)重程度的級別+出現(xiàn)頻率的具體值×3

            八、報(bào)告呈現(xiàn):優(yōu)點(diǎn) VS 問題 VS 建議

            當(dāng)產(chǎn)品設(shè)計(jì)人員辛辛苦苦做出的產(chǎn)品卻被你報(bào)告上羅列的各種問題批評得一無是處時,即便理智上認(rèn)可你的成果,情感上也很難接受。因此報(bào)告中列出哪怕一條最重要的優(yōu)點(diǎn),也會讓產(chǎn)品設(shè)計(jì)人員感到欣慰、感受到你中立的態(tài)度,增加對報(bào)告的接納程度。列出優(yōu)點(diǎn)的另一個好處是,在測試中被參與者多次自發(fā)提及的優(yōu)點(diǎn)確實(shí)帶給用戶某種驚喜;當(dāng)你在報(bào)告中再次強(qiáng)調(diào)時,可以避免在后期迭代開發(fā)中丟失掉原本的優(yōu)點(diǎn)。

            問題的列舉肯定是報(bào)告中非常重要的部分,但切勿羅列出清單就草草了事,因?yàn)椋?/p>

            1、某個(些)問題和另一個(些)問題是有關(guān)聯(lián)的,但是報(bào)告中的問題列表部分卻割裂了這些聯(lián)系。

            2、產(chǎn)品設(shè)計(jì)人員無法一直參與旁聽/觀察可用性測試的過程,導(dǎo)致對報(bào)告中文字描述的問題缺乏感性認(rèn)識。

            3、只提問題卻不提供解決方案,就不是“建設(shè)性地提問”!

            因此,我們需要在可用性測試報(bào)告的后半部分提出針對重要問題的解決方案。其目標(biāo)并非是強(qiáng)迫產(chǎn)品設(shè)計(jì)人員一定要采納我們提出方案,而是:(1)把一些相關(guān)問題聯(lián)系起來看,(2)加深報(bào)告閱讀者對于問題的感性認(rèn)識和背后原因的理解,(3)使整個報(bào)告的思路更清晰、完整,(4)我們還可學(xué)到一些交互設(shè)計(jì)和產(chǎn)品的知識。

            總之,可用性測試施行起來既簡單又復(fù)雜。簡單是因?yàn)椴还苣闳绾问┬校K究能發(fā)現(xiàn)一些問題;復(fù)雜則在于發(fā)現(xiàn)可用性問題的質(zhì)量、重要性、對測試的利用效率、對產(chǎn)品設(shè)計(jì)人員的幫助程度可能相距甚遠(yuǎn)。一次成功的可用性測試體現(xiàn)在從前期策劃、測試過程、后期報(bào)告等整個過程中是否遵循了這些原則,并在某些難以兩全的原則面前做到合理的權(quán)衡取舍。

          posted @ 2011-12-05 14:45 順其自然EVO 閱讀(209) | 評論 (0)編輯 收藏

          使用單元測試的原因及使用前的準(zhǔn)備

          使用單元測試的原因及使用前的準(zhǔn)備

            1、自傲的編碼

            有一次——或許就是上個禮拜二——有兩個開發(fā)者:Pat 和Dale。他們面臨著不異的最后一日,而這一天也越來越近了。Pat 天天都在焦心地編寫代碼,寫完一個類又寫一個類,寫完一個函數(shù)又接著寫另一個函數(shù),還經(jīng)常不得不停下來做一些調(diào)整,使得代碼能夠經(jīng)由過程編譯。

            Pat 一向連結(jié)著這種工作體例,直到最后一日的前一天。而這時已經(jīng)是演示所有代碼的時候了。Pat 運(yùn)行了最上層的軌范,可是一點(diǎn)輸出也沒有,什么都沒有。這時只好用調(diào)試器來單步跟蹤了。“Hmm,決不成能是這樣的”,Pat 想,“此時這個變量絕對不是0 啊”。于是,Pat 只能回過頭來看代碼,考慮著跟蹤一下這個難以琢磨的程序的挪用流程。

            時刻已經(jīng)越來越晚了,Pat 找到且更正了這個bug;但在這個過程中,Pat 又找到了其他好幾個bug;如斯幾回事后,bug 仍是存在。而程序輸出何處,仍然沒有結(jié)果。這時,Pat 已經(jīng)筋疲力盡了,完全搞不清為什么會這樣,認(rèn)為這種(沒有輸出的)行為是毫無事理的。

            而于此同時,Dale 并沒像Pat 那么快地寫代碼。Dale 在寫一個函數(shù)的時候,會附帶寫一個簡短的測試程序來測試這個函數(shù)。這并沒有什么非凡的處所,只是添加了一個簡單的測試,來判定函數(shù)的功能是否和程序員期望的一致。顯然,考慮如何寫,然后把測試寫出來,是需要占用一定時間的;可是Dale 在未對剛寫的函數(shù)做出確認(rèn)之前,是不會接著寫新代碼的。也就是說,只有等到已知函數(shù)都獲得確認(rèn)之后,Dale 才會繼續(xù)編寫下一個函數(shù),然后挪用前面的函數(shù)等等。

            在整個過程中,Dale 幾乎不使用調(diào)試器;而且對Pat 的模樣也有些思疑不解:只見他頭埋在兩手之間,嘀咕著各類難聽的話語,詛咒著計(jì)較機(jī),充血的眼球同時盯著好幾個底時景口。

            最后一日終于到了,Pat 未能完成使命。而Dale 的代碼被集成到整個系統(tǒng)中,而且能夠很好地運(yùn)行。之后,在Dale 的模塊中,呈現(xiàn)了一個小問題;可是Dale 很快就發(fā)現(xiàn)了問題地址,在幾分鐘之內(nèi)就解決了問題。

            此刻,是該總結(jié)一下這個小故事的時候了:Dale 和Pat 的年數(shù)相當(dāng),編碼能力相當(dāng),智力也差不多。唯一的區(qū)別就是Dale 很是相信單元測試;對于每個新寫的函數(shù),在其他代碼使用這個函數(shù)并對它形成依靠之前,都要先做單元測試。

            而Pat 則沒有這么做,他老是“知道”代碼的行為應(yīng)該和所期望的完全一樣,而且等到所有代碼都差不多寫完的時候,才想起來運(yùn)行一下代碼。然而到了這個時辰,要想定位bug,或者,甚至是確定哪些代碼的行為是正確的,哪些代碼的行為是錯誤的,都為時已晚了。

            2、什么是單元測試

            單元測試是開發(fā)者編寫的一小段代碼,用于磨練被測代碼的一個很小的、很明晰的功能是否正確。凡是而言,一個單元測試是用于判定某個特定前提(或者場景)下某個特定函數(shù)的行為。例如,你可能把一個很年夜的值放入一個有序list 中去,然后確認(rèn)該值呈現(xiàn)在此刻list 的尾部。或者,你可能會年夜字符串中刪除匹配某種模式的字符,然后確認(rèn)字符串確實(shí)不再包含這些字符了。

            執(zhí)行單元測試,是為了證實(shí)某段代碼的行為確實(shí)和開發(fā)者所期望的一致。

            對于客戶或最終使用者而言,這種測試需要嗎,它與驗(yàn)收測試有關(guān)嗎?這個問題仍然很難回覆。事實(shí)上,我們在此并不關(guān)心服個產(chǎn)物確認(rèn)、驗(yàn)證和正確性等等;甚至此時,我們都不去關(guān)心性能方面的問題。我們所要做的一切就是要證實(shí)代碼的行為和我們的期望一致。所以,我們所要測試的是規(guī)模很小的、很是獨(dú)立的功能片段。經(jīng)由過程對所有零丁部門的行為成立起抉擇信念,確信它們都和我們的期望一致;然后,我們才能起頭組裝和測試整個系統(tǒng)。

            事實(shí)下場,若是我們對手上正在寫的代碼的行為是否和我們的期望一致都沒把握,那么其他形式的測試也都只能是華侈時刻而已。在單元測試之后,你還需要其他形式的測試,有可能是更正規(guī)的測試,那一切就都要看情形的需要來抉擇了。總之,做測試如同做善事,老是要巨匠(代碼最根基的正確性)起頭。

            3、為什么要使用單元測試

            單元測試不單會使你的工作完成得更輕松,而且會令你的設(shè)計(jì)變得更好,甚至削減你花在調(diào)試上的時間。

            在我們之前的小故事中,Pat 因?yàn)榧僭O(shè)底層的代碼是正確無誤的而卷入麻煩之中,先是高層代碼中使用了底層代碼;然后這些高層代碼又被更高層的代碼所使用,如斯往來來往。在對這些代碼的行為沒有任何抉擇信念的前提下,Pat 等于是在假設(shè)用豎立卡片堆砌了一間房子——只要將下面卡片輕輕移動,整間房子就會轟然傾塌。

            當(dāng)根基的底層代碼不再靠得住時,那么必需的改動就無法只局限在底層。雖然你可以批改底層的問題,可是這些對換層代碼的改削必然會影響到高層代碼,于是高層代碼也連帶地需要修改;以此遞推,就很可能會動到更高層的代碼。于是,一個對換層代碼的批改,可能會導(dǎo)致對幾乎所有代碼的陸續(xù)串改動,如此而使改動越來越多,也越來越復(fù)雜。于是,整間由卡片堆成的房子就由此傾塌,從而使整個項(xiàng)目也以失蹤失敗了卻。

            Pat 老是說:“這怎么可能呢?”或者“我其實(shí)想不明白為什么會這樣”。你發(fā)現(xiàn)自己有時候也會有這種想法。那么凡是你對自己的代碼還缺乏足夠抉擇信念的默示——你并不能確認(rèn)哪些是工作正常的而哪些不是。

            為了獲得Dale 所具有的那種對代碼的抉擇信念,你需要“詢問”代碼事實(shí)做了什么,并搜檢所發(fā)生的結(jié)過是否確實(shí)和你所期望的一致。

            這個簡單的設(shè)法描述了單元測試的焦點(diǎn)內(nèi)在:這個簡單的手藝就是為了令代碼變得加倍完美。

           4、我需要做什么

            其實(shí)惹人的單元測試是很簡單的,因?yàn)樗约壕筒紳M了樂趣。然而在項(xiàng)目交付的時候,我們給客戶和最終用戶的仍然是產(chǎn)物代碼,而不包含單元測試的代碼;所有,我們必需對單元測試的目的有個充實(shí)的熟悉。首先也是最主要的,使用單元測試是為了使你的工作——以及你隊(duì)友的工作——完成得加倍輕松。

            ● 它的行為和我的期望一致嗎?

            最根柢的,你需要回覆下面這個問題:“這段代碼達(dá)到我的目的了嗎?”也許代碼所做的是錯誤的工作,但那是另外的問題了。你要的是代碼向你證實(shí)它所做的就是你所期望的。

            ● 它的行為一向和我的期望一致嗎?

            很多開發(fā)者說他們只編寫一個測試。也就是讓所有代碼從頭至尾跑一次,只測試代碼的一條正確執(zhí)行路徑,只要這樣走一遍下來沒有問題,測試也就算是完成了。

            可是,現(xiàn)實(shí)當(dāng)然不會這么事事順心,工作也不老是那么順利:代碼會拋出異常,硬盤會沒有殘剩空間,收集會失蹤線,緩沖區(qū)會溢出等——而我們寫的代碼也會呈現(xiàn)bug。這就是軟件開發(fā)的“工程”部門。就“工程”而言,土木匠工程師在設(shè)計(jì)一座橋梁的時候,必需考慮橋梁的負(fù)載、強(qiáng)風(fēng)的影響、地震、洪水等等。電子工程師要考慮頻率漂移、電壓尖峰、噪音,甚至這些同時呈現(xiàn)時所帶來的問題。

            你不能這樣來測試一座橋梁:在風(fēng)和日麗的某一天,僅讓一輛車順?biāo)斓亻_過這座橋。顯然,這種測試對于橋梁測試來說是遠(yuǎn)遠(yuǎn)不夠的。相似地,在測試某段代碼的行為是否和你的期望一致時,你需要確認(rèn):在任何情形下,這段代碼是否都和你的期望一致;譬如在參數(shù)很可疑、硬盤沒有殘剩空間、收集失蹤線等的時候。

            ● 我可以依靠單元測試嗎?

            不能依靠的代碼是沒有多大用處的。但更糟糕的是,那些你自認(rèn)為可以相信的代碼(可是結(jié)果證實(shí)這些代碼是有bug 的)有時候也會讓你花很多時間在跟蹤和調(diào)試上。顯然,幾乎沒有項(xiàng)目可以許可你在這上面花費(fèi)太多的時間,是以無論如何,你都要避免這種“前進(jìn)一步,萎縮后退兩步”的開發(fā)體例。也就是說,要閃開開發(fā)過程連結(jié)不變的軌范前進(jìn)。

            沒人能夠?qū)懗鍪赖拇a;可是這并沒有關(guān)系——只要你知道問題的地址就足夠了。很多類型軟件項(xiàng)目的失敗,諸如只能把壞了的太空船擱淺在遙遠(yuǎn)的行星,或者在翱翔的途中就爆炸了,都能經(jīng)由過程確認(rèn)的限制來避免。例如,Arianne 5 號火箭軟件重用了來自于之前一個火箭項(xiàng)目的一個程序庫,而這個程序庫并不能措置新火箭的翱翔高度(比原本火箭要高),從而在起飛40 秒之后就發(fā)生了爆炸,導(dǎo)致5 億美元的損失蹤。

            顯然,我們但愿能夠依靠于所編寫的代碼,而且清楚地知道這些代碼的功能和約束。

            例如,假設(shè)你寫了一個反轉(zhuǎn)數(shù)值序列的體例。在測試的過程中,你也許會傳一個空序列給這個程序——但導(dǎo)致了程序解體。現(xiàn)實(shí)上,軌范并沒有要求該軌范必需能夠領(lǐng)受一個空序列,是以你可以只在體例的注釋中聲名這個約束:如不美觀傳遞一個空序列給這個體例,那么這個體例將會拋出一個異常。此刻你馬上就知道了該代碼的約束,年夜而也就不需要用其他很麻煩的體例來解決這個問題(因?yàn)樵谀承┑刂芬鉀Q這個問題并未便利,好比在高空年夜氣層中)。

            ● 單元測試聲名我的意圖了嗎?

            對于單元測試而言,一個最讓人歡快的意外收成就是它能夠輔佐你充實(shí)理解代碼的用法。簡單而言,單元測試就像是能執(zhí)行的文檔,了然在你用各類前提挪用代碼時,你所能期望這段代碼完成的功能。

            項(xiàng)目成員能夠經(jīng)由過程查看單元測試來找到如何使用你所寫代碼的例子。如果他偶然發(fā)現(xiàn)了一個你沒有考慮到的測試用例,那么他也可以很快地知道這個事實(shí):你的代碼可能并不支持這個用例。

            顯然,在正確性方面,可執(zhí)行的文檔有它的優(yōu)勢。與通俗的文檔分歧的是,單元測試不會呈現(xiàn)與代碼紛歧導(dǎo)致的情形(當(dāng)然,除非程序選擇不運(yùn)行這些測試)。

            5、如何進(jìn)行單元測試

            單元測試原本就是一項(xiàng)簡單易學(xué)的手藝;可是如果能夠遵循一些指導(dǎo)性原則(guideline)和根基規(guī)范,那么進(jìn)修將會變得加倍輕易和有用。

            首先要考慮的是在編寫這些測試用例之前,如何測試那些可疑的用例。有了這樣一個概略的想法之后,你將可以在編寫實(shí)現(xiàn)代碼的時候,或者之前,編寫測試代碼。

            下一步,你需要運(yùn)行測試用例,或者同時運(yùn)行系統(tǒng)的所有其他測試,甚至運(yùn)行整個系統(tǒng)的測試,前提是這些測試運(yùn)行起來相對斗勁快。在此,我們要確保所有的測試都能夠經(jīng)由過程,而不只是新寫的測試能夠經(jīng)由過程;這一點(diǎn)長短常主要的。也就是說,在保證不惹人直接bug 的同時,你也要保證不會給其他的測試帶來破損。

            在這個測試過程中,我們需要確認(rèn)這個測試事實(shí)是經(jīng)由過程了還是失敗了——但這并不意味著你或者其他晦氣的人需要查看每個輸出,然后才抉擇這些代碼是正確的還是錯誤的。

            在此,你慢慢地就會養(yǎng)成一個習(xí)慣:只要進(jìn)行一次單元測試查看一下測試結(jié)果,就可以馬上知道所有代碼是否都是正確的,或者哪些代碼是有問題的。關(guān)于這個問題,我們將留在討論如何使用單元測試框架時來具體討論。

          posted @ 2011-12-05 14:35 順其自然EVO 閱讀(172) | 評論 (0)編輯 收藏

          重構(gòu)——構(gòu)筑測試體系

           構(gòu)筑測試體系

            如果你想進(jìn)行重構(gòu),首要前提就是要擁有一個可靠的測試環(huán)境。

            “編寫優(yōu)良的測試程序,可以極大的提高我的編程速度,即使不進(jìn)行重構(gòu)也是如此。”

            1、自我測試代碼(Self-testing Code )的價值

            “Class 應(yīng)該包含他們自己的測試代碼。”

            “每個Class 都有一個測試函數(shù),并用它測試自己這個 Class 。”

            確保所有的測試都完全自動化,讓它們檢查自己的測試結(jié)果。

            只要寫好一點(diǎn)功能,就立即添加測試。

            一整組(a suite of )測試就是一個強(qiáng)大的“臭蟲”偵測器,能夠大大縮減查找“臭蟲”所需要的時間。

            “實(shí)際上,編寫測試代碼的最有用時機(jī)是在開始編程之前。當(dāng)你需要添加特性的時候,先寫相應(yīng)的測試代碼。聽起來離經(jīng)叛道,其實(shí)不然。填寫測試代碼其實(shí)就是問自己:添加這個功能需要做什么。編寫測試代碼還能使你把注意力集中于接口而非實(shí)現(xiàn)上頭(永遠(yuǎn)是件好事)。預(yù)先寫好的測試代碼也為你的工作按上一個明確的結(jié)束標(biāo)志:一旦測試代碼運(yùn)行正常,工作就可以結(jié)束了。”

            構(gòu)建自我測試的代碼。

            2、JUnit測試框架( Testing Framew )

            頻繁的運(yùn)行測試,每次編譯請把測試也考慮進(jìn)去,每天至少執(zhí)行每個測試一次。

            單元測試功能測試

            “每當(dāng)你接獲臭蟲提報(bào),請先撰寫一個單元測試來揭發(fā)這只臭蟲。”——如何揭發(fā)?這里需要根據(jù)報(bào)告準(zhǔn)確定位。單元測試會對此有幫助嗎?

            3、添加更多的測試

            “觀察Class 該做的所有事情,然后針對任何一項(xiàng)功能的任何一種可能失敗的情況,進(jìn)行測試。”

            “測試應(yīng)該是一種風(fēng)險驅(qū)動(risk driven )行為,測試的目的是希望找出現(xiàn)在或未來的可能出現(xiàn)的錯誤。”

            “測試的訣竅是:測試你最擔(dān)心的部分。”

            這點(diǎn)和我目前的想法不大相同。我目前的想法是,測試要對程序做100% 的保證,所以,要測試程序可能行為的每一種情況,保證其正確性。按照我的想法,值域的設(shè)置和訪問函數(shù)也是要測試的。作者的意思是,測試代碼要用最低的成本,獲取最大的收益。這一點(diǎn),要我在實(shí)際的環(huán)境中進(jìn)行抉擇。

            “編寫不是十分完美的測試并實(shí)際運(yùn)行,好過對完美測試的無盡等待。”——我持懷疑態(tài)度。

            運(yùn)用測試用例前后執(zhí)行的函數(shù):tearDown 和 setUp,保證測試用例之間相互隔離,而非相互影響。

            做一個懶惰的程序員。

            考慮可能出錯的邊界條件,把測試火力集中在那兒。

            “測試(優(yōu)先)可以調(diào)高編程速度”,這一點(diǎn)我要在實(shí)踐中驗(yàn)證一下,如果真是這樣,那我就要嘗試在我們部門推行這種方法。

            “當(dāng)測試達(dá)到一定的程度后,測試效益會呈現(xiàn)遞減態(tài)勢。”所以,你不要期望通過測試找出所有的bug ,而是要通過測試,找出絕大多數(shù)的 bug 。

            這個地方其實(shí)也符合“二八定律”:即20% 的測試可以找出 80% 的 bug,其余的 80% 的測試可以找出剩下的 20% 的 bug 。我們要做的,就是寫這 20% 的測試,而非 100% 的測試。

          posted @ 2011-12-05 14:24 順其自然EVO 閱讀(181) | 評論 (0)編輯 收藏

          VS2010中的自動化測試——Web性能測試

           一、概述

            網(wǎng)站的性能由很多不同的因素決定,比如:網(wǎng)絡(luò)速度、不同的瀏覽器或者在同一時刻的用戶數(shù)量、硬件處理能力等因素,都會影響到網(wǎng)站的性能和響應(yīng)時間。Web性能測試就是幫助開發(fā)者在開發(fā)工程中就能確認(rèn)并盡力修復(fù)這些問題。

            下面討論幾種主要的性能測試

            ● Validation and verification test: 這個測試用來幫助我們檢驗(yàn)輸入值和是否能在期望的入口安全登錄。比如:一個字段要求你輸入一個Email地址,那么你必須正確輸入才能提交頁面。

            ● Web page usability test: 它相當(dāng)于是在生產(chǎn)環(huán)境中,通過模擬用戶行為來查看網(wǎng)站內(nèi)容是否完整。比如:每個鏈接是否正確或者頁面上的信息是否顯示正確等。

            ● Security Testing: 它幫助我們檢驗(yàn)不同權(quán)限的用戶是否能得到相應(yīng)的內(nèi)容,還有對本地或者服務(wù)器上其它資源文件的訪問權(quán)限。

            ● Performance Testing: 幫助我們驗(yàn)證在特地環(huán)境下頁面響應(yīng)的時間,它包括壓力測試和負(fù)載測試。

            ● Testing web page compatibility: 這個就是驗(yàn)證網(wǎng)站在不同瀏覽器上的兼容性。

            ● Testing a web application using different networks: 這個測試取決于我們的最終用戶是處在什么樣的網(wǎng)絡(luò)環(huán)境中。

            對于Web性能測試,還有很多其它相關(guān)的測試,比如不同的操作系統(tǒng)、不同的數(shù)據(jù)庫的影響等等都與性能有一定的關(guān)系。

            上面我所說的性能測試,在VS2010中提供了相應(yīng)的工具,為我們進(jìn)行測試,下面我們就來創(chuàng)建一個簡單的Web性能測試。

            二、創(chuàng)建Web性能測試

            在我們創(chuàng)建Web性能測試之前先創(chuàng)建一個簡單的網(wǎng)站,包括一個添加用戶數(shù)據(jù)和顯示用戶數(shù)據(jù)的網(wǎng)頁,數(shù)據(jù)表設(shè)計(jì)如下:

            網(wǎng)站用戶界面如下:

            這個Web應(yīng)用程序可以部署在Web服務(wù)器上進(jìn)行測試,也可以直接在ASP.NET Development Server上進(jìn)行測試,當(dāng)然,如果在開發(fā)環(huán)境上測試,需要保持Development Server運(yùn)行著。

            現(xiàn)在開始來創(chuàng)建一個Web性能測試,可以直接點(diǎn)擊VS工具欄上Test->New Test…,然后選擇如圖所示文件:

           

          點(diǎn)擊OK后,會提示你新建一個測試工程,并給它命名,然后點(diǎn)擊Create。這時會彈出一個IE窗口如下所示:

            左側(cè)是一個Web Test Recorder(有可能在你創(chuàng)建測試文件后,彈出IE時沒有這個東西出現(xiàn),你可以通過IE的工具->管理加載項(xiàng)選項(xiàng)中將Web Test Recorder啟用),它主要用來記錄瀏覽測試網(wǎng)頁時所有的操作,它會將所有的request和response記錄下來,它還可以幫我們在不同的情況下找出我們期望的結(jié)果。

            現(xiàn)在我們輸入剛剛創(chuàng)建的那個網(wǎng)頁的地址,然后我們輸入一些信息進(jìn)行提交:

            點(diǎn)擊Insert之后,我們會看到Recorder幫我們捕捉到一些信息:



          完成所有操作后,點(diǎn)擊Recorder面板中的Stop按鈕,我們就可以自動跳轉(zhuǎn)回VS中,并顯示出之前記錄的所有請求信息。

            至此,一個簡單的Web性能測試就建好了。可以點(diǎn)擊工具欄左上角的運(yùn)行測試一下。上圖顯示的是一個Web性能測試的編輯窗口,窗口中,樹的每一個層級都有不同的屬性可以進(jìn)行設(shè)置。除此之外,編輯窗口還有一個工具欄,能為測試用例提供不同的功能以及數(shù)據(jù)源等。

            下面我來詳細(xì)說一下性能測試編輯窗口中的各個功能及操作。

            上次說到我們編輯窗口中的樹結(jié)構(gòu),每一層都會有不同的屬性設(shè)置。

            ● Root Level:可以說是一條Web性能測試的入口點(diǎn),比如:可以在此設(shè)置用戶驗(yàn)證、代理或者為這條測試添加一些描述信息等;

            ● Request Level:在Web性能測試中記錄下來的每一條單獨(dú)的請求,可以在此設(shè)置用戶思考時間(think time)、請求方式(GET或者POST)或者設(shè)置是否緩存等;

            ● Request Parameter Level: 這里是每次請求的參數(shù)設(shè)置,可以在此設(shè)置是否進(jìn)行Url編碼、值還有名稱。

            這里所有的屬性設(shè)置你都可以在屬性視窗中看到說明,如果還有不懂的,可以查看MSDN進(jìn)行幫助,所有的屬性都在Microsoft.VisualStudio.TestTools.WebTesting這個命名空間下。

            三、提取規(guī)則(Extraction Rules)

            在VS中我們可以用提取規(guī)則的功能把網(wǎng)站中的一些有用的數(shù)據(jù)提取出來。

            通常情況下,幾乎所有的網(wǎng)站,它們頁面之間總會有一些依賴關(guān)系,比如說你的下一個請求依賴你上一次請求響應(yīng)中得到的一些數(shù)據(jù)。所以提取規(guī)則這個功能就是可以讓你從響應(yīng)的數(shù)據(jù)中提取到你需要的數(shù)據(jù),并保存下來,用于你下一次的請求或者你之后需要的時候。它保存下來的數(shù)據(jù)在一個上下文參數(shù)中,你可以在全局環(huán)境中使用它。

            在VS2010中已經(jīng)為我們內(nèi)建了幾種提取規(guī)則,如圖:

            關(guān)于內(nèi)建提取規(guī)則說明,可參見這里。如果內(nèi)建的這些提取規(guī)則還不能滿足你的需要,也可以自定義自己的提取規(guī)則。



           這里我借百度(偷個懶^_^)做個Demo,看下怎么使用提取規(guī)則。

            根據(jù)上篇內(nèi)容,首先利用Recorder來打開百度,然后隨便搜索一個東西(我百度的James),最后點(diǎn)擊Stop,會在VS中生成如下數(shù)據(jù):

            現(xiàn)在我們在第一請求節(jié)點(diǎn)上右鍵添加一個提取規(guī)則,因?yàn)槲沂且崛〉谝淮握埱箜憫?yīng)回來的中的值,如下所示:

            提取規(guī)則設(shè)置如下:



           通過上面的設(shè)置,我將百度頁面中,搜索按鈕的值(“百度一下”)進(jìn)行了提取,那么baidu這個參數(shù)在之后的程序中將一直保存著這個值。它的訪問方式類似于key-value這樣的形式。我們運(yùn)行一下這個測試,就可以在結(jié)果中看到我們提取的信息了。

            我們可以將保存出來的信息用于下一次請求或者之后的任何一次請求中,比如我們可以修改第二個請求中需要搜索的值:

            通過右鍵屬性,然后在值屬性中,將它重新綁定到baidu屬性,我們還需要注意一下的是我們之前提取的值是中文,所以需要將Url編碼設(shè)置為ture。最后我們重新運(yùn)行一下測試看下結(jié)果:

            這里可以看到我們的第二次搜索不在是James,而是“百度一下”了。

            四、驗(yàn)證規(guī)則(Validation Rules)

            很多網(wǎng)站都有一些驗(yàn)證程序來驗(yàn)證輸入或者輸出是否正確,比如:用戶名不能含有特殊的字符、密碼不得少于6個字符或者正確的Email格式等等。

            驗(yàn)證規(guī)則這個功能就是驗(yàn)證響應(yīng)的數(shù)據(jù)是否包含期望的信息,如果有,這條請求就可以pass,否則就會fail。

            我的VS2010也內(nèi)建了幾種驗(yàn)證規(guī)則:

            關(guān)于內(nèi)建的驗(yàn)證規(guī)則說明,可參見這里。如果內(nèi)建的這些驗(yàn)證規(guī)則還不能滿足你的需要,也可以自定義自己的驗(yàn)證規(guī)則。

            驗(yàn)證規(guī)則的使用方法其實(shí)和提取規(guī)則差不多,但是它只是起驗(yàn)證的作用,而不會幫你保存數(shù)據(jù)。但是要注意的一點(diǎn)是,隨著驗(yàn)證規(guī)則的增多,網(wǎng)站的性能測試和測試時間都將受到影響,尤其是在做壓力測試的時候,更要決定好哪些數(shù)據(jù)非常重要的、需要驗(yàn)證的。當(dāng)然,VS中也提供設(shè)置驗(yàn)證規(guī)則的級別來降低這些影響。

          posted @ 2011-12-05 14:17 順其自然EVO 閱讀(1855) | 評論 (0)編輯 收藏

          正視測試正視第三方測試機(jī)構(gòu)

           如何面對軟件產(chǎn)品大型化、復(fù)雜化、系統(tǒng)化帶來的挑戰(zhàn),抓住云計(jì)算帶來的發(fā)展新機(jī)遇,解決軟件測試理論、工具與應(yīng)用不相適應(yīng)的矛盾?如何推動軟件質(zhì)量保證體系向縱深發(fā)展,結(jié)合超大規(guī)模復(fù)雜系統(tǒng)對可靠性的要求,將軟件質(zhì)量管理與開發(fā)過程緊密結(jié)合,幫助企業(yè)實(shí)現(xiàn)軟件質(zhì)量水平的持續(xù)提升?如何破解軟件知識產(chǎn)權(quán)遭受侵犯的難題,將中國軟件知識產(chǎn)權(quán)的保護(hù)與軟件著作權(quán)的申請、使用、管理相結(jié)合,建立促進(jìn)軟件正版化與產(chǎn)業(yè)技術(shù)創(chuàng)新的長效機(jī)制?如何培養(yǎng)高端、復(fù)合型軟件人才,突破軟件產(chǎn)業(yè)遭遇的人才瓶頸,建立符合軟件人才市場需要的培訓(xùn)體系,滿足企業(yè)對專業(yè)領(lǐng)域軟件人才的需求?如何應(yīng)對貨幣政策逐漸收緊的趨勢,開拓融資渠道,創(chuàng)新為軟件園區(qū)和企業(yè)提供個性化的投融資服務(wù)?

            面對軟件產(chǎn)業(yè)技術(shù)變革,創(chuàng)新商業(yè)模式成為應(yīng)對變革的重要手段,本屆年會以“前瞻科技創(chuàng)新 重構(gòu)商業(yè)未來”為主題,成功舉辦了主論壇與軟件知識產(chǎn)權(quán)、軟件人才培養(yǎng)、軟件投融資、軟件測評技術(shù)和軟件質(zhì)量保證五個分論壇。來自工信部的領(lǐng)導(dǎo)、兩院院士及典型企業(yè)總裁等與業(yè)界一起分享“軟件產(chǎn)業(yè)商業(yè)模式面向服務(wù)的創(chuàng)新與變革”,促進(jìn)新模式下認(rèn)證測試、產(chǎn)品質(zhì)量、知識產(chǎn)權(quán)、人才培養(yǎng)、投融資體系等軟件產(chǎn)業(yè)生態(tài)重構(gòu),促使軟件產(chǎn)業(yè)步入融合、轉(zhuǎn)型和調(diào)整的新階段,助推中國新一輪軟件產(chǎn)業(yè)發(fā)展浪潮。大會期間,記者就中國軟件評測中心周潤松先生進(jìn)行了采訪。

            Q:在軟件公司,開發(fā)人員和測試人員是否有一個合適的比例?比如在一家偏向研發(fā)的公司,研發(fā)人員相對占多數(shù)。而在一家做測試的公司,相對測試人員占多數(shù),是否有這樣的比例問題呢?

            A:與我國的國情有關(guān)。更與軟件測試的受重視輕度有關(guān)。在國內(nèi),軟件測試逐漸被重視。包括軟件產(chǎn)品有登記測試,可以證明企業(yè)有能力生產(chǎn)這個軟件,而這個測試只是政府的行為,作為簡單的抽測。從軟件工程師角度來說,從 2004年開始有測評師這樣一個增項(xiàng)。很多研發(fā)型企業(yè)并沒有專門的測試人員,軟件的測試工作就由研發(fā)者自己來完成。有的企業(yè)也可能做交叉型的測試,比如兩個工程師互測,但這樣的情況并沒有很好的開展。自己研發(fā)自己測試有個弊端,開發(fā)者會有固定的思維定式,很難解決軟件自身的問題。企業(yè)保證研發(fā)就已經(jīng)是很吃力的事情就不可能投一筆資金來維護(hù)一堆測試人員。相對國內(nèi),測試人員相對匱乏,我們也可以在一些報(bào)道上看到極度缺乏測試人員這樣的廣告。我們?nèi)鄙俚牟皇堑投说臏y試人員我們?nèi)鄙俚氖菍y試有較高領(lǐng)悟的高端測試人才。

            Q:幫助理解“測試人員的成功不在于找出多少個Bug,而是說服開發(fā)人員修復(fù)多少個Bug”這句話。

            A:測試工程師的使命是發(fā)現(xiàn)程序中的缺陷,但在企業(yè)固有投入的狀況下不可能完全修復(fù)所有的缺陷。企業(yè)也好,開發(fā)人員也好都有自己的權(quán)衡。往往在測試的時候有個過程,從理解軟件開始到實(shí)施測試。測試之后才會發(fā)現(xiàn)軟件的缺陷,此時我們才會和開發(fā)人員進(jìn)行核對,如果不是對軟件對業(yè)務(wù)流程理解問題那么此時才會進(jìn)一步考慮,在現(xiàn)有投入狀態(tài)下,這個版本是否需要修復(fù)這個缺陷或者直接將這個功能刪掉,或者下個版本時將此功能修復(fù)好。軟件的缺陷可分為三級,重要級別,一般級別以及建議級別。遇到嚴(yán)重級別的bug,必須要進(jìn)行修復(fù),否則將會導(dǎo)致軟件崩潰。一般級別的bug,并不會影響系統(tǒng)的正常運(yùn)行,依據(jù)情況進(jìn)行修復(fù)。而建議性問題則在易用性以及美觀度提出一些建議。通常情況下,測試并不是保證軟件沒有任何問題,而是更多的去發(fā)現(xiàn)問題,叫軟件更健壯叫用戶使用起來更放心。

            Q:在您的工作中是否遇到過這樣的情況,肩負(fù)開發(fā)和測試雙重工作的人員,是否會比較煩感測試,他們寧可去寫代碼也不喜歡進(jìn)行測試?

            A:你提出這樣的質(zhì)疑可能是你會關(guān)注開發(fā)人員和測試人員薪酬的問題。在我國,開發(fā)人員的薪酬要遠(yuǎn)遠(yuǎn)高于測試人員,而在國外卻恰恰相反。如果你是一名合格的測試工程師,你所處的位置應(yīng)該是在開發(fā)人員之上的,并不是一個不懂開發(fā)的人。相對開發(fā)人員,測試人員的開發(fā)功底相對較低,在一些小企業(yè)中,他們的測試只是簡單的功能驗(yàn)證,只是將正向的合理的流程順利走完,他們并沒有針對異常輸入以及惡意行為進(jìn)行測試。

            Q:我們的測試是否和“跑分”的測試一樣呢?

            A:非也。你所說的跑分測試,其實(shí)是個基準(zhǔn)測試,定義一個評分體系,而我們拿到產(chǎn)品便會對其原始需求進(jìn)行分析,承諾的需求是什么樣子,然后根據(jù)需求詳細(xì)到測試點(diǎn),再對其設(shè)計(jì)測試方法進(jìn)行測試,如果滿足我們的要求說明該測試點(diǎn)沒有問題,如果沒有通過則是一個缺陷。最終出一份報(bào)告,報(bào)告的內(nèi)容是告訴系統(tǒng)目前有哪些地方?jīng)]有達(dá)到標(biāo)準(zhǔn),為何沒有達(dá)到標(biāo)準(zhǔn)。

            Q: 目前我國有很多相關(guān)培訓(xùn),如果說學(xué)員學(xué)滿而歸,所在企業(yè)購買一套測試系統(tǒng),如果是這樣,我們這樣的第三方測試機(jī)構(gòu)豈不是沒有什么作用了?

            A: 這樣的情況也有,不過有句話說的比較貼切,叫“王婆賣瓜”。有些時候測試的能力與我們相當(dāng),并能出一份類似的評測結(jié)果。而我們目前的角色是充當(dāng)一個第三方的角色,我們更多的是去驗(yàn)證你的話是否如你所說。我們培訓(xùn)的學(xué)員雖然是參加了培訓(xùn),但能否建立一個有效的測試體系和測試團(tuán)隊(duì)我們不敢打這樣的保票。如果產(chǎn)品我們來測試可能我們出的測試報(bào)告有100頁,而他們自己可能只有十幾頁,這充分說明了測試的細(xì)膩度不同。

            采訪對象周潤松簡介:

            碩士,高級專業(yè)職稱,核高基實(shí)施部、高級測試工程師。 2004 年 5 月加入中國軟件評測中心至今,多次主持國家大型政府網(wǎng)站及辦公應(yīng)用系統(tǒng)的性能測試與調(diào)優(yōu)工作,同時參與電子發(fā)展基金 IPv6 測試平臺研究工作。在 J2EE 應(yīng)用系統(tǒng)測試領(lǐng)域,多次作為項(xiàng)目負(fù)責(zé)人領(lǐng)導(dǎo)組織大型應(yīng)用系統(tǒng)的性能測試與調(diào)優(yōu)工作,具備相當(dāng)豐富的大型應(yīng)用系統(tǒng)現(xiàn)場性能測試及調(diào)優(yōu)工作經(jīng)驗(yàn)。先后參與了中石化人力資源管理系統(tǒng)、國家開發(fā)銀行辦公應(yīng)用系統(tǒng)、北京市公安局 110 接處警系統(tǒng)、中國移動 12580 信息查詢系統(tǒng)等性能測試工作。 2007 年底至 2008 年 6 月份,領(lǐng)導(dǎo)完成了第 29 屆奧運(yùn)會票務(wù)系統(tǒng)的功能以及性能測試工作,通過測試優(yōu)化,有利的保證了票務(wù)系統(tǒng)的第三次實(shí)時售票工作,系統(tǒng)承受了頁面峰值流量 2900 多萬 / 小時。同時在城市智能交通領(lǐng)域,配合北京市交管局完成了美國 NTCIP 城市智能交通系統(tǒng)開放式通訊協(xié)議的引進(jìn)工作,多次配合北京市交管局進(jìn)行城市智能交通信號控制器的 NTCIP 通訊協(xié)議選型測試工作,發(fā)表期刊論文一篇,并成功組織了一次國內(nèi)城市智能交通通訊協(xié)議研討會,極大的推動了 NTCIP 協(xié)議在國內(nèi)的推廣。

          posted @ 2011-12-05 14:01 順其自然EVO 閱讀(153) | 評論 (0)編輯 收藏

          需求變更的煩惱

          客戶今天要求變更需求,加某某功能,“這個應(yīng)該不難吧,某某公司的產(chǎn)品都有這個功能的。”客戶的需求一直在變,煩惱。。。

            開始是需求不明確,客戶都不知道要做成什么樣,只有一個大概的粗略的描述。等到大樓蓋好了,給客戶,卻發(fā)現(xiàn)大樓應(yīng)該是這樣那樣的......客戶方和開發(fā)方在一起( WorkShop) 還好,如果分開在兩地就更糟糕......

            永遠(yuǎn)不變的就是變化,這個大家都知道,但關(guān)鍵是如何合理的控制需求變更

            我以前做的上百人一年多一個的大項(xiàng)目,完全按照CMMI Level3規(guī)范來控制需求變更的。起初有雙方簽字的經(jīng)過評審的需求基線,以后需求變更的時候有需求變更委員會(CCB)或?qū)iT負(fù)責(zé)的角色(通常由客戶方需求人員來收集和評估最初需求并提交給QA,QA牽頭需求變更流程)來處理需求變更,具體做法是:

            1、先是客戶或項(xiàng)目組成員提出的需求申請,填寫《變更申請單》并提交給項(xiàng)目經(jīng)理。

            2、項(xiàng)目經(jīng)理組織項(xiàng)目相關(guān)人員對需求變更進(jìn)行評估和調(diào)研,然后組織需求變更評審。

            3、如果同意變更則由CCB授權(quán)配置管理員檢出配置項(xiàng)由項(xiàng)目組成員對相關(guān)的文檔(用戶需求說明書、需求規(guī)格說明書)進(jìn)行修改,修改后評審(同時 填寫《變更管理記錄表》)通過后由高層經(jīng)理審批,然后提交用戶確認(rèn),最后納入配置庫,更新《需求追蹤矩陣》,確保需求和工作產(chǎn)品的一致性;

            4、如果不同意變更,則項(xiàng)目經(jīng)理、部門經(jīng)理與客戶共同協(xié)商,協(xié)商后同意變更,則對相關(guān)的文檔進(jìn)行修改。協(xié)商后依然不統(tǒng)一,則需求變更結(jié)束。

            5、所有的需求變更都需要總經(jīng)理理進(jìn)行審批。需求變更的影響:利用《需求跟蹤矩陣》對變更影響進(jìn)行評估;估計(jì)對項(xiàng)目參數(shù)的影響—規(guī)模、工作量、進(jìn)度影響;超出閥值(整個項(xiàng)目進(jìn)度的10%- 15%,里程碑30%)的,應(yīng)提交高層評審/批準(zhǔn)。

            6、妥善保存變更產(chǎn)生的相關(guān)文檔。

            現(xiàn)在公司做的項(xiàng)目規(guī)范較小,完全按照CMMI的規(guī)范來有點(diǎn)多余,所以我們基本上類似于敏捷開發(fā)的模式。敏捷編程是擁抱變化,持續(xù)重構(gòu)和改進(jìn),迭代開發(fā),頻繁交付。在需求變更管理上我們還沒有一套完整的合適的流程,具體做法是:

            1、客戶提出新需求;

            2、開發(fā)人員或項(xiàng)目經(jīng)理評估后答應(yīng)了;

            3、繼續(xù)開發(fā),時間表按照重新評估后的進(jìn)行;

            4、基本上很少拒絕客戶;一方面是為了維護(hù)客戶關(guān)系,另一方面對自己team的開發(fā)能力很自信; 結(jié)果是上頭答應(yīng)了客戶,下頭的只能加班加點(diǎn)趕工。

            另外還有一些控制需求的做法:

            1、項(xiàng)目前期會首先快速開發(fā)一個產(chǎn)品原型(Prototype)給客戶,有界面的先用visio畫個界面,以驗(yàn)證業(yè)務(wù)規(guī)則、業(yè)務(wù)流程和大概GUI等。另外,產(chǎn)品原型也有助于進(jìn)一步挖掘用戶的需求。

            2、會粗略的列出大體的需求并簽字

            3、頻繁交付給客戶,短周期的交付可工作的產(chǎn)品,以印證需求與實(shí)現(xiàn)是否一致,同時兼做客戶教育工作。

            問題是如果需求變更無休止,則需求變更幾乎就不可控,項(xiàng)目開發(fā)也無休止。所以我覺得我們公司在需求管理上還缺乏:

            1、需求基線管理,經(jīng)過評審的雙方確認(rèn)簽字的需求基線。以后如果要超出或修改需求基線,則必須有專門的人員對此提出異議,由CCB審核后方可修改;

            2、專門的需求控制負(fù)責(zé)人。現(xiàn)在基本上是技術(shù)人員或是項(xiàng)目經(jīng)理收到客戶需求變更,然后自己評估下就答應(yīng)了。缺乏專門的需求控制負(fù)責(zé)人,因而沒有需求評審,沒有一套專門的嚴(yán)格可控的需求變更流程。

            3、需求功能點(diǎn)列表的書面確認(rèn)。現(xiàn)在簽的只是非常粗略的大體需求,定性而沒有定量,以后扯皮發(fā)生的可能性非常大;

            4、適當(dāng)時候應(yīng)該拒絕客戶的要求。雖然用戶有眾多的理由,比如他認(rèn)為改動不大,競爭對手已經(jīng)擁有該功能,或是新的業(yè)務(wù)需要,但如果評估后的結(jié)果是沒有必要,或不合理,或優(yōu)先級不高,或風(fēng)險大于必要,則堅(jiān)定的拒絕。另外一種變通的方法是,根據(jù)優(yōu)先級重要性有條件的答應(yīng),比如放在下一次版本之后。

            5、需求Scope的管理,不僅要明確做什么,而且要明確不做什么。什么是我們負(fù)責(zé)的,什么不是我們應(yīng)該負(fù)責(zé)和提供的。

            另外在需求變更管理中,和客戶有效的溝通、協(xié)調(diào)和教育非常重要。說的好點(diǎn),就是“要講究溝通的藝術(shù)”,“多引導(dǎo)客戶”;說得俗點(diǎn),就是“擺平客戶”。如果能夠?qū)蛻暨M(jìn)行很好的客戶教育,很多時候客戶是可以理解開發(fā)過程中的困難,從而達(dá)到妥協(xié)或折中。比如客戶理解了項(xiàng)目后期進(jìn)度緊張,技術(shù)架構(gòu)難以大改,就會在資源、進(jìn)度、功能上做一些折中的選擇,比如把功能分主要功能先實(shí)現(xiàn),次要功能后實(shí)現(xiàn);核心業(yè)務(wù)保穩(wěn)定,次要業(yè)務(wù)不能犧牲核心業(yè)務(wù)的穩(wěn)定性等等。反之,如果沒有和客戶有效的溝通、協(xié)調(diào)和教育,則會雙方各執(zhí)一詞,搞業(yè)務(wù)的只講業(yè)務(wù)、流程和功能,不考慮技術(shù)可行性,不考慮資源和時間表;搞技術(shù)的只講技術(shù),沒有傾聽客戶的正當(dāng)?shù)纳虡I(yè)需求,不能滿足客戶利益的最大化,這樣雙方就很難達(dá)成雙贏的結(jié)果。所以,有效的溝通是軟件項(xiàng)目成功的關(guān)鍵。

          posted @ 2011-12-05 13:57 順其自然EVO 閱讀(176) | 評論 (0)編輯 收藏

          項(xiàng)目質(zhì)量測試方面的心得

          軟件質(zhì)量是實(shí)現(xiàn)客戶滿意度的關(guān)鍵,而質(zhì)量管理主要靠測試。我在這方面的心得體會是:

            第一是建立一套高效完善的測試體系至關(guān)重要;

            第二是選擇一套適當(dāng)?shù)臏y試工具來輔助整個測試體系的運(yùn)作很有必要;

            第三是在選擇測試工具后關(guān)鍵是靈活應(yīng)用工具并不斷改進(jìn)流程以適合自身團(tuán)隊(duì)的實(shí)際情況。

            不能孤立地看待測試體系建設(shè)問題,必須將測試體系和測試工具有機(jī)地結(jié)合起來看。測試體系反映了對測試工作的基本認(rèn)識和基本需求,但如何使它具備足夠的可操作性而不是流于形式呢?我的看法是通過與工具的結(jié)合可以有效解決這一問題。

            這就引出第二個觀點(diǎn):選擇一套適當(dāng)?shù)臏y試工具來輔助整個測試體系的運(yùn)作很有必要。我們現(xiàn)在用了兩類測試工具:測試管理工具和自動化測試工具。測試管理工具能夠使我們的測試流程變得行之有效。我們現(xiàn)在這個項(xiàng)目中有近130人,包括一支超過20人的測試隊(duì)伍,測試管理工具在其中發(fā)揮了很好的作用。自動化測試工具也是一個很好的主意,它能夠比較有效減輕勞動強(qiáng)度,節(jié)省一定的手工時間。我們目前所設(shè)計(jì)的測試案例數(shù)已接近1萬個,完全依靠手工是不可想象的。那么,如何選擇適合我們需要的測試工具呢?我們的標(biāo)準(zhǔn)主要有兩個:一是各類不同用途的測試工具能夠有機(jī)地結(jié)合在一起,形成一個整體;二是界面要足夠人性化,能夠盡可能多地滿足人的需要。

            最后,是在選擇測試工具后關(guān)鍵是靈活應(yīng)用工具并不斷改進(jìn)流程以適合自身團(tuán)隊(duì)的實(shí)際情況。可以尋求適當(dāng)?shù)臏y試咨詢專家來就上述兩方面提供測試咨詢服務(wù)。上次我們在這方面請了兩名專家,效果非常好。我們自己的測試隊(duì)伍被培養(yǎng)出來,整個測試體系正在逐步有效地運(yùn)作,各種測試工具逐步在有效運(yùn)用,自動化測試程度也在不斷提高,而這一切都發(fā)生在專家加入后的三個月時間內(nèi)。

            總之,軟件質(zhì)量體系是人、流程、工具的有機(jī)結(jié)合。流程和制度制訂的好,不如執(zhí)行的好。

          posted @ 2011-12-05 13:50 順其自然EVO 閱讀(179) | 評論 (0)編輯 收藏

          Java代碼規(guī)范那些事

          Java開發(fā)中所要遵守的編碼規(guī)范大體上有如下7點(diǎn)。命名規(guī)范、注釋規(guī)范、縮進(jìn)排版規(guī)范、文件名規(guī)范、聲明規(guī)范、語句規(guī)范以及編程規(guī)范。

            1、命名規(guī)范

            (1)所有的標(biāo)示符都只能用ASCⅡ字母(A-Z或a-z)、數(shù)字(0-9)和下劃線“_”。

            (2)一個唯一包名的前綴總是全部小寫的字母。例如:www.tonysun.cc

            (3)類名是一個名詞,采用大小寫混合的方式,每個單詞的首字母大寫。例如:Tony。

            (4)接口的大小寫規(guī)則與類名相似:例如:Tony。

            (5)方法名是一個動詞或動詞詞組,采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。例如:setNeekeName(String neekeName)。

            (6)變量名第一個字母小寫,任何中間單詞的首字母大寫。變量名應(yīng)簡短且可以顧名思義,易于記憶。例如:neekeName、neekeAddress。避免單個字符的變量名,除非是一次性的臨時變量。

            (7)常量的聲明應(yīng)該全部大寫,每個單詞之間用“_”連接。例如:final String WWW_TONY_CN = “www.tonysun.cc”;

            2、注釋規(guī)范

            (1)注釋盡可能使用“//”;對于所有的javadoc的注釋則使用“/** */”;而臨時對代碼塊進(jìn)行注釋盡量使用“/* */”。

            (2)所有的源文件都應(yīng)該在開頭有一個注釋,其中列出文件名、日期和類的功能概述。

            (3)每個方法必須添加文檔注釋(類的main()方法除外)。

            (4)每個屬性必須添加注釋。

            (5)代碼中至少包含15%的注釋。

            (6)注釋使用中文。

            3、縮進(jìn)排版規(guī)范

            (1)避免一行的長度超過60個字符。

            (2)使用Eclipse的源代碼的格式化功能完成代碼的縮進(jìn)排版(Ctrl+Shift+F)。

            4、文件名規(guī)范

            (1)一個Java源文件只能存儲一個Java類。

            (2)文件名與Java類名相同。

            (3)一個類文件的代碼行不超過200行。

          posted @ 2011-12-05 13:47 順其自然EVO 閱讀(126) | 評論 (0)編輯 收藏

          保護(hù)你的Web服務(wù)器 iptables防火墻腳本全解讀

          本文假設(shè)你已經(jīng)對iptables有基本的了解,否則請先閱讀iptables入門。

            在我們的Web服務(wù)器上,系統(tǒng)的默認(rèn)策略是INPUT為DROP,OUTPUT;FORWARD鏈為ACCEPT,DROP則設(shè)置得比較寬松,因?yàn)槲覀冎莱鋈サ臄?shù)據(jù)包比較安全。

            準(zhǔn)備工作

            為了驗(yàn)證腳本的通用性,我特地查看了服務(wù)器的內(nèi)核及iptables版本:

          # uname -a
          Linux ud50041 2.6.9-34.ELsmp #1 SMP Fri Feb 24 16:54:53 EST 2006 i686 i686 i386 GNU/Linux
          # iptables -V
          iptables v1.2.11
          # lsb_release -a
          LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
          Distributor ID: RedHatEnterpriseAS
          Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
          Release: 4
          Codename: NahantUpdate3

            大家可以發(fā)現(xiàn),這臺服務(wù)器的系統(tǒng)、內(nèi)核和iptables版本是比較老的。本文中介紹的腳本涉及到recent安全模塊,這對系統(tǒng)內(nèi)核有要求(recent模塊在主機(jī)防護(hù)腳本中也經(jīng)常用到)。因此,如果大家要采用iptables作為主機(jī)防火墻時,建議用CentOS 5.6 x86_64或更高級版本,不然系統(tǒng)會有如下提示錯誤信息:

          iptables: Unknown error 18446744073709551615
          iptables:Invalid argument

            在tail -f /var/log/messages時會有如下出錯提示:

          ip_tables: connlimit match: invalid size 32 != 16
          ip_tables: connlimit match: invalid size 32 != 24

            另外,在生產(chǎn)環(huán)境下進(jìn)行iptables腳本的調(diào)試之前,強(qiáng)烈建議編寫crontab任務(wù),每5分鐘關(guān)閉一次iptables腳本,防止操作失誤而將自己的SSH客戶端鎖在外面:

          */5 * * * * root /etc/init.d/iptables stop

            準(zhǔn)備工作就是這些,下面是iptables腳本內(nèi)容。

            腳本內(nèi)容

          #!/bin/bash
          iptables -F
          iptables -F -t nat
          iptables -X

          iptables -P INPUT DROP
          iptables -P OUTPUT ACCEPT
          iptables -P FORWARD ACCEPT

          #load connection-tracking modules
          modprobe iptable_nat
          modprobe ip_conntrack_ftp
          modprobe ip_nat_ftp

          iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
          iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT
          iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT

          iptables -A INPUT -s 122.70.x.x -j ACCEPT
          iptables -A INPUT -i lo -j ACCEPT
          iptables -A OUTPUT -o lo -j ACCEPT
          iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
          iptables -A INPUT -p tcp -m multiport --dport 80,22 -j ACCEPT

            保存腳本文件后用

          # sh iptables.sh

            執(zhí)行腳本。運(yùn)行腳本之后最好檢查一下:

          # iptables -nv -L

            腳本說明

            由于此Web服務(wù)器是置于負(fù)載均衡器后面,所以我們要允許數(shù)據(jù)源地址為負(fù)載均衡器的數(shù)據(jù)包通過:

          iptables -A INPUT -s 122.70.x.x -j ACCEPT

            如果配置了Nagios等監(jiān)控系統(tǒng)的話在這里也要加上,如果監(jiān)控和LB都沒做的話,這行可以不用。

            另外,我的許多基于LNMP的小網(wǎng)站上面也部署了此腳本,由于Web服務(wù)和MySQL數(shù)據(jù)庫同時安裝在一臺機(jī)器上,所以沒有開放3306端口。

            在本腳本中,我們配置了一些安全措施,以防止外部的ping和SYN洪水攻擊,并且考慮到外部的瘋狂端口掃描軟件可能會影響服務(wù)器的入口帶寬,所以在這里也做了限制:

          iptables -A INPUT -p tcp --syn -m limit --limit 100/s --limit-burst 100 -j  ACCEPT

            上面的命令每秒鐘最多允許100個新連接。請注意這里的新連接指的是state為New的數(shù)據(jù)包,在后面我們也配置了允許狀態(tài)為ESTABLISHED和RELATED的數(shù)據(jù)通過;另外,100這個閥值則要根據(jù)服務(wù)器的實(shí)際情況來調(diào)整,如果是并發(fā)量不大的服務(wù)器這個數(shù)值就要調(diào)小,如果是訪問量非常大且并發(fā)數(shù)不小的服務(wù)器,這個值則還需要調(diào)大。

          iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s –limit-burst 10 -j ACCEPT

            這是為了防止ping洪水攻擊,限制每秒的ping包不超過10個。

          iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT

            上面的命令防止各種端口掃描,將SYN及ACK SYN限制為每秒鐘不超過200個,免得把數(shù)務(wù)器帶寬耗盡了。

            后續(xù)加固工作

            iptables防火墻運(yùn)行后,運(yùn)行nmap工具進(jìn)行掃描:

          # nmap -P0 -sS 211.143.6.x
          Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-03-29 16:21 CST
          Interesting ports on 211.143.6.X:
          Not shown: 1668 closed ports
          PORT     STATE SERVICE
          22/tcp   open   ssh
          25/tcp   open   smtp
          80/tcp   open   http
          110/tcp   open   pop3
          111/tcp   open   rpcbind
          143/tcp   open   imap
          443/tcp   open   https
          465/tcp   open   smtps
          587/tcp   open   submission
          993/tcp   open   imaps
          995/tcp   open   pop3s
          1014/tcp  open   unknown

            在這里,我們發(fā)現(xiàn)一個1014端被某個進(jìn)程打開了,用lsof -i:1014查看發(fā)現(xiàn)是rpc.statd打開的,這服務(wù)每次用的端口都不一樣啊!本來想置之不理的,但是如果rpc.statd不能正確處理SIGPID信號,遠(yuǎn)程攻擊者可利用這個漏洞關(guān)閉進(jìn)程,進(jìn)行拒絕服務(wù)攻擊,所以還是得想辦法解決掉。我們發(fā)現(xiàn)rpc.statd是由服務(wù)nfslock開啟的,進(jìn)一步查詢得知它是一個可選的進(jìn)程,它允許NFS客戶端在服務(wù)器上對文件加鎖。這個進(jìn)程對應(yīng)于nfslock服務(wù),于是我們關(guān)掉了此服務(wù):

          service nfslock stop
          chkconfig nfslock off

            最后想說的是,如果沒有硬件防火墻保護(hù)的話,請盡量在每一臺有公網(wǎng)IP的機(jī)器上部署iptables防火墻吧!


          posted @ 2011-12-05 13:41 順其自然EVO 閱讀(213) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共394頁: First 上一頁 352 353 354 355 356 357 358 359 360 下一頁 Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 旬阳县| 常山县| 太康县| 普安县| 镇雄县| 鸡东县| 丁青县| 眉山市| 怀安县| 兴业县| 湾仔区| 调兵山市| 乐陵市| 聂荣县| 绥中县| 沁水县| 沂水县| 赫章县| 禄丰县| 西林县| 舞阳县| 清远市| 宣恩县| 盐边县| 漳浦县| 和林格尔县| 新平| 康马县| 丰镇市| 岚皋县| 临安市| 甘洛县| 吉安县| 凤庆县| SHOW| 柘荣县| 九龙坡区| 黄骅市| 崇明县| 临邑县| 兴业县|