1. 程式人生 > >軟體測試的魅力何在?您為什麼選擇測試一行而不做開發?----來自知乎

軟體測試的魅力何在?您為什麼選擇測試一行而不做開發?----來自知乎

雖然我現在換到開發去了,不過畢竟也在這一行做了六年,貌似還是有機會在這裡發言的吧。最初我接觸測試純粹是出於偶然,微軟到我們學校的面試只有做測試的肯要我啊。不過後來做了一陣子之後慢慢就喜歡上這個位置了。說說我過去的一些經驗吧。

       正如我之前在很多回復中說的,測試和開發是兩個關注點不一樣的工作。開發的目標是實現功能,測試的目標是確定功能是否能夠正常運作。那麼它的樂趣在哪裡?簡單地說是兩個關鍵詞:“發現”和“分析”。
一兩句話很難說清楚,舉一個例子吧。
假定你打算寫一個VOIP程式,請問怎麼測試它的效果?沒有經驗的測試可能會告訴你我連上兩臺機器確定電話可以打通就可以了,而有經驗的測試可能會給你列出一大堆的組合:

  1. 你的場景支援筆記本和耳機麼?你支援什麼耳機?藍芽還是3.5mm插口耳機?

  2. 你的場景支援使用筆記本麥克風麼?還是隻支援配麥克風的耳機?

  3. 你的場景支援使用手機裝置麼?Android還是iOS?

為什麼要列出這麼多東西?有人可能會對此嗤之以鼻:只是為了保證什麼都能測到而已。但是其實這裡每一個場景都是有意義的:

  1. 藍芽耳機普遍都有硬體支援的回聲消除模組(Acrostic Echo Cancellation),而普通3.5mm耳機則通常由於結構簡單而沒有。對於沒有回聲消除的普通耳機,我們必須自己提供軟體的回聲消除避免影響接聽效果。

  2. 我們不能使用完全相同的邏輯處理耳機和筆記本麥克風的語音輸入。因為耳機麥克風的定向性比筆記本麥克風強很多,它只能取到聲源湊得很近時發出的聲音,而筆記本麥克風的設計則是用來在螢幕前相當大的範圍內取聲的。如果對筆記本麥克風使用耳機麥克風的聲音檢測演算法則會由於靈敏度過高而將大量周邊雜音收入,影響通話效果。而且有些場景是筆記本麥克風特有的,比如使用者的打字音和風扇噪音。

  3. Android和iOS都有內建的通話模組。iOS甚至提供了非常高效的回聲消除和增益控制模組,但是沒有靜音檢測模組。所以如果桌面程式移植到手機上時可以很好地利用這些功能簡化自己的程式碼。而Android的回聲消除模組則表現非常不穩定,需要很多調整才能得到較好的效果。

這就是所謂的“發現”,發現開發沒注意的地方,發現專案經理沒定義的場景,並提出相應的測試場景。這需要寬廣的知識面才能做到。沒有經驗的測試更傾向於對所有測試的平臺做全排列,但求不忽略任何一個場景。這在資源無限的情況下當然沒問題,但真實專案中,測試的資源經常是最有限的,所以我們得學會怎麼做最有效的測試,而不是閉著眼睛搞全面鋪開。
       那麼什麼是“分析”

