測試這件事情是為了一致性,為了不讓伴侶不信任,在男女之間交往一致性也是很重要的一環。
在日常的對話和相處過程中,彼此都會透過些方法來確認, John Rempel 等人提出信任包含可預測、可依賴和信念三個要素。
以程式測試來說,每次的測試會期待能得到相同結果,並且認為能夠依賴系統解決問題。
舉個例子來說小編前公司是做看盤軟體,為了確保 Production 環境穩定,每天會在開盤前執行 E2E 測試確保網站運作正常,即便當錯誤發生也能即時寄信通知相關人員。
寫測試前要問三個問題
測試的步驟上大致會遵守 3A 原則
好的單元測試
測試是為了開發速度和產品品質,不要因為著急而跳過測試,沒有測試的話會花更多時間在上線前的來回,可能有些問題還沒修好就上線,引發更多新問題,但什麼都要測試嗎?
建議做黑箱測試也就是測試流程與結果即可,在測試公開的介面或元件的過程中其實也會順便測試到內部邏輯,當撰寫 E2E 測試的時候也有單元測試覆蓋的概念,雖然 E2E 的運行成本較高,但針對可能會頻繁更改的內部實作做單元測試也有點浪費時間。
另外 E2E 測試也可以當作一個文件,可以告訴不熟系統的人關鍵操作流程以及定義什麼是正常的操作,按照使用者故事跑過網站的關鍵流程,並且交由助理工程師來協助驗收。
推薦工具:
當前端開發元件化以後,最基本的就是針對元件做單元測試,第一次寫測試的話可以先問自己幾個問題:
單元測試通常是一個自動化的測試,確保某一段程式碼 (單元) 有被正式執行,在測試時大多使用單元測試框架測試。
單元測試在測什麼
jest.fn()
jest.fn()
依照使用的框架或函式庫不同會有不同的測試工具,像 react 的話 facebook 官方就有 Jest。
Jest 對於單元測試來說非常方便而且也包含了覆蓋率的計算,最後會直接出一個報表給你,文章中也有推薦 enzyme,是 airbnb 開發的工具,據 react 官方說法是讓測試更簡單。
enzyme 只是讓我們更方便測試 react 用的外掛,主要是因為 react 有用到 virtual dom ,那測試又會需要去 render,所以 enzyme 就封裝了 react 原生的測試讓寫法更直覺。
寫法上會用到以下三個基本關鍵字 describe , it , expect,這是撰寫單元測試的語法架構,寫完這三項就是基本的測試了。
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import sum from "./sum";
describe("測試群組一", () => {
it("sums numbers", () => {
expect(sum(1, 2)).toEqual(3);
expect(sum(2, 2)).toEqual(4);
});
it("renders without crashing", () => {
const div = document.createElement("div");
ReactDOM.render(<App />, div);
});
});
Cypress 提供針對測試的配置、撰寫、執行、除錯完整的 end-to-end test 的解決方案,比較特別的是 Cypress 也像 Redux 的專案一樣提供了時空旅行的功能,並且提供了方便的介面讓我們更容易去針對測試進行除錯。
這次就用貓貓點擊大賽參戰的範例來帶大家超快速入門,來看看怎麼讓機器來取代 Popcat 的人工點擊!!!
原始碼: https://github.dev/LinYenCheng/popcat-cypress
Cypress 在使用上其實也很簡單,只要透過簡單的安裝設定就能夠直接執行並撰寫測試了,不一定要測試自己開發的網站,針對網路上的任何站台都能夠執行測試腳本。
如果是 npm 的專案
npm install cypress --save-dev
首先要設定 npm script
{
"name": "popcat",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "cypress open",
"test-one": "cypress run --spec **/popcat.spec.js"
},
"author": "",
"license": "ISC"
}
安裝完完並設定之後,雖然專案資料夾都是全空的,但其實就可以執行了,這時候 Cypress 會偵測到我們是第一次執行,會自動將相關配置及範例加入。
第一次執行
cypress open
>
接著 Cypress 會自動加入相關預設的資料夾配置如下
第一次啟動後的畫面
此外其實若想修改預設配置,也可以透過設定 cypress.json
來達到相關效果,底下是基本的範例可以看出我們能多設定像是重試次數、影片錄製等等參數,設定檔相關說明可以參考設定檔的參考文件。
{
"viewportWidth": 411,
"viewportHeight": 731,
"defaultCommandTimeout": 8000,
"requestTimeout": 8000,
"retries": 8,
"video": true,
"videoUploadOnPasses": false,
"chromeWebSecurity": false,
"reporter": "junit",
"ignoreTestFiles": "**/examples/*.js",
"reporterOptions": {
"mochaFile": "results/TEST-[hash].xml"
}
}
Popcat 貓貓點擊大賽參戰確認!!! 一個最簡單的測試腳本如下:
context("popcat.spec", () => {
beforeEach(() => {
Cypress.on("uncaught:exception", (err, runnable) => {
return false;
});
cy.visit("https://popcat.click/");
});
describe("貓貓點擊大賽", () => {
it("點 1000 下", () => {
Array(1000)
.fill("val")
.forEach((elm, index) => {
cy.wait(100 * ((index % 5) + 1));
cy.get(".cat-img").click();
});
});
});
});
cy.visit()
模擬瀏覽器開啟網站cy.wait()
模擬等待cy.get()
類似 jQuery 的選擇器,可以協助我們找出網頁元素學前端這麼多年,第一次覺得派上用場 ? 在台灣,每秒鐘都有上萬隻貓正在張開嘴巴。
這個部分其實就會使用到 Chrome 的開發者元件,透過檢視,我們可以發現主要的網站很單純沒有太多設計,我們就只要針對 .cat-img
這個 class 進行模擬點擊就可以了,甚至是沒有針對直接對整個網頁觸發鍵盤事件也會有效果。
參戰最簡單的方法其實就是透過 console 來執行,不過這次是想透過測試工具 XD 至於如何使用 Chrome 開發者工具歡迎參考之前寫過的文章,相信可以快速入門的。
var event = new KeyboardEvent("keydown", {
key: "t",
ctrlKey: true,
});
setInterval(function () {
document.dispatchEvent(event);
}, 500);
可以發現是 API 主要步驟有兩個
相關 API
如果短時間打太頻繁其實也是會被阻擋:
提醒大家運動家精神 XD
重複的執行也是會得到 403 的錯誤,這時候需要把整個測試關掉重開。
CI/CD 在 Linux 環境上執行 Cypress 時會需要先安裝 Xvfb 但在執行上有時候會遇到問題,可以透過以下指令排解。