Google 測試總監(jiān)聊如何經營成功的測試職業(yè)生涯


你是如何開始做測試工作的?



1989 年,我在田納西大學讀研究生的時候,完成了從軟件開發(fā)人員到軟件測試人員的轉型。而這一轉型并非出于我自己的選擇。我命運的改變發(fā)生在一個早晨,我的教授質問我為什么缺席那么多開發(fā)會議。我解釋說因為會議被安排在星期六早上,很不方便。

而作為一個生平第一次離開家的新入校的研究生,這個時間段有些麻煩。十分有意思的是,等待我的懲罰并不是一紙解聘通知書,而是被判罰為該小組的唯一一個測試人員,且不能與開發(fā)團隊有任何交流。

對于我的職業(yè)生涯來說,這是一個意義多么重大的決定??!正是這個決定最終成就了幾十篇關于測試的論文,構建了多得連我自己也記不清的各種工具,出版了五本書,帶來了無盡的快樂工作時間。測試一直就是我擁有的那份具有創(chuàng)造性和技術挑戰(zhàn)性的快樂職業(yè)。不過,并不是所有人都喜歡這樣??梢哉f我最早接觸測試是在攻讀研究生期問,不可否認,那時的高強度學習和工作確實讓我受益匪淺。

另外,我認為從初學者階段到專家階段之間存在著一個 “測試的山峰”,人們需要通過一系列個人輔導、獲取信息和接受常規(guī)指導來翻越山峰。成為一個測試初學者是很容易的,成為職業(yè)的測試人員也并不艱難。本章的重點正是討論如何翻越那座位于職業(yè)測試人員和測試專家之間的山峰。


回到未來



在軟件測試領域,時間似乎已經停滯了。我們在 21 世紀做事的方法與上個世紀幾乎完全相同。Bill Hetzel 在 1972 年出版的測試知識叢書至今仍然相當有價值。而我自己所寫,于 2002 年首次出版的 How to Break Software(如何攻破軟件) 系列,到今天仍被作為實用軟件測試技術主要資源的代名詞。

確實,如果我們可以把 20 世紀 70 年代的測試人員轉換時空用在今日,我猜想他們的的技巧足夠應付現代軟件的測試。當然,他們需要學習網絡和各種網絡協(xié)議,但是他們擁有的實際測試技術將能得到很好的應用。如果從 20 世紀 90 年代找一個測試人員,則不幾乎不需要任何訓練。

對于開發(fā)人員來說,卻不是這樣,他們所掌握的那些上世紀的技巧幾乎已經完全過 時。讓一個有一段時間不寫代碼的人重新開始編程,看看會有什么樣的反應。讓我感到很不安的是,我們可以從馬路上直接雇用人手,而雇來的這些人從第一天起就能夠測試,就能夠有收獲。事情真的有那么簡單嗎?或者是我們的期望值只有那么低?讓我更加不安的是,我們沒有任何可預測的方式將合適的測試人才從勝任工作狀態(tài)訓練為測試專。測試真的就那么困難嗎?

這又是那個山峰了。門檻很低,但通往精通的道路卻很艱難。

在通往測試山峰的入口,我們倚仗的是這樣一個事實:測試的很多方面都很容易掌握。大多數人都可以學得有模有樣。甚至只要將一點點常識應用于輸入的選擇 , 就可以找出缺陷。這個層次的測試就如同在桶里釣魚,簡單到足以讓任何人都認為自己很聰明。然而過了入口以后,道路迅速陡峭起來,而測試知識變得越來越晦澀難懂。我們發(fā)現有人擅長于此,我們稱這些人為 “有天賦的人”,并欣賞他們的本能。

難道一定要依靠本能么?對于那些看起來不具備特長的人們,是否存在著一條翻越山峰的途徑?是否可以以某種方法傳授測試技能以培養(yǎng)出更多的專家呢?為認為這座山峰是可以通行的,而這一章正是我關于應該如何走這條路的筆記,你可以在自己的職業(yè)生涯中加以應用。這并不是一份食譜配方,一份職業(yè)生涯烹調書。不過你可以做一些事情來加速你的職業(yè)成長。但是,正如你可能已經猜到的,真正是說來容易,做起來難。


上山



測試職業(yè)的早期階段主要是為征服測試山峰的漫長攀登做準備。我所能給出的最好的建議是從兩個方面來思考問題。對于你參與的每一個項目,都有兩部分(不一定相等)的任務。第一部分的任務是保證當前的測試項目獲得成功。而第二部分的任務是學習你應該做些什么以便使下一個測試項目更加容易。我把它稱為 “測試今天的項目,準備明天的項目”。如果你做每一個項目把它都分割成為上述的兩半,那么幾乎可以保證你能持續(xù)獲得進步。這樣,你就可以隨著每一個參與的項目逐漸成長為更優(yōu)秀的測試人員。

現在就讓我們來關注第二部分的任務——為下一個項目做準備。我們需要注意三個概念:重復、技術和漏洞。


