Software Testing

這篇文章將介紹什麼是軟體測試 (software testing)。以下列出一些常見的定義:

Glenford Myers

Software testing is the process of executing a program or system with the intent of finding errors.

據說 Glenford Myers 寫的書《The Art of Software Testing》是軟體測試領域的聖經本,裡面提到:軟體測試就是為了發現錯誤而執行程序或系統的過程。

ANSI/IEEE Std 729-1983

The process of exercising or evaluating a system or system component by manual or automated means to verify that it satisfies specified requirements or to identify differences between expected and actual results.

這是《IEEE Standard Glossary of Software Engineering Terminology》裡面的定義,軟體測試是透過手動或自動方式執行或評估系統或系統元件的過程,以驗證其是否滿足指定的要求,或確定預期結果與實際結果之間的差異。

Bill Hetzel

It involves any activity aimed at evaluating an attribute or capability of a program or system and determining that it meets its required results.

Bill Hetzel 的著作《The Complete Guide to Software Testing》裡面提到:軟體測試是涉及評估程序或系統的屬性或功能,並確定其滿足要求的結果的任何活動。

題外話,書籍《Software Quality Assurance: A Self-Teaching Introduction》誤將 IEEE 729 的定義寫成 IEEE 83a,利用 Google 搜尋確認後發現沒有 IEEE 83a 的文件,但有不少書籍文獻都寫上 IEEE 83a 這樣的參考資料,這樣的錯誤不知道是從哪裡開始,盡信書不如無書啊!下面補充正確對應的文獻來源。

  • IEEE 83a
    The Institute of Electrical and Electronics Engineers, Inc. IEEE Standard Glossary’ of Software Engineering Terminology. The Institute of Electrical and Electronics Engineers, Inc., New York, NY, 1983.
    (就是 IEEE 729 啦!)
  • IEEE 83b
    IEEE Computer Society, Konover Hotel, Miami Beach, Florida. IEEE Computer Society Workshop on Software Engineering Technology Transfer, April 25-27, 1983.

軟體測試

前面寫了那麼難懂的定義文字,如同法律文件一般,有沒有比較好懂的解釋?《Software Quality Assurance: A Self-Teaching Introduction》書上寫到一個比較受歡迎的定義:

Software Testing = Software Verification + Software Validation

軟體驗證 (software verification) 加上軟體確認 (software validation) 等於軟體測試。驗證和確認 (verification and validation, V&V) 兩者是互補的,關注的問題不太一樣,用白話一點的解釋:

  • 驗證 (verification):我們是否做對的軟體。(We build the right thing.)
  • 確認 (validation):我們是否把軟體做對。(We build it right.)

術語

以下列出軟體測試領域的(英文)專業術語與其說明。(看不懂沒關係,不要被文字描述所限制,所謂的專業領域就是把事情越搞越複雜、定義越來越多的名詞術語XD)

  • Error / Mistake / Bugs
    錯誤,把原本正確的事情做錯。錯誤是會擴散與放大的,規格的錯誤會讓設計和寫程式 (coding) 都會有錯。
  • Fault / Defect
    缺陷,因為 error 造成軟體執行不正確的結果。
  • Failure
    失效,當執行 fault 後發生的結果。
  • Incident
    事件,提醒用戶發生 failure 的症狀。
  • Test
    測試,測試是關於 error, fault, failure, incident 的活動,依據 test case 執行軟體,測試是為了找出軟體的 failure,並證明軟體是正確的。
  • Test case
    測試案例,test case 與軟體的行為有關,具有 input 與預期的 output,input 有實際輸入與先決條件 (precondition) 兩種,output 則有實際輸出與後置條件 (postcondition) 兩種。另外,test case 通常包含其他資訊,例如:ID、名稱、描述、目的、歷史記錄… 等。
  • Test suite
    測試套件,test suite 包含多個 test case 或 test script,為了確認 bug fixes 或是找出 bugs。
  • Test script
    測試腳本,一步一步的指令描述 test case 如何執行。
  • Test ware
    測試製品,在測試過程中產生的所有文件。例如測試腳本、測試案例、測試資料…等。
  • Test oracle
    測試準則,預測測試結果的任何方法。test oracle 是用來判斷測試是否通過的「神諭 (oracle)」。
  • Test log
    測試記錄,依據時間先後紀錄的測試結果。
  • Test report
    測試報告,描述執行測試的實施與成果。

提問

誰應該做測試?

是測試人員、開發人員,還是使用者,大部分的書會寫團隊的每個人,實際上不太一定 (看你怎麼訂 KPI,誰就會去做) 。 測試的目的是為了確認是否有做對的事,以及驗證是否把事情做對,因此跟整個軟體開發都有關係,流程當中涉及不同的工作與人員,所以團隊的每個人都必須做「測試」這件事。

測試會花多少時間?

根據《Software Quality Assurance: A Self-Teaching Introduction》書上,測試佔了軟體開發生命週期 (Software Development Life Cycle, SDLC) 的 70%。實際上呢?測試會依據你給多少時間和資源而決定做多少測試案例 (天啊!怎麼會這樣)。由於帕金森定律(Parkinson’s Law):「無論配置多少工作時間,該工作都會把配置的時間耗光。」比較務實的提問,這個問題應該要改成「你願意給測試多少時間執行?」

軟體要做多少測試?

這個問題要問「要做多少測試才足夠?」軟體系統可能會有無限的執行組合,要每個數值都測試不太實際,例如加法計算,若要測試所有數值那會做不完。正確的做法是設計好的 test case,盡可能讓測試包含所有情境。

參考書籍

Rajiv Chopra, Software Quality Assurance: A Self-Teaching Introduction, Mercury Learning & Information, 2018

發表留言

使用 WordPress.com 設計專業網站
立即開始使用