舉例來說:如果一個內測客戶投訴你的VOIP程式實際使用中聲音斷斷續續,你怎麼分辨問題的原因?聲音斷斷續續的情況有很多種,有由於網路延遲導致的,有由於作業系統處理過於繁忙導致程式執行時間被高優先順序程式搶走而導致的處理中斷產生的。我們怎麼去分析哪些原因呢?沒經驗的測試可能會直接要求跑客戶現場看看,但如果使用者的環境不是每次都重現該怎麼樣?有經驗的測試會提出:我們可以給客戶一個除錯用的版本,這個版本要求把資料包的收取時間點和每個資料段的開始處理時間點和CPU佔用率紀錄下來。通過前一個我們可以測量使用者的網路情況,後一個數據段可以用來發現是否是作業系統換出導致的。反過來,對產品不熟悉的人,這些資料可能看不出什麼用途。
       有人說,這些都可以讓開發來做,用不著測試。完全正確。可問題是:開發有時間做這些麼?在微軟這樣級別的公司裡,所有的專案都有嚴格的開發進度,開發部門忙於實現功能的時候,我想沒幾個產品經理會同意頻頻打斷開發的進度要求停下來做bug分析。
       另一點是我們不需要把開發和測試的界限分得那麼清楚。事實上大部分如今的跨國IT公司都很少分開發和測試這兩個職位(大約只有微軟還嚴格地分兩個職位吧,即使是這樣,搜尋那邊也開始探索改變了),但是要做的工作還是那麼多,只是頂著的頭銜換了換,所以沒必要糾結。
       === 我是轉換話題的分割線 ===
       另一個問題是關於測試的工作方式的。就像開發一樣,有經驗和沒有經驗的測試在團隊起到的作用是很不一樣的。從測試中遇到問題採取的行動來看,我觀察到的測試人員能達到的層次大概有這麼幾個級別:

  1. 開一個bug;

  2. 查詢一些額外的資料如設計文件和歷史,確定這是一個問題,然後給出詳細的bug重現步驟;

  3. 對重現步驟做一些精煉,確定能夠重現bug的最少步驟;可能的話,將重現步驟做自動化;

  4. 嘗試通過研究程式碼確認問題所在;

  5. 嘗試給出一個fix;

  6. 對錯誤的原因進行分析,提出一些標準化的方法來檢測出類似的問題,比如stress,fuzzing等等;

  7. 能夠對標準化的測試流程定義對應的資料分析方法,可以保證開發和專案主管都能從中得到需要的資訊來掌控質量狀況。

那麼作為一個測試人員,我們的目標是什麼?我對自己的目標是能對我控管的所有的bug從1做到4,在至少兩個例子中我甚至能做到級別6。我在微軟六年多,在很多部門都見到過可以見到可以總是做到級別7的測試,能做到這個狀態的測試,沒有人敢說他們技術不行。對於開發人員來說,如果你身邊有一位能對大部分bug做到級別4的測試,我相信開發的工作也會輕鬆很多。
       即使是抓bug也分很多種。抓一群猴子來隨便在鍵盤上胡點兩下算是測試,認認真真地一步步通過各種技術手段(程式碼覆蓋、壓力測試、安全分析等等)來步步推進也是測試。作為技術人員,你信任哪一種?我想多數人都會選擇後者,但我要說的是在實踐中很多測試團隊都會不知不覺地變成前一種。為什麼?因為測試對產品的設計不瞭解,所以本能地會選擇最容易做的,可問起他們:你們測了多少?信心多高?他們就都傻掉了。我不是說猴子測試沒意義:恰恰相反,它可以抓到我們思維上的許多盲點。但如果你的整個團隊完全靠猴子測試過日子,那絕對不可能給你一個可信任的結果。
       那麼看官們必然會問,這種大牛測試和大牛團隊有多少?很不幸,就我個人的經驗來說,事實是在我遇到的測試人員中,最多隻能做到級別1的測試人員並不罕見,能做到3的測試人員就被很多人認為相當不錯了,至於團隊中存在多個大牛測試的隊伍則真的很少見(微軟總部的比例高很多)。是的,別驚訝,這就是我工作中遇到的情況。但是請注意,這不是說公司在花錢養廢物,而是說在沒有專業測試教育的情況下在入行初期必然會導致的現狀。我們所有人都是從這個狀態開始的,也都需要時間來讓自己進步。
       也許還會有人問:這不是跟開發搶活兒幹麼?是的,沒錯。但為什麼不能搶呢?我們的目的是什麼?是開bug還是做更好的產品?如果你的全部目的只是多開bug,那真的很簡單。真實的例子,我曾經見過有同事將測試自動化程式碼的bug開成產品bug的,他的理論就是不管bug是什麼,先開出來再說,至於它是產品問題還是測試程式碼的問題甚至是環境的故障都可以緩一緩,反正他不負責指出原因。我知道要求一個同事幹這個幹那個很不禮貌,但這種什麼都不做就先開了bug再說的做事風格是在耽誤所有同事的工作。作為團隊的一分子,測試在產品上多花一分時間,有時候能省下開發幾天的工作量,因為測試是最熟悉這個bug的人,而開發則需要從頭開始分析。
       當然,反過來開發也應該儘量將測試帶入開發過程,讓大家都知道各種功能進度的細節。這種合作同樣能大大減少測試在產品設計變更時重新設計用例的時間。
       有人可能還要問:我的時間也很寶貴,為什麼要替開發省時間?嗯,好問題。但我想誰都知道該怎麼回答這種“問題”。

================================

-----  陳甫鵃程式設計話題優秀回答者

================================