重復



做任何一件事,絕不要重復兩次而不意識到或質疑這其實是個問題。我希望所有年輕的測試人員都牢記這一點。我見過很多初學者,他們在單調的任務上浪費了太多的時間,比如,設置測試機器,配置測試環(huán)境,在實驗室里安裝待測試的應用程序,選擇一個產品版本來測試等,這些任務列表可以變得很長,最后你會發(fā)現真正花在測試軟件上的時間少得可憐。

這是許多新手常犯的錯誤。他們沒能看到他們日復一日所做的工作的重復本質,兒當他們意識到這種重復時,幾個小時已經過去了,而在這幾個小時內他們沒有做任何實際的測試工作。關注這些重復勞動,并且留意由此造成的真正的軟件測試工作時間的流逝。為了能翻過測試的山峰,必須做一個測試人員應該做的工作,而不是實驗室管理員或者測試機管理員的工作。

測試自動化是解決重復勞動的方案,也是本章稍后的主題。


技術



測試人員常常會對軟件失效進行分析。分析缺陷時,我們從開發(fā)人員的失敗中學習如何編寫可靠的代碼。我們也分析那些被我們忽略的缺陷。在應用程序上市以后,客戶就會開始報告缺陷,我們將要面對處理一大堆失效的情形并尋找其中的重要缺陷。用戶報告的每一個缺陷都說明我們的流程有問題,我們的測試知識還不夠完善。

但是分析我們的成功也同樣重要,而許多新入職的測試人員卻沒能利用這個唾手可得的資源。我們在測試中找到的每一個缺陷都說明我們的的測試流程正在有效工作,都是一次成功。我們需要緊緊抓住這種絕好的機會,只有這樣才能使成功不斷的重復下去。

運動隊常常這樣做,他們會觀看比賽錄像,并分析每一個動作為什么奏效或者為什么不奏效。我清楚地記得一個小故事,我的一個朋友拍下了我兒子踢足球的一些照片。其中一張照片記錄了她踢球的瞬間,那個球超過對方守門員成功進球了。當我把它給我兒子看時,我之處他站立的那條腿的姿勢非常完美,他踢球的腳尖緊繃且出球點在鞋帶間恰到好處的位置上。他盯著那張照片很長時間,從那以后他很少用不正確的姿勢踢球。他那次得分可能只是碰巧做對了,但從此以后他有意識的運用這些技術使之接近完美。

現在回到新手測試人員的課程上來。我們每一個人都會有得意的時刻。我們找到重要的漏洞或發(fā)現優(yōu)先級很高的缺陷,并為此雀躍不已。不過先花點時間考慮一下整體狀況。

我們使用什么技術找到了那個缺陷?

我們是否可以創(chuàng)建一種方法來找到更多這類缺陷?

我們是否可以記住…些實際的測試經驗并不斷地加以應用來幫助提高我們的工作效率?

軟件的哪些癥狀可以提示我們它具有缺陷?

我們將來能否從那些癥狀中得到更多的警示?



換句話說,這不僅僅是一個缺陷或是一次成功,這個缺陷教會了我們什么,是否使得我們將來成為更好的測試人員正如我兒子的進球一樣,盡管第一個缺陷是偶然間發(fā)現的,但它不代表其余的成功都是偶然。理解我們成功的原因很重要,只有這樣做,成功才能被復制。對于測試人員來說,這種保證成功的原因就是一系列的測試技術、建議和工具,它們可以提高我們在未來項目中的工作效率。


漏洞



測試人員最終都會變得很擅長尋找缺陷,但是要翻過測試的高峰,我們必須更快并且更有效率:高速低阻。換句話說,我們必須擁有一種本身不含缺陷的缺陷查找技術!

我喜歡這樣來考慮問題:測試人員檢視自己的工作時也需要發(fā)揮那種尋找缺陷的能力。我們必須使用和尋找產品缺陷一樣的流程來尋找我們自己的測試流程,測試過程中的缺陷。






我的測試流程是不是有問題?

這里面是否有缺陷?

這里是否存在著妨礙我提高效率的障礙?



你必須一直尋找更好的方法。有意識地去確定那些限制能力、阻礙前進、減緩速度的東西。就像缺陷限制了軟件滿足用戶需求的能力一樣,是什么限制了測試的能力?使用你擁有的測試能力來最優(yōu)化自己的測試流程,這會幫助你在測試的山峰上快速攀登并增加你翻越山峰后成為專家的機會。

測試山峰的巔峰處是一個美好的地方。如果你成功地到了那里,恭喜你.但這并不是最終日標。這表示你已經成為一個杰出的測試人員。而此時的下坡路就是用你的洞察力和專家知識來幫助周圍的人也成為優(yōu)秀的測試人員。自己一個人登頂是一回事,幫助其他人(那些能力不如你的人)登頂卻完全是另外一回事。

