初嚐軟體測試(Software Testing)
本篇記錄軟體測試概覽、準則與方法、測試文件與Selenium等等。
一、為何軟體測試重要?
軟體正式上線前,為求提供軟體在執行上可以提供風險無虞且具備一定品質的效能與效率,我們會透過一系列的測試,產出客觀、獨立的觀點來確保軟體可以正確運行。
那麼軟體開發過程是如何執行 ? 測試又是在哪一個環節中執行 ?
軟體開發生命週期 (Software Development Life-Cycle, SDLC)
SDLC是描述一個軟體從規劃、建立、測試到最終完成部署的過程。
軟體開發的完整流程,會由最初規劃、需求確認開始。(BA)
接著進行分析,確認所需的資源並設計系統框架。(SA/SD)
下一步就是進行開發。(SWE)
開發完就是軟體整合與測試,我們會透過單元、系統整合測試,並且利用工具進行自動化測試,確保軟體品質達到預期。
最後則是進行部署、監控與維護。
實務上流程也未必是完全線性,取決於開發框架與實際遇到的問題。
二、測試準則 (Testing Principles)
根據ISTQB 提出的七大測試準則,可以幫助我們在測試過程掌握關鍵心法。
- Detection of Bugs
找出Bugs讓工程師debug是基本。 - Effectiveness Testing
完整無缺的測試是不可能的,但我們仍可以透過模組、風險高低進行測試案例的規劃,以求測試覆蓋率達預期。 - Early Testing
早期測試可以避免軟體開發過程成本過高,透過快速迭代的循環進行修正。而什麼時候進行什麼樣的測試,可以參考V model。 - Defect in Clustering
根據Pareto Principle的80/20法則,八成問題會來自兩成的模組,因此識別出有問題的模組相當重要。 - Test is Context-Dependent
測試是有脈絡的,如不同便利商店採不同POS系統、刷卡機、ATM等,必須根據不同的場景與流程進行設計。 - Error free testing is a myth
就算測試都沒有測出包,也不代表完全沒有缺陷,測試的目的是在軟體在上線以前,盡可能的找出所有潛在問題。 - 100% quailty
這個原則提出若原本開發就是根據錯誤的需求做下去,那麼就算無瑕的測試結果也是枉然,因此擁有一個全局觀的軟體開發框架,是相當重要的。
三、軟體測試模型: V model
左方是需求確認,往下至系統設計與開發。
右方就對應到了從單元測試(Unit Test)、系統整合測試(SIT)、使用者接受度測試(UAT)
- Unit Test: 針對目標物件測試。
- Integration Testing: 針對跨物件或模組進行測試。
而QA(Quality Assurance)在執行不同階段的測試過程,就要根據需求進行規劃。包含設計測試計畫、測試案例、環境準備、測試執行、問題回饋。
手動測試(Manual Testing)與自動化測試(Automation Testing)
手動測試最明確的案例是在UAT執行,譬如今天開發的是一個網站,那麼直接到網站上的各種功能進行手動點擊,確認流程無虞。
但手動測試一個一個 button點實在是蠻可怕的,也因此有自動化測試。
自動化則如對網頁進行腳本測試,透過自動化排程方式,讓程式可以自動運行發requests、執行功能等。自動化測試有太多工具可以使用,而本篇文末會提到的Selenium就是其中一種工具(也可以做爬蟲使用)。
根據不同的測試方法也分為黑箱、白箱、灰箱
- 黑箱測試是連測試者為誰在事前未知。(unknown testers)
- 白箱測試是有明確的測試者規劃。(known testers)
- 灰箱測試,如顏色…折衷。
非功能測試 (Non Functional Testing)
根據使用者期待進行設計,在進行所有功能測試後,會針對系統的壓力、用量、效能等指標進行測試。
四、軟體測試文件 (Test Documentation)
- 測試計劃書(Test plan):涵蓋測試編號、測試產品、執行測試類型、預期與實際結果等等。是相對high-level來查看各種測試的文件。
- 測試場景(Test Scenario)與案例(Test case):根據軟體開發需求設計對應的測試環境。並針對該環境內可以執行的測試案例撰寫Step-by-step的測試案例。
注意 Test Case要有詳盡的 inputs,執行前置條件、預期執行後置條件與 outputs。 - 缺陷報告(Defect Report):根據測試結果有問題的內容描述故障或異常狀況,需要附上相關測試產出的結果,例如系統logs。
- 測試總報告 (Test summary report):相當於計劃書的結案報告書,但著重在所有測試結果。
當然,實際上是否都需要這些文件也是取決於團隊,也能需要增加如測試資料等文件的說明。
五、缺陷管理流程 Defect Management Process
從進行測試來偵錯 → 撰寫Bugs reports → 修正 Bugs → Bug list管理。
但這個Bug list的管理通常會透過議題管理系統來進行分配、修正、測試、關案的流程。常見如Redmine、Mantis等(也是Issue Tracking Software)。
六、Selenium
Selenium支援了多種程式語言(Python, C#, PHP, JavaScript, Ruby etc.)與各種OS作業平台、各種瀏覽器。
可以用來讓程式驅動瀏覽器進行基於web的自動化測試。
定位器 Locators
Selenium提供了多種方式來查找元素(FindElement),讓我們可以針對不同的功能抓取對應元素來測試。
- ID
如id=inputId1 - Name
name=myName1 - Class name
css=.inputCss1 - Xpath
xpath=//input[@name=’myName1']
測試驗證
- assert(驗證) : 檢核目標是否符合期待的值,錯誤就終止。
- verify(辨識) : 檢核目標是否為設定值,錯誤仍繼續。
- wait for(等待) : 檢核目標是否在指定時間內出現某狀態,出現錯誤就終止。
錄製操作畫面
Selenium在新增test case也可以透過錄製頁面的方式,直接幫你把操作過程轉換成command,針對目標(target)與值(value)也會抓取。
七、小結
軟體測試在整個開發流程會需要針對產品學習對應的工具,但基本測試觀念與心法大致相同。網路上爬文對於QA也不少有認為就是個揹鍋的角色(因為沒測出問題上線,就是你的問題),但實際上軟體的品質應是整個開發團隊的責任。
其他如,自動化測試在進行迴歸測試(Regression Testing)時特別實用,因為每一次增加功能,要再測過所有功能,基本上手動操作是浪費人力與時間的,因此導入自動化測試是必備的,對QA來說也是基本技能。