顯示廣告
隱藏 ✕
※ 本文為 runepig.bbs. 轉寄自 ptt.cc 更新時間: 2012-05-27 18:10:22
看板 Soft_Job
作者 TonyQ (自立而後立人。)
標題 [閒聊] 笑談軟體測試的幾個階段(一)
時間 Sat Mar 24 13:44:55 2012



        昨天去參加活動跟幾個朋友談到測試,覺得幾個點值得專文記錄下來。

        -----------------------------------


        首先 這篇文章不是要說測試有沒有用,測試值不值得作,不是要戰這個。


        當然有興趣要戰的可以自己開砲,但是我先說我沒有要戰這個的意思,
        純粹是分享作測試的幾個階段跟心情。


        這篇文章廢話多心得少,加減看就是了。

        -----------------------------------


        然後基本上我們談的都是工程師如何面對程式碼的自動化測試,
        不是講專案的測試,也不是講測試方法論。

        (聽不懂我在講什麼往後看就知道)

        -----------------------------------


        我也不假設你會怎麼樣看到測試這個名詞跟怎麼樣進入測試領域,


        我覺得測試這塊太多雷就是別人都會告訴你測試很好很讚怎樣,
        或者是給你一個很適合用測試的情境告訴你測試的好處,


        但是你會發現,(呃),我拿到我的環境開始寫測試就完全不是這麼一回事。


        因為別人都在說,所以你覺得他好像是有用的,
        但你可能根本不知道怎麼寫你的測試,你可能不知道你要測什麼。

        你試著去做了,但是你不知道你獲得了什麼,
        然後你開始想,你是不是作錯了,


        然後你可能感覺不到他帶來的好處,於是,你就放棄了,

        你覺得測試是浪費時間。


        -----------------------------------

        我不會用可惜來形容這件事情,因為你確實從過程中得到了經驗,

        有時候,我會認為你甚至可能是對的,
        你的確花時間在寫沒用的測試,只是那並不浪費時間。(原因後述)



        我希望盡量從我的經驗中抽出大家可能會有共鳴的部份,
        帶大家走一次我經歷測試的感想。



        我只說,我當初是怎麼開始想寫測試,經過哪些問題,
        撞過哪些雷跟我現在的想法是怎樣。


        因為時間有限再加上這不是個嚴肅的議題,
        我會用輕快的風格帶過以下的文字,

        希望你也可以感受到測試並不是個沈重的主題。:)



        然後我也必須要先說明的,

        測試是一個很有爭議的題目,
        有些我認同的見解或者我的經驗不見得是對的,歡迎挑戰跟更正。

        -----------------------------------


        Let's get started.


        -----------------------------------


        ok,首先我以前一開始寫程式是寫 Java 的,


        一開始時我寫程式都是寫新手級的小功能,
        有個 main method ,要使用者從 console input 一堆東西,

        然後我去印出對應的結果。


        因為我不可能找出我當初到底寫什麼,所以我舉假想例子。

        -----------------------------------


        比方說新手入門題,

        停車場收費一小時五十塊,三小時以上打九折,六小時以上打八折,
        使用者輸入停車多少分鐘我幫他算出他要付多少錢,未滿一小時的算一小時。

                                (不要小看新手入門題,
                                  你以為我現在寫的小單元除了畫面漂亮點,

                                  需要存檔到 DB 以外,
                                  邏輯上到底比這個東西複雜到哪去?)


        這時候我就要開始寫程式啦,我用虛擬碼寫,大家將就著看。


        main(){

                //假設使用者輸入一行資料(停車幾分鐘)並轉數字
                //並假設使用者都是善良user,不會輸入英數字

                int k = console.getInt();
                int hours = ceil(k/60) ; //除60並且無條件進位
                int money = 50 * hours;

                print(money);

        }



        這時候我發現,我寫程式我需要程式他到底會怎麼作,
        我需要知道使用者輸入數字時系統要回傳什麼,


        於是我會開始累積測資:

        user input :  1,系統應該回應: 50
        user input : 61,系統應該回應:100
        user input :121,系統應該回應:150



        夠眼尖跟夠經驗的都知道,一開始的測資,
        不可能這麼機車剛好都在邊界值,一定都是順手亂打,


        所以上面的測試資料是有作弊的,是我花時間想過的結果,
        要能夠作到這麼機車的測試案例,都是需要我用腦袋想的。

        所以,換句話說,如果我沒有想到有其他可能性,我就不會去測他。(竊笑)



        我沒有要表達什麼,就只是陳述一件事情。:)


        -----------------------------------


        所有寫過程式的應該都知道我在講什麼,以上面的例子,
        每改一段 code ,你可能就會key 1,key 61 來測系統回應對不對。

        -----------------------------------



        然後眼尖點的,會發現我剛剛的程式碼有bug,測到 181 的時候會出事,

        但是我一開始寫完時沒有想到要用 181 的測試資料去測試,
        那這隻就會是 bug ,一直到使用者測試,

        並真的碰到這條件了,我才會知道。


        -----------------------------------


        如果你有寫程式經驗或者看到別人的介紹,
        你大概這時候會期待我說抽 method ,

        寫 unit test ,跑 unit test。



        但是我說了,我只是分享我的經驗,
        而我的經驗是,我一開始會寧可用手打。

        因為我剛寫程式很興奮,跟 console 多點互動會有滿足感。(咦)



        有時候自己當當假想中的蠢 user 其實是蠻爽的(無誤),
        一開始就要把東西變成一版一眼的 input/output 其實蠻無聊的。


        什麼可靠性阿,什麼穩定性阿,

        我還不是要花時間想一堆很機車的測試案例,
        我後面可能還有別的好點子要做,這功能隨便就好啦。


        最後還不是活人要用,我當當活人測測有什麼不好?


        (註:我這裡隱含一個判斷是,這段程式碼我對他很有信心不會錯,
              或者說我認為我對他的操作已經涵蓋大部分的使用情境,
              我對他在大部分的狀況下有信心


              另外我假設這裡有邏輯 bug 並不會導致使用者或我散盡家財,
              不然寫個程式一下就因為 bug  game over 對新手也太可憐了。XD

                                                                         )

        -----------------------------------


        結果這東西就上線給使用者用了,
        糟糕,使用者回報輸入超過三個小時有問題。



        簡單嘛,小問題,我改改

                int hours = ceil(k/60) ; //除60並且無條件進位
                int money = 50 * hours;

                if( hours > 3) {
                        money = money * 0.9;
                }

                print(money);


        .........

        我又打了一次測試資料,然後我只有個模糊印象記得我上次測啥,
        好像有 1 61 121 ,

        糟糕,那這次要測什麼?


        還好使用者有告訴我 188 是有問題的,
        耶我不用自己想測試案例,真開心。 (使用者在你背後,他非常火)


        那我心內 OS,我之前測過 1 跟 61 記得都好好的,這次也沒改多大,
        我這次只有改一點點,打個 121 算數確定(我有信心)沒改多大就好,


        然後再測測 188 ,正確。(你安心的過板跟跑去回使用者信)


        -----------------------------------


        然後,就沒有然後了。


        -----------------------------------


        如果你有認真看程式碼,你可能會問我,那使用者停車超過六小時咧?

        那 bug 就放著不管嗎??



        對,因為這個停車場是一個內用限時三個半小時餐廳,

        並且不准外人停車的停車場,
        所以上線以來沒有使用者會停車超過六小時的情境。



        (欸,你這也凹太大了吧...那你題目訂個屁啊。)

        囧,(假想的)餐廳老闆就在我寫完程式後,
        才訂了這個內用不能太久的規定。

        我寫程式時也剛好恍神沒想到這條件,怪我囉?




        -----------------------------------

        以上案例真的就結束了,跟測試的關係是?


        1.測試資料跟希望的測試結果是人想的,而且它是測試中最重要的部份,
          而且更重要的是,不管寫不寫 unit test 或什麼鬼 test,

          這都是你的責任。


          測試不會因為你有作就自動變滿分,決定測試成效的人是你。

          另外,因為你跟其他寫程式的人終究都還是個人,
          你可能寫久了就不會像剛剛那個程式開發者(我)那麼散仙,
          連題目有寫的條件都忘記要寫要測,但是你還是可能會打錯字但沒測到。



        2.以測試而言,經過市場(使用者)測過的東西是以結果而言最可靠的,
          因為過了那關其實你也就不用太介意別的東西了,

          六個小時以上會有問題,so what ,反正現在能用,
          以後用餐時間規定又改了也不是你的錯,總有人會去 debug 。(囧)


          但是因為使用者跟後面接手的開發者會生氣說你壞話,
          所以作人還是要自我要求一下,只是那就無關「目前」的產品品質。

          而是「未來」的產品品質,所以如果一個產品沒有未來...


          當然,現實世界這種好事不多,
          多得是上 production 之後,題目沒寫到的潛規則跑來找你麻煩。



        3.test 我們本來就在做了,沒有開發者不需要作 test。



        -----------------------------------


        因為我下午有事要出門,就先賣個關子,

        晚上再來寫(二),預計會寫到三、四篇,
        請大家輕鬆看待這個系列文章,不要太嚴肅。XD


        我不預設任何立場,只是分享經驗,以工程師看軟體測試而言,
        會看見什麼東西,更多的是你寧願相信什麼。:)



        注意,我這裡講的都是工程師自己如何作/練習軟體測試,
        不是一個專案要怎麼測試,怎麼確保專案上線有品質,那是兩回事。