和軟體測試遭遇是個偶然,故事有點長,有空且看看作消遣吧。之前在一國企做金融類軟體開發,開vi寫C偶爾還客串VB,終於不堪一年200工作日以上的出差在外和出差期間徹夜加班且無雙休待遇之折磨,一怒之下轉而重回學校作個調整。大學同學所在公司招收實習生,本著賺點學費生活費的需要,抱著沒做過的事情試試無妨的心態,邂逅了軟體測試。研究生期間,學校先後開設了兩門軟體測試的課程,由於有實踐在先,發現學習起來頗有心得。由於老師要求嚴格,第二學期選課人頗少,於是一門大課變成了給少數幾個人開小灶,時間和資源瞬間變得充裕,讓我受益匪淺。而自身的一些觀察、分析、理解、想象能力上的優勢逐漸在這個學習+實踐的過程中體現出來。同時,在實習公司那邊,我開始跟進一個至今說起來都讓大家望而卻步的新功能開發,遇到了開始做測試以來最大的一個挑戰,那絕對是一段痛苦不堪的日子,但也正是這段時間讓我飛速地成長起來,並獲得了大家的認同。畢業後,自然也就留在了這家公司,正式加入了軟體測試的大部隊,似乎也不存在選擇的問題。
       軟體測試的魅力嘛,其實在你這個問題之前,我也沒有刻意地去想過,況且一百個人眼裡一百個哈姆雷特,大家的癢處也未必在同一處。於是就臨時想到的說上一說,個人色彩濃,可能不太切題了:
       首先,我喜歡玩解謎類的益智遊戲,而且發現我對這類的遊戲通常上手較快。雖然我說不好這個跟測試具體有什麼關聯,不過有一些感覺是一樣的,觀察、推演、嘗試、歸納、發現,一個妙趣橫生的過程。測試本身也是對這方面能力的一個綜合考驗,拿到一個難題的時候那種又擔心又手癢的感覺實在是和玩遊戲很像。測試的過程又是一個學習和思維進一步發散的過程,一直引領人往前探索,很有吸引力。
       其次,新鮮感。我做功能測試和可訪問性測試,新功能的探索和發現,是我個人一直愛接新功能勝過做迴歸的主要原因。新工具新技術的發現和學習是個有趣的過程。測試其實是個目的驅動的事情,基於這一點,沒人會要求你從頭造輪子,能拿來用的現成都得學會撿,不然什麼都要從main寫起,黃花菜都涼了。囤新奇工具、學新鮮技術,都是有趣的事情。
       再者,成就感吧。作為某應用的QA owner和一個dev團隊長期合作,雖然大家也會有爭論,時間緊張的時候也會互有抱怨,但合作非常順暢。只有Dev和QA把釋出一個健康的產品當做共同目標而密切合作的時候,才是一個良性的開發生態環境,一個成功釋出的產品是大家共同努力的成果,既是dev team的驕傲,也是QA的驕傲,即使走向前臺接受讚譽的更多是Dev,你也能因你所做出的貢獻而自信滿滿,成就滿滿。想想,在參與設計討論時指出可能存在的設計缺陷,在功能開發之前提供建議避免功能誤讀和錯誤風險評估,一個描述清晰、根源挖掘準確充分的defect送到dev處被幹淨利落地斬草除根,當support team來徵詢產品功能的相關問題時,當用戶來尋求解決方案時,是不是都有一種叫成就感的東東在心裡撒了歡地奔走呢。
       最後,當跟你吵架吵得最凶的開發揹著你對別人誇你是最好的QA的時候,那種感動,一輩子都不會忘記的。

================================

----- 朱杉 軟體測試 豆瓣潛水員

================================

話說不知道為何會被邀請回答,因為我之前是開發,之後是運維,並沒有很多測試實踐經驗。前面各位前輩總結得非常好,提一些粗陋看法以作補充。
0. 責任感:
       這恐怕是開發和測試之間最大的區別。就Bug在整個開發活動中造成的損失來看,在分析、設計處是最小的,而在測試時是最大的,依賴於具體使用的開發工程模型。每個環節引入的Bug都會在下一環節被放大,導致修正成本迅速擴大,到了測試這裡再發現和修正Bug,返工成本相當高,攔截和修正的責任重大。