一般來說,那些成功登上測試巔峰的人會成為使用工具的大師。那些商業(yè)工具、開源免費工具 , 和自己寫的工具(我個人最喜歡的工具)是極好地提高工作產出、增加工作成效的方法。

不過,工具只是實現該目標的一種方法,但在許多其他方面它反而是一種限制,因為太多的人看不到工具的功能之外的東西。他們被限制在工具能為他們所做的事情中,沒能看到或理解對工具還有更多的需求。登頂需要真正掌握的是 “信息”。因為很多工具能處理信息,并使得信息的獲取更加容易,所以測試人員變得過于依賴于他們的工具。但是信息本身以及如何利用這些信息才是真正的成功關鍵。

熟練掌握信息,指理解有哪些信息,這些信息將如何影響測試,保證最大限度地利用這些影響。有幾類信息是測試登頂者必須關注的。這里我要談的是其中兩種:來自應用程序的信息和來自之前測試的信息。

來自應用程序的信息包括需求、體系結構、代碼結構、源代碼……甚至是關于應用程序在執(zhí)行時做了哪些事情的運行信息。在編寫和執(zhí)行測試用例時,需要考慮這類信息,但信息的多寡在很大程度上取決于測試人員的能力,這是一種能夠使測試更高效的能力。在測試中使用這類信息越多,測試就越偏向于工程而不是猜測。

在微軟,我們有一個游戲測試組織(Games Test Organization,GTO),負責 Xbox 和 PC 游戲的測試。談到利用應用程序的信息,他們是最優(yōu)秀的。游戲是難以想象的豐富,測試起來非常復雜。游戲中很多可測試的內容都是隱藏的(因為讓那些玩家找尋可以交換的物品正是游戲的樂趣之一)。

如果 GTO 的測試人員所做的僅僅是玩游戲,那么他們找到的問題不會比最終用戶更多。為了能做得更好,他們與游戲的開發(fā)人員合作創(chuàng)建了一些信息控制板,這些控制板暴露了一些基本上可以算得上作弊的信息給測試人員。這樣,測試人員就能提前知道怪物會被投放在何處、物品被隱藏在哪里,他們可以看到墻的另一邊,可以控制敵方的某些行為。他們的作弊工具(即測試工具)基本上使他們成為游戲里的神,讓他們可以控制看到的信息以便更快更巧妙地測試。這個例子給有測試人員都上了一課。

來自測試的信息意味著你必須關注在測試時所做的一切,并使用獲得的信息來影響今后的測試。

你是否知道你的測試是如何與需求結合的,知道何時某一特定需求已經得到足夠的測試?

你是否使用代碼覆蓋率來影響未來的測試?

你知道當代碼更新或缺陷修復時那些測試會受到影響,還是知識重新運行所有的測試?


理解測試進行到什么程度并隨著測試調整測試策略,這是測試成熟的標志。

我以前曾在微軟的 Visual Studio 的一個小組工作過,我們大量使用代碼改動量(由于添加新特性或修復缺陷而改變的代碼)和代碼覆蓋來影響我們的測試。我們花了很大的力氣將代碼覆蓋和代碼改動量通知測試人員,幫助他們理解哪些測試用例對覆蓋率有貢獻,幫助他們測試改動過的或修改過的組件。最終的結果是在代碼確實被改動時,我們清楚地知道哪些測試會被影響而只重新運行那些測試。

我們還知道每個新的測試用例是如何對總體的接口,特性和代碼覆蓋率產生作用的,從而指導我們的測試人員,讓團隊中的每個人在他們所創(chuàng)建的所有測試用例基礎上,寫出更有意義的測試。

你用哪些信息來指導你的測試?

你如何保證信息是可獲取的,以便在測試中隨時可以得到?

你如何使得信息變得有用,以便它能以良好的方式影響你的測試?



這些問題的答案將決定你在走下專家測試山峰時的前進速度。


下山



到達測試山峰頂峰的時候,你已經成為一個十分能干的測試人員了,能力也許相當于你組里所有同事能力的總和。無論你在做什么,請不要試圖做得比你的整個團隊都好,不管你對此感覺有多好,或是你的老板對你遏得有多緊。一旦你走在下坡的路上,就不要再去爭取 “找到最多缺陷的人” 或是 “找到最有意義缺陷的人” 這樣的榮譽頭銜。反而我推薦你減少花在測試上的時間,而把創(chuàng)新作為你的首要任務。

在測試上創(chuàng)新指不急于向前,而是仔細觀察、洞察先機、找到瓶頸并改進團隊中所有其他人的工作方式。你的工作變?yōu)閹椭渌诉M步。在微軟,我們有一個專門為此而設的正式職位——測試架構師。不過,不要因為缺少一個很酷的頭銜而讓你沮喪。

無論別人怎么稱呼你,當你在“下坡”的路上,你能做的最好的事就是盡量保證更多的人能成功地爬上山峰的另一側。





作者:Python測試社區(qū)


歡迎關注微信公眾號 :Python測試社區(qū)