<ruby id="h6500"><table id="h6500"></table></ruby>
    1. <ruby id="h6500"><video id="h6500"></video></ruby>
          1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>

            谷歌(google)是如何做軟件測試的

            發(fā)表于:2012-03-12來(lái)源:譯言網(wǎng)作者:xinxinworm點(diǎn)擊數: 標簽:軟件測試;谷歌
            我聽(tīng)到的最多的一個(gè)問(wèn)題是“Google如何做測試?”這個(gè)問(wèn)題已經(jīng)在本博客上零零散散的回答過(guò),但這次的回答將會(huì )做一個(gè)完整的更新。Google的測試策略從來(lái)沒(méi)有變過(guò),我們執行測試的策略隨著(zhù)公司的演化而演化。我們現在是一個(gè)集搜索、應用、廣告、移動(dòng)、操作系統等

              這是這個(gè)主題系列的第一篇文章。

              我聽(tīng)到的最多的一個(gè)問(wèn)題是“Google如何做測試?”這個(gè)問(wèn)題已經(jīng)在本博客上零零散散的回答過(guò),但這次的回答將會(huì )做一個(gè)完整的更新。Google的測試策略從來(lái)沒(méi)有變過(guò),我們執行測試的策略隨著(zhù)公司的演化而演化。我們現在是一個(gè)集搜索、應用、廣告、移動(dòng)、操作系統等業(yè)務(wù)于一體的公司。每一個(gè)我們關(guān)注的領(lǐng)域都是在該領(lǐng)域有意義的問(wèn)題。隨著(zhù)我們不斷的增加新的“關(guān)注領(lǐng)域”(Focus Areas),延伸已經(jīng)存在的領(lǐng)域,我們的測試也在不斷的擴展和改善。而我們當下在做的以及我們預計未來(lái)將會(huì )發(fā)展的方向,就是我將要在這系列文章中將要闡述的問(wèn)題。

              讓我們先從組織結構的介紹開(kāi)始,這個(gè)或許會(huì )讓你感到驚奇。在Google并不存在一個(gè)真正意義上的測試部門(mén)。測試實(shí)際存在于一個(gè)關(guān)注領(lǐng)域,我們稱(chēng)它為“生產(chǎn)率工程”(EngineeringProductivity)。“生產(chǎn)率工程”是一個(gè)擁有一定數量的橫向和縱向的工程學(xué)科,測試是最大的一個(gè)。而在這個(gè)組織中,“生產(chǎn)率工程”是由以下三部分組成:

              1. 產(chǎn)品團隊(productteam)。他們設計的內部的和開(kāi)源的工具由公司里的所有工程師完成。他們負責構建和維護代碼分析器、開(kāi)發(fā)環(huán)境、測試用例管理系統、自動(dòng)化測試工具、構建系統、源代碼控制系統、代碼回顧計劃、缺陷數據庫。他們的目標就是設計一種能讓工程師更有效率的工具。工具是在檢測預防的戰略目標中占非常大的一部分。

              2. 服務(wù)團隊(servicesteam)。他們在一個(gè)非常寬泛的領(lǐng)域內向產(chǎn)品團隊提供諸如包含工具(includingtools)、文檔、測試、發(fā)布管理、培訓等方面的專(zhuān)業(yè)技能。他們的專(zhuān)業(yè)技能涵蓋可靠性、安全性、國際化等方面,也會(huì )處理產(chǎn)品團隊可能遇到的關(guān)于功能細節方面的問(wèn)題。任何一個(gè)其他“關(guān)注領(lǐng)域”的服務(wù)團隊也可以為產(chǎn)品團隊提供專(zhuān)業(yè)技能服務(wù)。

              3. 嵌入式工程師(embeddedengineer)。他們有效的擔負起了Google產(chǎn)品團隊在有需要時(shí)的需求。有些工程師會(huì )跟著(zhù)同一個(gè)的產(chǎn)品團隊數年,另一些則只會(huì )在一個(gè)較短的周期內為產(chǎn)品團隊的需要提供服務(wù)。Google鼓勵所有的工程師經(jīng)常更換自己服務(wù)的產(chǎn)品團隊,以保持飽滿(mǎn)的精神狀態(tài),并保證有效和客觀(guān)的工作。測試工程師也一樣,更換團隊的節奏也是因人而異的。有些測試工程師在Chrome項目下數年,而有一些則在加入團隊18個(gè)月后去了別的團隊。在產(chǎn)品知識與新穎的視角間保持一個(gè)良好的平衡,是一個(gè)測試管理者需要關(guān)注的。

              據上,也就是說(shuō)測試工程師需要向產(chǎn)品經(jīng)理的主管報告,但是也需要與產(chǎn)品團隊一樣自己對產(chǎn)品有所識別,比如搜索、Gmail、Chrome這樣的產(chǎn)品團隊。從組織架構上來(lái)說(shuō),他們是共屬于兩個(gè)團隊的。他們與產(chǎn)品團隊在一起辦公,共同參與產(chǎn)品計劃,與他們一起共進(jìn)午餐,擁有相同的獎金,獲得和團隊所有成員一樣的待遇。獨立報告這樣的組織結構的好處在于提供給了測試工程師一個(gè)論壇,去分享他們的看法。好的測試想法不會(huì )被產(chǎn)品束縛,可以很容易的由產(chǎn)品工程師傳你給所有的測試工程師,獲得公司內最好的技術(shù)。

              這種項目與報告結構相分離是有其自身的挑戰性的。到目前為止,最大的挑戰在于測試工程師是外部資源,產(chǎn)品團隊不能在他們身上壓太大的賭注,他們必須確保產(chǎn)品的質(zhì)量合乎預期。是的,在Google,產(chǎn)品團隊為他們質(zhì)量負責,而不是測試工程師。每一個(gè)開(kāi)發(fā)工程師需要自己做測試,而測試工程師的工作是確保他們的自動(dòng)化測試結構的可移植性,以確保其是可信賴(lài)的。測試工程師是為了讓開(kāi)發(fā)工程師可測試。

              我喜歡的策略是讓開(kāi)發(fā)工程師和測試工程師處于相同的地位。這樣做一方面可以確保我們伙伴間對質(zhì)量有相同的責任,并且把對質(zhì)量負責的重任交給應該確保其正確性的開(kāi)發(fā)工程師。另一方面,這樣會(huì )確保我們存在一個(gè)“多對一”的開(kāi)發(fā)工程師對測試工程師的比例。開(kāi)發(fā)工程師多于測試工程師。這樣的話(huà),他們測試上做得越好,他們在數量上就比我們越多。產(chǎn)品團隊也會(huì )以這樣的高比例而驕傲。

              現在,我們都到齊了嗎?你們都看到了這個(gè)我十分確定的策略的漏洞了。有一個(gè)非常大的問(wèn)題,開(kāi)發(fā)工程師不能去做測試。我該去拒絕誰(shuí)呢?沒(méi)有多少人讓我去拒絕,尤其是在我去年做的一次關(guān)于開(kāi)發(fā)工程師與測試工程師對比的游戲之后(告訴你:測試工程師贏(yíng)得了較量)。

              Google的回答是分解角色。我們在Google用兩種不同類(lèi)型的測試角色解決了兩種不同問(wèn)題。下一章我將談一談這些角色,以及我們是如何將問(wèn)題分解為兩個(gè)部分的。
             

              為了踐行 “誰(shuí)構建,誰(shuí)破壞”的座右銘,一些超出常規意義上的開(kāi)發(fā)工程師的角色是有必要的。也就是說(shuō),有必要存在一種讓開(kāi)發(fā)工程師更快更有效的做測試的工程作用。在Google,我們設置了一些以提高他人更有成效為工作內容的角色。這些工程師把自身當作一名測試工程師看待,但是他們真正的任務(wù)是讓測試更有效率。他們的工作是為了讓開(kāi)發(fā)工程師更有效率,而提高質(zhì)量是更有效率的一個(gè)很大的組成部分。下面是這些角色的一個(gè)簡(jiǎn)要介紹:

              軟件工程師(Software Engineer,SWE)就是傳統的開(kāi)發(fā)工程師的角色。他們?yōu)橛脩?hù)編寫(xiě)各個(gè)功能的代碼。他們創(chuàng )建設計文檔,設計數據結構,進(jìn)行架構總體的設計,并且花費大量的時(shí)間編寫(xiě)和檢查代碼。他們編寫(xiě)大量的測試代碼,包括測試驅動(dòng)設計(test driven design)、單元測試以及其它我們將要在后文中提到的內容,他們參與各種規模的測試構建。他們?yōu)樗麄兯佑|的一切由他們編寫(xiě)的、維護的、修改的代碼負責。

              測試開(kāi)發(fā)工程師(Software Engineer in Test,SET)同樣也是一個(gè)開(kāi)發(fā)工程師的角色,只不過(guò)他們更多的關(guān)注于軟件的可測試性。他們檢查設計,特別關(guān)注代碼質(zhì)量和可能存在的風(fēng)險。他們不斷的檢查代碼,以確保其可測試性。測試開(kāi)發(fā)工程師編寫(xiě)單元測試框架和自動(dòng)化腳本,他們在代碼層面是軟件工程師的伙伴,但是他們更關(guān)注不斷增長(cháng)的代碼的質(zhì)量和測試覆蓋率,而不是增加幾個(gè)新的功能特性或者不斷優(yōu)化的性能。

              測試工程師(Test Engineer,TE)和測試開(kāi)發(fā)工程師恰好完全相反。這個(gè)角色的主要職責是將測試放在第一位,開(kāi)發(fā)放在第二位。測試工程師花費大量時(shí)間在寫(xiě)自動(dòng)化測試腳本的形式,編寫(xiě)那些驅動(dòng)使用的場(chǎng)景以及模仿用戶(hù)使用的代碼。他們也會(huì )組織軟件工程師和測試開(kāi)發(fā)工程師的測試工作,解釋特使結果,驅動(dòng)執行測試,尤其是在項目后期驅動(dòng)項目向發(fā)布的方向發(fā)展。測試工程師是產(chǎn)品方面的磚家,質(zhì)量的建議者,以及風(fēng)險的分析師。

              從質(zhì)量的角度上講,軟件工程師只對產(chǎn)品的特性和這些特性的質(zhì)量負責。他們負責容錯設計,故障恢復,測試驅動(dòng)開(kāi)發(fā),單元測試,以及和軟件測試開(kāi)發(fā)工程師一起為產(chǎn)品特性編寫(xiě)測試腳本。

              測試開(kāi)發(fā)工程師是提供測試特性的開(kāi)發(fā)工程師。一個(gè)框架,可以通過(guò)模擬新開(kāi)發(fā)的代碼與樁(stub)、虛擬對象(mocks)、仿冒(fake)的依賴(lài)關(guān)系將新開(kāi)發(fā)的代碼進(jìn)行隔離,并且確定提交順序以管理代碼的合入。換句話(huà)說(shuō),測試開(kāi)發(fā)工程師編寫(xiě)可供讓軟件開(kāi)發(fā)工程師進(jìn)行特性測試的代碼。實(shí)際上大多數測試是由軟件開(kāi)發(fā)工程師執行的。測試開(kāi)發(fā)工程師是確保特性的可測試項,而軟件工程師則更多參與測試用例的編寫(xiě)。

              測試開(kāi)發(fā)工程師主要關(guān)注在開(kāi)發(fā)工程師(developer)。獨立特性的質(zhì)量是目標,而促使開(kāi)發(fā)工程師容易測試他們編寫(xiě)的代碼是開(kāi)發(fā)測試工程師主要關(guān)注的目標。我可以十分肯定的說(shuō)各位讀者一定清楚的看到了,這里提到的開(kāi)發(fā)的關(guān)注點(diǎn)留下了一個(gè)很大的漏洞:用戶(hù)角度的測試呢?

              在Google用戶(hù)集中測試是測試工程師的主要工作。假設軟件工程師和測試開(kāi)發(fā)工程師已經(jīng)將執行模塊和特性級別的測試進(jìn)行得非常充分了,下一步的工作就是了解這個(gè)可執行的代碼和數據聚合的產(chǎn)品是如何在一起工作以滿(mǎn)足用戶(hù)的需要的。測試工程師扮演著(zhù)二次檢查這些經(jīng)過(guò)勤奮的開(kāi)發(fā)工程師開(kāi)發(fā)出的作品的角色。任何明顯的缺陷都是早期開(kāi)發(fā)工程師測試不充分或粗心大意的表現。當這種缺陷非常罕見(jiàn)時(shí),測試工程師就可以把主要工作轉為確保軟件可以在用戶(hù)的場(chǎng)景下正常運行,確保軟件是高性能的和安全的,是符合國際化標準的等等。測試工程師執行很多測試,協(xié)調眾多測試工程師測試工作,聯(lián)系測試工程師、外包測試工程師、代碼聚合測試工程師、內部測試人員(dog fooders)、beta版用戶(hù)和早期用戶(hù)(early adopters)。他們會(huì )不斷溝通包括包括基本設計、特性的復雜性以及失敗的避免方法在內的可能產(chǎn)生的風(fēng)險。一旦測試工程師介入,他們的任務(wù)會(huì )變得無(wú)休止。

              好了,關(guān)于各個(gè)角色你應該會(huì )有一定的了解了。下次,我將更深入的講解我們是如何通過(guò)這些角色進(jìn)行工作的。感謝你們的關(guān)注。

            原文轉自:http://kjueaiud.com

            老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
              <ruby id="h6500"><table id="h6500"></table></ruby>
              1. <ruby id="h6500"><video id="h6500"></video></ruby>
                    1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>