重溫經典:本文是前 Google 測試總監 James A. Whittaker 的經典分享,成文已經快 10 年了,但經典卻總是常讀常新,推薦給各位測試行業的從業人員。:)
你是如何開始做測試工作的?
1989 年,我在田納西大學讀研究所學生的時候,完成了從軟體開發人員到軟體測試人員的轉型。而這一轉型并非出于我自己的選擇。我命運的改變發生在一個早晨,我的教授質問我為什麼缺席那麼多開發會議。我解釋說因為會議被安排在星期六早上,很不友善。
而怍為一個生平第一次離開家的新入校的研究所學生,這個時間段有些麻煩。十分有意思的是,等待我的懲罰并不是一紙解聘通知書,而是被判罰為該小組的唯一一個測試人員,且不能與開發團隊有任何交流。
對于我的職業生涯來說,這是一個意義多麼重大的決定啊!正是這個決定最終成就了幾十篇關于測試的論文,建構了多得連我自己也記不清的各種工具,出版了五本書,帶來了無盡的快樂工作時間。測試一直就是我擁有的那份具有創造性和技術挑戰性的快樂職業。不過,并不是所有人都喜歡這樣。可以說我最早接觸測試是在攻讀研究所學生期問,不可否認,那時的高強度學習和工作确實讓我受益匪淺。
另外,我認為從初學者階段到專家階段之間存在着一個 “測試的山峰”,人們需要通過一系列個人輔導、擷取資訊和接受正常指導來翻越山峰。成為一個測試初學者是很容易的,成為職業的測試人員也并不艱難。本章的重點正是讨論如何翻越那座位于職業測試人員和測試專家之間的山峰。
回到未來
在軟體測試領域,時間似乎已經停滞了。我們在 21 世紀做事的方法與上個世紀幾乎完全相同。Bill Hetzel 在 1972 年出版的測試知識叢書至今仍然相當有價值。而我自己所寫,于 2002 年首次出版的 How to Break Software(如何攻破軟體) 系列,到今天仍被作為實用軟體測試技術主要資源的代名詞。
确實,如果我們可以把 20 世紀 70 年代的測試人員轉換時空用在今日,我猜想他們的的技巧足夠應付現代軟體的測試。當然,他們需要學習網絡和各種網絡協定,但是他們擁有的實際測試技術将能得到很好的應用。如果從 20 世紀 90 年代找一個測試人員,則不幾乎不需要任何訓練。
對于開發人員來說,卻不是這樣,他們所掌握的那些上世紀的技巧幾乎已經完全過 時。讓一個有一段時間不寫代碼的人重新開始程式設計,看看會有什麼樣的反應。讓我感到很不安的是,我們可以從馬路上直接雇用人手,而雇來的這些人從第一天起就能夠測試,就能夠有收獲。事情真的有那麼簡單嗎?或者是我們的期望值隻有那麼低?讓我更加不安的是,我們沒有任何可預測的方式将合适的測試人才從勝任工作狀态訓練為測試專。測試真的就那麼困難嗎?
這又是那個山峰了。門檻很低,但通往精通的道路卻很艱難。
在通往測試山峰的入口,我們倚仗的是這樣一個事實:測試的很多方面都很容易掌握。大多數人都可以學得有模有樣。甚至隻要将一點點常識應用于輸入的選擇 , 就可以找出缺陷。這個層次的測試就如同在桶裡釣魚,簡單到足以讓任何人都認為自己很聰明。然而過了入口以後,道路迅速陡峭起來,而測試知識變得越來越晦澀難懂。我們發現有人擅長于此,我們稱這些人為 “有天賦的人”,并欣賞他們的本能。
難道一定要依靠本能麼?對于那些看起來不具備特長的人們,是否存在着一條翻越山峰的途徑?是否可以以某種方法傳授測試技能以培養出更多的專家呢?為認為這座山峰是可以通行的,而這一章正是我關于應該如何走這條路的筆記,你可以在自己的職業生涯中加以應用。這并不是一份食譜配方,一份職業生涯烹調書。不過你可以做一些事情來加速你的職業成長。但是,正如你可能已經猜到的,真正是說來容易,做起來難。
上山
測試職業的早期階段主要是為征服測試山峰的漫長攀登做準備。我所能給出的最好的建議是從兩個方面來思考問題。對于你參與的每一個項目,都有兩部分(不一定相等)的任務。第一部分的任務是保證目前的測試項目獲得成功。而第二部分的任務是學習你應該做些什麼以便使下一個測試項目更加容易。我把它稱為 “測試今天的項目,準備明天的項目”。如果你做每一個項目把它都分割成為上述的兩半,那麼幾乎可以保證你能持續獲得進步。這樣,你就可以随着每一個參與的項目逐漸成長為更優秀的測試人員。
現在就讓我們來關注第二部分的任務——為下一個項目做準備。我們需要注意三個概念:重複、技術和漏洞。
重複
做任何一件事,絕不要重複兩次而不意識到或質疑這其實是個問題。我希望所有年輕的測試人員都牢記這一點。我見過很多初學者,他們在單調的任務上浪費了太多的時間,比如,設定測試機器,配置測試環境,在實驗室裡安裝待測試的應用程式,選擇一個産品版本來測試等,這些任務清單可以變得很長,最後你會發現真正花在測試軟體上的時間少得可憐。
這是許多新手常犯的錯誤。他們沒能看到他們日複一日所做的工作的重複本質,兒當他們意識到這種重複時,幾個小時已經過去了,而在這幾個小時内他們沒有做任何實際的測試工作。關注這些重複勞動,并且留意由此造成的真正的軟體測試工作時間的流逝。為了能翻過測試的山峰,必須做一個測試人員應該做的工作,而不是實驗室管理者或者測試機管理者的工作。
測試自動化是解決重複勞動的方案,也是本章稍後的主題。
技術
測試人員常常會對軟體失效進行分析。分析缺陷時,我們從開發人員的失敗中學習如何編寫可靠的代碼。我們也分析那些被我們忽略的缺陷。在應用程式上市以後,客戶就會開始報告缺陷,我們将要面對處理一大堆失效的情形并尋找其中的重要缺陷。使用者報告的每一個缺陷都說明我們的流程有問題,我們的測試知識還不夠完善。
但是分析我們的成功也同樣重要,而許多新入職的測試人員卻沒能利用這個唾手可得的資源。我們在測試中找到的每一個缺陷都說明我們的的測試流程正在有效工作,都是一次成功。我們需要緊緊抓住這種絕好的機會,隻有這樣才能使成功不斷的重複下去。
運動隊常常這樣做,他們會觀看比賽錄像,并分析每一個動作為什麼奏效或者為什麼不奏效。我清楚地記得一個小故事,我的一個朋友拍下了我兒子踢足球的一些照片。其中一張照片記錄了她踢球的瞬間,那個球超過對方守門員成功進球了。當我把它給我兒子看時,我之處他站立的那條腿的姿勢非常完美,他踢球的腳尖緊繃且出球點在鞋帶間恰到好處的位置上。他盯着那張照片很長時間,從那以後他很少用不正确的姿勢踢球。他那次得分可能隻是碰巧做對了,但從此以後他有意識的運用這些技術使之接近完美。
現在回到新手測試人員的課程上來。我們每一個人都會有得意的時刻。我們找到重要的漏洞或發現優先級很高的缺陷,并為此雀躍不已。不過先花點時間考慮一下整體狀況。
我們使用什麼技術找到了那個缺陷?
我們是否可以建立一種方法來找到更多這類缺陷?
我們是否可以記住…些實際的測試經驗并不斷地加以應用來幫助提高我們的工作效率?
軟體的哪些症狀可以提示我們它具有缺陷?
我們将來能否從那些症狀中得到更多的警示?
換句話說,這不僅僅是一個缺陷或是一次成功,這個缺陷教會了我們什麼,是否使得我們将來成為更好的測試人員正如我兒子的進球一樣,盡管第一個缺陷是偶然間發現的,但它不代表其餘的成功都是偶然。了解我們成功的原因很重要,隻有這樣做,成功才能被複制。對于測試人員來說,這種保證成功的原因就是一系列的測試技術、建議和工具,它們可以提高我們在未來項目中的工作效率。
漏洞
測試人員最終都會變得很擅長尋找缺陷,但是要翻過測試的高峰,我們必須更快并且更有效率:高速低阻。換句話說,我們必須擁有一種本身不含缺陷的缺陷查找技術!
我喜歡這樣來考慮問題:測試人員檢視自己的工作時也需要發揮那種尋找缺陷的能力。我們必須使用和尋找産品缺陷一樣的流程來尋找我們自己的測試流程,測試過程中的缺陷。
我的測試流程是不是有問題?
這裡面是否有缺陷?
這裡是否存在着妨礙我提高效率的障礙?
你必須一直尋找更好的方法。有意識地去确定那些限制能力、阻礙前進、減緩速度的東西。就像缺陷限制了軟體滿足使用者需求的能力一樣,是什麼限制了測試的能力?使用你擁有的測試能力來最優化自己的測試流程,這會幫助你在測試的山峰上快速攀登并增加你翻越山峰後成為專家的機會。
測試山峰的巅峰處是一個美好的地方。如果你成功地到了那裡,恭喜你.但這并不是最終日标。這表示你已經成為一個傑出的測試人員。而此時的下坡路就是用你的洞察力和專家知識來幫助周圍的人也成為優秀的測試人員。自己一個人登頂是一回事,幫助其他人(那些能力不如你的人)登頂卻完全是另外一回事。
一般來說,那些成功登上測試巅峰的人會成為使用工具的大師。那些商業工具、開源免費工具 , 和自己寫的工具(我個人最喜歡的工具)是極好地提高工作産出、增加工作成效的方法。
不過,工具隻是實作該目标的一種方法,但在許多其他方面它反而是一種限制,因為太多的人看不到工具的功能之外的東西。他們被限制在工具能為他們所做的事情中,沒能看到或了解對工具還有更多的需求。登頂需要真正掌握的是 “資訊”。因為很多工具能處理資訊,并使得資訊的擷取更加容易,是以測試人員變得過于依賴于他們的工具。但是資訊本身以及如何利用這些資訊才是真正的成功關鍵。
熟練掌握資訊,指了解有哪些資訊,這些資訊将如何影響測試,保證最大限度地利用這些影響。有幾類資訊是測試登頂者必須關注的。這裡我要談的是其中兩種:來自應用程式的資訊和來自之前測試的資訊。
來自應用程式的資訊包括需求、體系結構、代碼結構、源代碼……甚至是關于應用程式在執行時做了哪些事情的運作資訊。在編寫和執行測試用例時,需要考慮這類資訊,但資訊的多寡在很大程度上取決于測試人員的能力,這是一種能夠使測試更高效的能力。在測試中使用這類資訊越多,測試就越偏向于工程而不是猜測。
在微軟,我們有一個遊戲測試組織(Games Test Organization,GTO),負責 Xbox 和 PC 遊戲的測試。談到利用應用程式的資訊,他們是最優秀的。遊戲是難以想象的豐富,測試起來非常複雜。遊戲中很多可測試的内容都是隐藏的(因為讓那些玩家找尋可以交換的物品正是遊戲的樂趣之一)。
如果 GTO 的測試人員所做的僅僅是玩遊戲,那麼他們找到的問題不會比最終使用者更多。為了能做得更好,他們與遊戲的開發人員合作建立了一些資訊控制闆,這些控制闆暴露了一些基本上可以算得上作弊的資訊給測試人員。這樣,測試人員就能提前知道怪物會被投放在何處、物品被隐藏在哪裡,他們可以看到牆的另一邊,可以控制敵方的某些行為。他們的作弊工具(即測試工具)基本上使他們成為遊戲裡的神,讓他們可以控制看到的資訊以便更快更巧妙地測試。這個例子給有測試人員都上了一課。
來自測試的資訊意味着你必須關注在測試時所做的一切,并使用獲得的資訊來影響今後的測試。
你是否知道你的測試是如何與需求結合的,知道何時某一特定需求已經得到足夠的測試?
你是否使用代碼覆寫率來影響未來的測試?
你知道當代碼更新或缺陷修複時那些測試會受到影響,還是知識重新運作所有的測試?
了解測試進行到什麼程度并随着測試調整測試政策,這是測試成熟的标志。
我以前曾在微軟的 Visual Studio 的一個小組工作過,我們大量使用代碼改動量(由于添加新特性或修複缺陷而改變的代碼)和代碼覆寫來影響我們的測試。我們花了很大的力氣将代碼覆寫和代碼改動量通知測試人員,幫助他們了解哪些測試用例對覆寫率有貢獻,幫助他們測試改動過的或修改過的元件。最終的結果是在代碼确實被改動時,我們清楚地知道哪些測試會被影響而隻重新運作那些測試。
我們還知道每個新的測試用例是如何對總體的接口,特性和代碼覆寫率産生作用的,進而指導我們的測試人員,讓團隊中的每個人在他們所建立的所有測試用例基礎上,寫出更有意義的測試。
你用哪些資訊來指導你的測試?
你如何保證資訊是可擷取的,以便在測試中随時可以得到?
你如何使得資訊變得有用,以便它能以良好的方式影響你的測試?
這些問題的答案将決定你在走下專家測試山峰時的前進速度。
下山
到達測試山峰頂峰的時候,你已經成為一個十分能幹的測試人員了,能力也許相當于你組裡所有同僚能力的總和。無論你在做什麼,請不要試圖做得比你的整個團隊都好,不管你對此感覺有多好,或是你的老闆對你遏得有多緊。一旦你走在下坡的路上,就不要再去争取 “找到最多缺陷的人” 或是 “找到最有意義缺陷的人” 這樣的榮譽頭銜。反而我推薦你減少花在測試上的時間,而把創新作為你的首要任務。
在測試上創新指不急于向前,而是仔細觀察、洞察先機、找到瓶頸并改進團隊中所有其他人的工作方式。你的工作變為幫助其他人進步。在微軟,我們有一個專門為此而設的正式職位——測試架構師。不過,不要因為缺少一個很酷的頭銜而讓你沮喪。
無論别人怎麼稱呼你,當你在“下坡”的路上,你能做的最好的事就是盡量保證更多的人能成功地爬上山峰的另一側。
(文章來源于霍格沃茲測試學院)
更多優秀内容及資料可點選擷取