到底為什麼需要寫測試?

建立時間: 2018-01-13 15:56:10
更新時間: 2018-01-13 22:09:58

為什麼需要寫測試?

從開始會寫程式

寫完一個功能就會自己測試一次

到後來第一次聽到寫測試這件事情

應該跟很多人第一次聽到一樣黑人問號.jpg

到底為什麼要寫測試?

寫完自己測就好了

幹嘛還要花時間寫測試浪費我時間?

 

直到這半年來開始寫測試

隨著我測試涵蓋率越來越高

我才越來越能領悟測試的重要

以下是最近半年來我對於為什麼要寫測試?的理解

 

不用浪費時間

一開始會覺的寫測試浪費時間

但是其實真正麻煩的是寫完一個功能就要測一次

而且如果是很長的流程

真的會測得很累

例如結帳流程、會員註冊流程

如果整合一些CI/CD工具像是Jenkins

還能夠在指定hook下自動跑測試  

不需要等介面出來就能先測

這部份講的比較偏單元測試

在開發功能時

我能自己邊寫測試來確保我寫的功能是正確的

不需要等web的介面出來才測

 

例如我們在開發一個訂單邏輯計算的OrderCalculateService

裡面包含了一堆計算金額、數量等等的邏輯

但是要怎麼知道OrderCalculateService裡面的每個method計算的邏輯是正確的

 

傳統都是等整個結帳的頁面出來

然後人工去測試

如果那時候才發現計算有問題

又會發現太晚了

很多地方要改

 

如果有測試

有問題的話就能夠早期發現早期治療

 

修改功能的時候更有安全感

有時候開發新功能或是修改一些舊的功能後

會怕動到一堆相依的功能

不知道會不會造成之前的功能壞掉

但是人工測試一定會有疏漏

如果是交給機器測試

改完功能後

直接跑測試就能知道有沒有改壞

 

測試就是最好的文件

這邊講的是整合測試或是點對點測試

測試寫出來的specs就是各種狀況的流程

如果是以一個限會員購物平台的結帳流程為例

那測試就大概會測以下幾種狀況

  1. 購物車沒任何東西
  2. 沒有登入
  3. 有登入且購物車有商品

這樣如果要講解流程其實很簡單

其實只要看測試就能理解流程

 

測試的種類

單元測試(Unit Test)

既然叫單元測試

就是要針對某個method去做測試

前端單元測試可以使用Mocha

後端單元則是使用PHPUnit

 

點對點測試(E2E Test)

主要是為了測試流程

例如在各種情況下按了登入按鈕

應該要出現什麼樣的狀況

推薦工具有Nightwatch.js

 

關於Nightwatch.js

開始接觸到Nightwatch.js

我真的覺得這個工具很神又很好用

所以要留一個段落介紹它

 

Nightwatch.js底層其實是用Selenium

但是Nightwatch.js把Selenium封裝的更好使用

寫測試的時候幾乎可以不考慮js非同步的問題

因為Nightwatch.js都處理好

可以直接視覺化的寫code

用CSS selector或是Xpath就可以操作DOM

要模擬人類行為真的很簡單

甚至像是切換視窗、檔案上傳都能做到

 

另外也能自行擴充command或是assert

最重要的是它能產出測試報告

提供CI工具使用

 

還有黑人問號?