--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.80.200.204
※ 編輯: TonyQ           來自: 111.80.200.204       (03/24 13:46)
codemonkey:軟體測試最重要的就是monkey test階段,也就是客戶端1F 03/24 13:47
codemonkey:某高層話虎話蘭花、然後我方業務跟著亂的階段
evilbank:推3F 03/24 18:32
lance70176:寫的很有趣啊~ 最近也在做這個4F 03/24 19:33
※ 編輯: TonyQ           來自: 111.81.205.78        (03/24 21:30)
※ 編輯: TonyQ           來自: 111.81.205.78        (03/24 21:31)
Eior:推一個5F 03/24 21:46
thinkniht:為什麼我放的m被拿掉了一.一+6F 03/24 22:14
TonyQ:@thinkniht ;)7F 03/24 22:24
thinkniht:竟然把我覺得是好文所以放的m給拿掉T.T8F 03/24 22:31
thinkniht:話說...第二篇咧...(伸)
viable:TonyQ說你在陷害他10F 03/26 00:33
thinkniht:我像這樣的人嗎QQ11F 03/26 00:42
viable:歐布  ㄅㄨ一ㄠ哭哭ㄌㄜ12F 03/26 00:58
haubar:推~13F 03/26 23:52
AdamHmc:推14F 03/27 01:06
TonyQ:web 版網址  http://disp.cc/b/575-3nbH15F 03/27 12:48
smallyuyuyu:這一系列M一下阿16F 04/03 07:43
vn509942:推,很詼諧,但很切實際。17F 04/04 06:36

--
※ 看板: P_pig 文章推薦值: 1 目前人氣: 0 累積人氣: 1428 
※ 本文也出現在看板: Soft_Job
作者 TonyQ 的最新發文:
點此顯示更多發文記錄
分享網址: 複製 已複製
( ̄︶ ̄)b Knuckles 說讚!
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