這個標題有點大,小標題是“測試團隊技術能做到的高境界”或者是“測試技術可以往哪些方向發(fā)展”,一家之言。

  個人感覺可以往兩個方向:

  一個是,一切工具化(Automate Everything),包括把測試用例自動化,把流程自動化,開發(fā)各種各樣的工具來提高研發(fā)的效率,避免做重復的手動的事情(這些事情比較容易出錯),目的是, 讓開發(fā)專注做開發(fā),其他事情測試來做;

  那對人的要求是,快速開發(fā)的能力,洞察力,不斷發(fā)現(xiàn)問題,分析問題,解決問題的能力(也是流程改善的能力),所謂快速開發(fā)的能力,是比如開發(fā)人員在開發(fā)新功能的時候,測試可以接入然后很快開發(fā)出一系列的檢查工具幫助開發(fā)避免回歸的問題;比如醫(yī)生在診斷的時候需要的一切工具,體溫計,血壓計,心電圖等等;

  對研發(fā)而言,這些工具包括代碼覆蓋工具,分析代碼改動的工具,代碼版本管理,代碼風險分析,bug管理,bug數(shù)據(jù)挖掘,軟件模塊依賴分析等等。

  舉些例子,關于開發(fā)一些工具來提高研發(fā)的效率;

  比如我自己的機器上部署了Nginx還有Php,每次要做一些Php相關的開發(fā)或者測試的時候需要把2個程序都打開,以前是手動了一個一個打開,后來想想寫個腳本,一鍵搞定:

  start "dd" /d "d:Download ginx-1.0.11" nginx.exe

  timeout 20

  echo "nginx is started"

  timeout 5

  start "" "d:Program FilesPHPphp-cgi.exe" -b localhost:9000

  echo "php is started"

  測試某些軟件的時候,需要配置環(huán)境,比如代理服務,host信息等等,可以把這些動作都自動化,讓所有的人“一鍵點擊”即可部署測試環(huán)境。

  其實人是有惰性的,如果想讓團隊里面的人(開發(fā),項目經理,產品經理,UI/UA工程師)參與測試,一個辦法是讓測試變得很容易,一鍵點擊即可完成。

  再比如周報或者日報,可以開發(fā)一些web系統(tǒng)方便團隊成員寫周報或者日報,然后聚集成團隊的周報或者日報

  還有是BVT(basic verification Test)把一些API的測試,簡單的冒煙測試寫成一個bat文件,開發(fā)在checkin之前很快的跑一下,沒有問題即可checkin。

  把重復的事情自動化,把需要2步或者3步做的事情一步做完,即可提高研發(fā)的效率。

  另外一個是,軟件測試架構師,專業(yè)化(變成Expert),比如你一直測試搜索引擎,那么你很清楚搜索引擎的原理,你發(fā)現(xiàn)過各種各樣的bug,你甚至可以指導比較junior的開發(fā)人員,開發(fā)設計新功能的時候需要邀請你,因為你知道各種各樣的問題,你可以在設計review的時候提出有價值的意見;在這個層面上,測試軟件架構師和開發(fā)架構師無異;

  那對人的要求是,要有很高的讀代碼的skill,能夠讀懂別人的代碼,可以做code review,可以了解底層的運作;有很高的debug skill,發(fā)現(xiàn)問題的時候可以去root cause,從而從系統(tǒng)的角度上知道如何在將來比去避免這些bug,有很強的bug prevention skill;有很強的coding skill。

  舉個例子,關于如何去做review的:

  比如我要寫個Android上面的記事本,可以把數(shù)據(jù)傳輸?shù)皆粕,也可以下載下來,但是不一定很頻繁;不需要實時同步;這樣我如果換手機可以把數(shù)據(jù)下載下來,避免數(shù)據(jù)的丟失,或者遷移的麻煩;

  這些功能一旦確定下來以后,要思考的事情是,放到哪個云上(快盤,微盤還是Dropbox等等),怎么放(文件傳輸?shù)姆椒ǎ肏ttp,還是Email,還是ftp,或者自己寫Socket);有哪些現(xiàn)成的API可以用,比如Java的httpclient的Jar包可以使用,有哪些需要自己寫,比如文件上傳過程需要把文件讀出來編程Java Stream,需要研究哪些技術,文件上傳的Http Post方法等等;由于訪問的安全性問題,都使用了OpenID,那我需要研究一下OpenID(oAuth)如何使用等等;

  測試架構師可以思考這個軟件的work flow是怎么樣的,data flow是怎么樣的,數(shù)據(jù)要存儲在哪里, 有可能有哪些漏洞,比如上面說的產品,需要考慮網(wǎng)絡的情況(GPRS,Wifi)和文件大小因為需要和服務器端通訊,還有安全的問題,比如需要考慮如何去獲取secret key,會不會過期,過期后怎么辦? 文件傳輸是否支持多線程,性能如何;文件下載到本地的時候,如果程序在運行,那么如何替換掉已經load到內存的數(shù)據(jù),還是說先要關閉程序? 等等。

  這些問題可以在設計的時候提出,而不是等binary出來,然后去測試,然后再發(fā)現(xiàn)問題。測試架構師可以通過自己寫一些Demo來了解上面這些技術是如何work的。

  當架構師去review開發(fā)人員的code的時候,可以先大概了解整個軟件的架構,哪些模塊是負責處理什么的,不需要深入到API的細節(jié); 等了解到哪些是關鍵的路徑,比如如何獲取secret key,然后再深入去了解這段API。 之前有些文章提到API的參數(shù)處理,其實這里面不需要過多的關注,特別是Java和.Net的程序,因為這里面有的類型判斷,所以一個處理String參數(shù)的API不可能去接受一個Int型的參數(shù),編譯的時候無法通過。 碰到自己不熟悉的API,好的方法,一個是Google一下,另外是自己寫個簡單的程序用一下這個API豁然開朗。

  另外一個是,多從開發(fā)的角度其思考問題,好有空自己去寫一些實用的程序。 思考程序是如何設計的。比如思考一下以下的問題(這些問題摘選自http://coolshell.cn/articles/7048.html)


  1)網(wǎng)上短網(wǎng)址服務,你有想過這個短網(wǎng)址生成的算法是什么,如何能做到能短?怎么查詢?你也許覺得會用key-value的NoSQL。那么,如果對于同一個URL,如果要重用已生成的短網(wǎng)址,你怎么用key-value的NoSQL來解決?

  英漢詞典的檢索和這個很相似,如果通過英文查漢語,又通過漢語查英文?如果是N多種語言的互相翻譯呢?你的數(shù)據(jù)存儲和檢索如何做呢?

  2)當我看到Dropbox這樣的云同步的軟件的時候,我不知道你是否會和我一樣會去思考,在多個設備間的文件同步是怎么做的?如果網(wǎng)盤上有幾萬, 甚至幾百萬個文件,當要和我的本地數(shù)據(jù)同步時,他如何比較經濟地知道哪些文件更改了?需要向服務端同步或是向客戶端同步。更進一步,你有沒有想過沒有中心 結點的文件同步問題?你有沒有想過,文件沖突的問題?

  3)我們的新員工入職的時候,有一些公司會給新員工的帳號生成一個隨機口令,然后新員工可以在登錄后修改口令(我一直在想我們的銀行應該為用戶生成 一個隨機口令,而不是設置一個6個0或是6個8的初始口令)。那么,對生成隨機安全口令的算法知道怎么做嗎?如果你寫出這個算法來了,你怎么證明這個算法 是足夠隨機,生成的密碼強度足夠大的?(你會發(fā)現(xiàn),測試口令是否隨機是否安全的程序,會比生成器更難寫)

  歡迎有不同意見的人發(fā)表評論,謝謝。