FrontEnd Automates Test 前端全自動化測試html
文章開頭先引一個知乎上的問答:如何進行前端自動化測試?前端
我相信作過前端的朋友都有這個疑問。但願這篇文章裏你能看到一些別人的測試方法,幫助你更好的進行測試工做;node
很尷尬的是,在此以前個人開發測試也都不會有單元測試而都是人肉測試,對不起本身 ☹️;git
爲了之後可以更好的進行測試工做,記錄本身測試學習的過程,但願能幫本身也能幫到別人。github
假若有這樣一個倆數相加的程序功能:segmentfault
function add(a, b){ return a+b }
咱們如今要對這個倆數相加的程序功能進行測試,來測試這個 add 方法的輸入輸出是否符合咱們的預期,那就要去寫測試用例去測試。api
方式一:你可能這麼寫promise
5 === add(2, 3) // 測試用例(1) (1.7976931348623157e+308 * 2) !== add(1.7976931348623157e+308, 1.7976931348623157e+308 + 1) // 測試用例(2)
測試用例(1)用預期的 5 和 add 方法輸入 2 和 3 的輸出結果進行比對,是否相等;若是相等,那麼 add 方法就經過測試用例,若是不等,就證實咱們的 add 方法存在問題。
能夠看到測試用例(1)
結果是相等,經過測試
測試用例(2)用預期的 1079654173767686669 和 add 方法輸入 1.7976931348623157e+308 和 1.7976931348623157e+308 的輸出結果進行和用例(1)同樣的操做。
能夠看到測試用例(2)
結果應該不等, 測試不經過異步
緣由:原來是咱們沒有考慮大數相加結果溢出的狀況,因此咱們的 add 方法是隻能在相加的結果不會溢出狀況下獲得指望的正確結果。函數
咱們就有必要對咱們的方法進行改動以適配大數相加,那麼每一次這個方法的改動,咱們就要執行一次上面的測試用例。這樣咱們就能進行咱們的而測試工做了。
若是應對簡單的需求這樣的方式顯然夠用了,可是事實上應該是沒人會這麼寫測試用例的。
你們會用 nodejs 提供的 assert 模塊或者 shouldjs 這類斷言庫來幫咱們作斷言這件事情;並且這些模塊被 node 原生提供支持,後面要在此測試基礎上進行自動化測試,生成測試報告之類的,都很是方便。
下節咱們以 assert 模塊爲例來改造這個測試用例;這一節咱們先作一些準備工做,要寫測試用例,會用到斷言,那麼咱們這節就先看看斷言的相關內容,以 node 的 Assert 模塊爲例:
assert 模塊提供了斷言測試的函數,用於測試不變式。
Error 的一個子類,代表斷言的失敗。 assert 模塊拋出的全部錯誤都是 AssertionError 類的實例。
這是咱們寫測試用例,執行測試,調試測試過程最多見到的一個類,指示遇到斷言失敗。
assert(value[, message])
assert.ok() 的別名。
附:assert.deepStrictEqual() 的別名。
assert.deepStrictEqual(actual, expected[, message])
測試 actual 參數與 expected 參數是否深度相等。 深度相等意味着子對象中可枚舉的自身屬性也會按如下規則遞歸地比較。
assert.deepStrictEqual({a:1}, {a:1}); //這樣的測試是能夠經過的
注意:腳本中這倆個是不絕對相等的
assert.doesNotReject(block, error)
該函數至關於 assert.doesNotThrow(),除了須要等待完成的異步特性。
等待 block 的 promise 完成,若是 block 是一個函數,則當即調用該函數並等待返回的 promise 完成,而後檢查 promise 是否被 reject。
若是 block 是一個函數且同步地拋出一個錯誤,則 assert.doesNotReject() 會返回一個被 reject 的 Promise 並傳入該錯誤。 若是該函數沒有返回一個 promise,則 assert.doesNotReject() 會返回一個被 reject 的 Promise 並傳入 ERR_INVALID_RETURN_VALUE 錯誤。 以上兩種狀況都會跳過錯誤處理函數。
assert.doesNotThrow(block, error)
斷言 block 函數不會拋出錯誤。
當 assert.doesNotThrow() 被調用時,它會當即調用 block 函數。
若是拋出錯誤且錯誤類型與 error 參數指定的相同,則拋出 AssertionError。 若是錯誤類型不相同,或 error 參數爲 undefined,則拋出錯誤。
附:assert.strictEqual() 的別名。
assert.fail([message])
拋出 AssertionError,並帶上提供的錯誤信息或默認的錯誤信息。 若是 message 參數是 Error 的實例,則會拋出它而不是 AssertionError。
附:使用 assert.fail([message]) 代替。
assert.ifError(value)
若是 value 不爲 undefined 或 null,則拋出 value。 可用於測試回調函數的 error 參數。 堆棧蹤影會包含傳入 ifError() 的錯誤的全部幀,包括潛在的 ifError() 自身新增的幀。
附:使用 assert.notDeepStrictEqual() 代替。
assert.notDeepStrictEqual(actual, expected[, message])
測試 actual 參數與 expected 參數是否不深度全等。 與 assert.deepStrictEqual() 相反。
附:assert.notStrictEqual() 的別名。
附:使用 assert.notStrictEqual() 代替。
assert.notStrictEqual(actual, expected[, message])
使用 SameValue 比較法測試 actual 參數與 expected 參數是否不全等。
assert.ok(value[, message])
測試 value 是否爲真值。 至關於 assert.equal(!!value, true, message)。
assert.rejects(block, error)
等待 block 的 promise 完成,若是 block 是一個函數,則當即調用該函數並等待返回的 promise 完成,而後檢查 promise 是否被 reject。
若是 block 是一個函數且同步地拋出一個錯誤,則 assert.rejects() 會返回一個被 reject 的 Promise 並傳入該錯誤。 若是該函數沒有返回一個 promise,則 assert.rejects() 會返回一個被 reject 的 Promise 並傳入 ERR_INVALID_RETURN_VALUE 錯誤。 以上兩種狀況都會跳過錯誤處理函數。
assert.strictEqual(actual, expected[, message])
使用 SameValue 比較法測試 actual 參數與 expected 參數是否全等。
assert.throws(block, error)
斷言 block 函數會拋出錯誤。
至此,斷言模塊全部的 api 咱們都清楚了,固然 node 官網對於Assert 模塊還有更詳細的內容。