近Quora上有個(gè)討論,原意是:“facebook是如何做自動(dòng)化測(cè)試的,他們是怎樣測(cè)試才能保證每周的升級(jí)都可以不出差錯(cuò)的呢?”
  來(lái)自Facebook的Steven Grimm很好地回答了這個(gè)問(wèn)題,覺得還不錯(cuò),這里以第一人稱翻譯了一下。  
      對(duì)于PHP的代碼,我們寫了非常多的基于PHPUnit測(cè)試框架的測(cè)試類,這些測(cè)試類覆蓋范圍比較大,從簡(jiǎn)單的判讀真假的單元測(cè)試到大規(guī)模的后端服務(wù)的集成測(cè)試。開發(fā)人員把運(yùn)行這些基于PHPUnit的測(cè)試用例作為他們工作中的一部分,同時(shí)這些用例也在一些專用的設(shè)備上不停地被運(yùn)行(注:持續(xù)集成模式)。當(dāng)開發(fā)人員對(duì)一些代碼做了比較大的修改時(shí),在開發(fā)機(jī)器上的自動(dòng)化工具會(huì)運(yùn)行這些測(cè)試用例的同時(shí)也會(huì)生成相應(yīng)的代碼覆蓋率數(shù)據(jù),對(duì)于需要提交到代碼庫(kù)的diff,在做代碼review的時(shí)候回自動(dòng)地產(chǎn)生一份帶有覆蓋率的測(cè)試報(bào)告。
     
對(duì)于前端的代碼,我們使用Waitir(注:Waitir是前端UI的自動(dòng)化測(cè)試框架)做了基于瀏覽器的界面自動(dòng)化測(cè)試。這些測(cè)試用例涵蓋了網(wǎng)站頁(yè)面的功能,特別是針對(duì)隱私方面,比如:“用戶X發(fā)布了Y,而Y應(yīng)該/不應(yīng)該被用戶Z看到”,有著大量的基于瀏覽器級(jí)別的這種用例。(這些隱私規(guī)則當(dāng)然也會(huì)使用一些更低級(jí)別的方法被測(cè)試到,但是這些規(guī)則的實(shí)現(xiàn)是必須要嚴(yán)格執(zhí)行的,并有著非常高的優(yōu)先級(jí),因此這部分必須要有足夠的測(cè)試用例來(lái)覆蓋)
    
除了一些使用watir的全自動(dòng)化用例以外,我們也有一些半自動(dòng)化的測(cè)試。這些測(cè)試也使用了waitir技術(shù),這樣可以使一些表格填充或者點(diǎn)擊button來(lái)完成整改界面上的流程的測(cè)試不太單調(diào)乏味,而且我們可以很清楚地檢查和驗(yàn)證當(dāng)前的步驟或流程是否正確合理。
   
我們也在嘗試開始使用JSSpec (注:JavaScript單元測(cè)試框架)去做一些JavaScript代碼的單元測(cè)試,但當(dāng)前也是剛剛開始做。
   
對(duì)于后端服務(wù)的測(cè)試,根據(jù)不同的服務(wù)特性我們采用了許多不同的測(cè)試框架與方法。對(duì)于一些需要開源發(fā)布的項(xiàng)目,我們會(huì)使用開源的測(cè)試框架,像Boost和JUnit測(cè)試框架(注:Boost是針對(duì)C++/JUnit是針對(duì)Java的測(cè)試框架);對(duì)于另外一些項(xiàng)目,可能永遠(yuǎn)都不會(huì)發(fā)布到外界,我們是使用內(nèi)部開發(fā)的可以很緊密地與我們build系統(tǒng)集成在一起的C++測(cè)試框架。還有少數(shù)項(xiàng)目會(huì)使用項(xiàng)目級(jí)別的測(cè)試工具。多數(shù)后端服務(wù)的測(cè)試都會(huì)緊緊地和持續(xù)集成/Build系統(tǒng)結(jié)合在一起,這些持續(xù)集成的build系統(tǒng)會(huì)不停地針對(duì)源代碼自動(dòng)地運(yùn)行測(cè)試用例并生成測(cè)試結(jié)果,測(cè)試結(jié)果在存儲(chǔ)在數(shù)據(jù)庫(kù)的同時(shí)會(huì)發(fā)送到通知系統(tǒng)中去。
     