1. 成就感:
責任感越大,成就感也越大,相伴相生。在測試階段能測出大Bug並修正,任何人都會感到自豪吧。
2. 實踐經驗密集型崗位:
       相較於開發,測試需要更多更齊備的實踐經驗。從正向的系統知識、架構設計,到反向的破壞性思維,無所不包。開發人員通常在理想條件下程式設計,適時處理一些預想中的異常或錯誤;而測試則必須確保當這些異常或錯誤出現時處理程式碼能正確工作。這種檢驗工作遠比開發工作困難得多。同樣的業務程式碼,開發只需要面對少數“正常執行流”即可,而測試則需要面對大量的“異常執行流”。只有實踐經驗豐富者才能保持高測試效率。
3. 煎熬的協作關係:
       開發向來難以認同測試的重要作用。還記得剛開始做開發時,SQA老是過來挑我的錯,搞得我很惱火。但是Boss卻說如果專案順利收尾,我還必須請SQA吃頓飯,要不是他們的努力,說不定還得延期,嚴重的話甚至會導致使用者體驗指數下降,損失遠遠大過面子。幸而SQA組的同事都比較客觀(天天看資料想不客觀都難),他們是真正看結果不問過程的角色,一切就事論事。這一點,單向思維的開發人員很難企及。
       寫的程式碼越多,越認同測試的重要。曾經聽過一個很貼切的比喻:寫程式的人就像在造沒有護欄的橋,自己去走那肯定安全無虞,那怕摸黑也不至於掉河裡去;測試則像給橋修護欄的,讓橋的普通使用者也能像開發那樣來去自如。從這一點上說,測試遠比開發重要。
       我也想過是不是轉任測試,但耐性不夠,忍受不了測試那種枯燥,是以非常佩服能在測試上堅持五年十年的人。至於測試的魅力麼,能說是“與人鬥其樂無窮”嗎?嘿嘿。

================================

----- 樑濤 願做東風,處處解凍

================================

我第一次工作,服從領導的安排,於是進入了軟體測試這個行業。
       這個行業,呆的越久,就會發現,開發或者上級總認為測試不重要,然後,出現問題後,總會最先找到測試人員,而他們卻有不給予測試人員相應的權利,以及對該專案的熟悉度,總是讓測試人員慌手慌腳的開展工作。
作為一名測試人員,比開發更加考驗自身的耐心。

================================

----- 杜凌峰 缺了運道,拿你來補!

===============================

如果軟體測試真的有什麼“魅力”的話,應該是下面幾項:

  1. 更早更頻繁的去思考價值問題,包括艱難的人生

  2. 享受少數派的樂趣

  3. 享受Telling The Hard Truth的樂趣

  4. 享受做幕後英雄的樂趣

我相信如果100個人有做選擇的自由和能力,告訴他這些“魅力”,99.5個應該不會主動選擇去做測試。還有半個有自虐傾向。而那些由於種種原因走上了軟體測試道路,並且長期堅持做出成就的人,大多數應該是因為做一行,愛一行,而不是愛一行做一行。
那些告訴你軟體測試人員需要什麼不同的技能和思維方式,等等等等,都是不靠譜的。好的軟體工程師在本質上沒有什麼不同,只是大家的偏好和選擇不同。但是正是由於軟體測試的這些“魅力”,導致大多數人更願意選擇其他角色。這就是人性。
-------------------------
做一些思考的嘗試,不一定對,與大家切磋。
---------------------------
UP最多的答案有一些乾貨,但是我認為嚴重文不對題,也有很多誤導,就不一一去駁了。
首先其實我推測題主其實想問的是軟體測試區別於其他平行工種的特質。
還是得從問題入手,什麼是“軟體測試”,怎麼定義“魅力”。
--------------魅力分割線-------------
先說“魅力”,簡單可以理解成事物吸引人的內在品質。它應該是中性的和穩定的。這些品質之所以吸引人,是在特定的環境和文化背景下造成的。比如女人的魅力,據說唐代女人以豐滿唯美,還有所謂“楚王好細腰,宮中多餓死”,魅力是審美的結果,審美是一個文化的東西,人,人類社會是不穩定的。
為什麼要說這個。現實中選擇做軟體測試有多種原因:

  1. 偶然 - 剛好有個測試的工作機會,面上了,各方面也不反感,沒有更好的選擇,或者不知道自己的傾向性

  2. 理性 - (注意理性並不代表正確),試舉幾例

    1. 測試工作比開發對程式碼能力要求低,對溝通要求高。我程式碼能力一般,溝通還可以

    2. 現實中測試工作女生多,我是女生,我做測試理所當然

    3. 最近測試職位比較多,競爭不是很激烈

    4. 測試的面試要求低,可以先進自己心儀的公司,然後轉開發,曲線救國