HipHop(注:HipHop for PHP是Facebook的PHP項(xiàng)目)有一套類似的持續(xù)集成系統(tǒng),HipHop的單元測(cè)試和所有基于PHPUnit的測(cè)試都會(huì)被運(yùn)行。所有的這些測(cè)試結(jié)果會(huì)和基于普通的PHP解釋器的結(jié)果做對(duì)比,從而可以看到不同PHP上的行為的不同;
  Facebook的測(cè)試工具將測(cè)試結(jié)果存儲(chǔ)在數(shù)據(jù)庫(kù)的同時(shí)會(huì)發(fā)送一份通知郵件,這個(gè)郵件會(huì)包含執(zhí)行失敗的信息并且郵件的接收范圍是開發(fā)同學(xué)可以自己調(diào)整的。(例如,你可以選擇只有在測(cè)試連續(xù)失敗一段時(shí)候的時(shí)候才接收到通知郵件,或者當(dāng)一個(gè)用力失敗的時(shí)候立刻收到通知)。在瀏覽器UI上,測(cè)試結(jié)果和 缺陷/開發(fā)任務(wù)跟蹤系統(tǒng)會(huì)結(jié)合在一起,可以很容易的將測(cè)試失敗與開發(fā)任務(wù)關(guān)聯(lián)起來(lái)。
     
測(cè)試中一個(gè)非常重要的現(xiàn)象是“導(dǎo)致阻塞”,也是一個(gè)測(cè)試用例失敗有可能會(huì)阻止發(fā)布(在Facebook,有發(fā)布工程師會(huì)來(lái)評(píng)估是否可以將帶有問(wèn)題的代碼發(fā)布到生產(chǎn)環(huán)境,發(fā)布工程師在必要的情況下會(huì)得到授權(quán)去阻止產(chǎn)品的發(fā)布)。阻止產(chǎn)品發(fā)布上線的事情是被認(rèn)為是非常嚴(yán)重的問(wèn)題,因?yàn)樵贔acebook大家對(duì)于這種快速發(fā)布的模式是深深引以為豪的。
     
我所在的團(tuán)隊(duì)是測(cè)試工程部門,主要職責(zé)是打造通用基礎(chǔ)工具,這些工具會(huì)被上述的所有人用到,同時(shí)我們也在維護(hù)測(cè)試框架,像PHPUnit和Watir。Facebook沒(méi)有專職的測(cè)試團(tuán)隊(duì),所有的工程師都需要為他們的代碼寫自動(dòng)化測(cè)試用例,并維護(hù)這些測(cè)試用例,保證產(chǎn)品代碼改變的同時(shí)這些測(cè)試代碼可以正確地運(yùn)行。
  Facebook的測(cè)試還處于一個(gè)初期起步嘗試階段,上面的介紹都只是我們?cè)诋?dāng)前運(yùn)行的方法而已。
  公直 2012/2/27
  附錄原文,
  What kind of automated testing does Facebook do? How do they make sure they aren’t breaking things in their weekly pushes?
  Steven Grimm, 2005-2012
  We do several kinds of testing. Some specifics:
  For our PHP code, we have a suite of a few thousand test classes using the PHPUnit framework. They range in complexity from simple true unit tests to large-scale integration tests that hit our production backend services. The PHPUnit tests are run both by developers as part of their workflow and continuously by an automated test runner on dedicated hardware. Our developer tools automatically use code coverage data to run tests that cover the outstanding edits in a developer sandbox, and a report of test results is automatically included in our code review tool when a patch is submitted for review.
     
For browser-based testing of our Web code, we use the Watir framework. We have Watir tests covering a range of the site’s functionality, particularly focused on privacy?there are tons of “user X posts item Y and it should/shouldn’t be visible to user Z” tests at the browser level. (Those privacy rules are, of course, also tested at a lower level, but the privacy implementation being rock-solid is a critical priority and warrants redundant test coverage.)
     
In addition to the fully automated Watir tests, we have semi-automated tests that use Watir so humans can avoid the drudgery of filling out form fields and pressing buttons to get through UI flows, but can still examine what’s going on and validate that things look reasonable.