上面能不能稍微總結幾條軟體測試的固有特質呢?我們試試:

  1. 測試工作比開發對程式碼能力要求低 ------ 否。行業的現實情況是測試從業人員的整體程式碼能力是比開發要低,但是這個是事實而不是理想情況。再者有很多公司對測試人員和開發人員的開發能力要求是一樣高的。

  2. 測試工作中女生多 ----- 同樣是部分公司的事實,但是也有不少例外

  3. 測試職位比較多 ----- 這個顯然是感覺而已

  4. 測試面試要求低 ----- 這個也有很多例外,而且這個理解本身也是錯誤的


這些所謂屬性都不穩定。
再來看看有朋友提出的-------------發現”和“分析”
那麼其他的兄弟工種,比如產品,開發,運維,又有那一個不需要發現與分析呢?
那麼究竟什麼是軟體測試工作的相對穩定的內在特質?
首先,我覺得還得從專職軟體測試的產生說起。首先,軟體行業最初是沒有專職的測試人員和測試團隊的,這個分工是後來形成的。其次,現在很多網際網路創業公司,最初也沒有專職測試人員和測試團隊。科學管理的先驅者查爾斯·巴貝奇(Charles Babbage,1792—1871)發展了亞當·斯密關於勞動分工的利益的思想,分析了分工能提高勞動生產率的原因。他指出,這些原因是:

  1. 節省了學習所需要的時間。生產中包含的工序愈多,則所需要的學習時間愈長。例如一個工人無需從事全部工序而只做其中少數工序或一道工序,就只需要少量的學習時間。

  2. 節省了學習中所耗費的材料。因為在學習中都要耗費一定的材料。實行勞動分工後,需要學習的內容減少了,所耗費的材料也相應地減少。

  3. 節省了從一道工序轉變到另一道工序的耗費的時間。而且,由於分工後經常作某一項作業,肌肉得到了鍛鍊,就更不易疲勞。

  4. 節省了改變工具所耗費的時間。在許多手藝中,工具常常是很精細的,需要作精密的調節。調節這些工具所佔的時間相當多,分工後就可以大大節省這些時間。

  5. 由於經常重複同一操作,技術熟練,工作速度可以加快。

  6. 分工後注意力集中於比較單純的作業,能改進工具和機器,設計出更精緻合用的工具和機器,從而提高勞動生產率。

這個顯然是針對體力勞動的,巴貝奇還指出,腦力勞動也同體力勞動一樣地可以進行分工。(來自百度百科)類比軟體行業的分工,我覺得可以大概總結出類似幾點:

  1. 節省了學習所需要的時間 - 依然成立

  2. 節省了學習中所耗費的材料 - 依然成立

  3. 節省了從一道工序轉變到另一道工序的耗費的時間 - 減少Context Switch,可以更專注,成立

  4. 由於經常重複同一操作,技術熟練,工作速度可以加快 - 成立

  5. 分工後注意力集中於比較單純的作業,能改進工具和機器 - 能改進測試工具和流程

那麼在軟體測試的專業分工形成以後,究竟什麼工作被分了出來?這個回答很簡單,就是軟體測試的活動?那麼軟體測試的活動包含哪些?這個就有可能不那麼容易形成一致了,在現實場景中每個行業和每個公司可能有差距。我認為軟體測試的最終目的和產品、開發、運維等等應該是一致的,就是保證軟體產品符合使用者的預期,給使用者和企業創造價值和利潤。在這個工程中,以傳統瀑布模型為例,試著比較一下各個工種的分工:

  1. 需求提出階段

    1. 大家都會關注需求的合理性

    2. 開發人員更關注需求的實現方式和代價等

    3. 測試人員關注需求的可測性(不展開可測性,有需要自己查)

    4. ------------------這個階段我認為對測試人員和開發人員只有技能要求不同,沒有本質區別

  2. 技術設計階段

    1. 大家都關注設計本身的正確性,完整性等

    2. 開發人員更關注設計的實現方式、工具、代價

    3. 測試人員還需要關注可測性

    4. ------------------這個階段我認為對測試人員和開發人員只有技能要求不同,沒有本質區別

  3. 開發測試階段

    1. 開發人員構建產品,修改bug

    2. 測試人員構建測試工具,測試用例等素材,執行測試,暴露bug

    3. -------------------這個階段我認為對測試人員和開發人員只有技能要求不同,沒有本質區別

    ================================

    -----Andy Chen 牢裡只有一隻羊

    ================================

關注公眾號 (softtest_way) 軟測之道