摘要:上也有幾個臨時方案,目前我傾向使用自帶的來查看。在打開的測試的瀏覽器中打開切到按下用戶按,輸入,選擇重新刷新并統計代碼執行覆蓋率。那么,起來為了高撩質測量試代碼,起來。
不很久不很久以前
據說某家公司有兩位前端,天天擼bug,為啥嘞?只怪測試MM傾人國,輕語哥哥有bug。?(??????)?? 可是最近兩位有點犯愁 Σ(っ °Д °;)っ。測試MM有幾次提了緊急bug,都在旁邊鼓勵他們改bug了,可是線上bug重現排查比較麻煩,而且改了后還發現沒改好,惹得測試MM潸然淚下,好生埋汰。怎么辦呢?
前端君666某天發現了E2E測試神器cypress后,暗中偷練神功,改bug越來越6,測試MM每天笑著對他說,666你真6,MM好喜歡呀(??? ? ???) 另一位前端君555每天面對堆積如山的bug長吁短嘆,測試MM提完新bug后都不理他了≡ ̄﹏ ̄≡
作為一個追求代碼永無bug、順帶跟測試MM溝通產品的有理想的前端 (? ??_??)?,我覺得有必要學習一下怎么使用cypress來進行E2E測試,以此來提高代碼質量。那么我們來看看怎么入門cypress測試框架。
cypress三問 - 你是誰cypress是在mocha式API基礎上構建的一套開箱可用的E2E測試框架,對比其他測試框架,它提供一套自己的最佳實踐方案,無需其他測試工具庫,配置方便簡單但功能異常強大,可以使用webpack項目配置,還提供了一個強大的GUI圖形工具。入門簡單,上手方便,怎么舒服怎么來呀 (?????)
cypressGUI方式的測試使用真實瀏覽器,非GUI方式使用chrome-headless,不是用模擬方式進行測試,更真實的展現實際環境中的測試過程和結果。
cypress三問 - 你有啥優勢cypress有幾大自帶的強大功能:
自帶GUI工具,想測啥就點啥,還可以查看整個測試過程,想錄屏還可以錄屏喲(錄屏可以發給測試MM看,保準她說哥哥真厲害喲。 一般人我不告訴他?乛?乛?)
測試的每一步都有snapshot,可以通過GUI工具查看每個過程的頁面狀態,不是截圖而是真是的頁面DOM環境喲!
自帶數據mock和請求攔截機制,還原線上數據引起的bug別提有多輕松了
和wepbakc配置,實現無論修改測試文件還是被測試代碼都可以自動重測
小Tips:可以給測試用例加上only或者skip來避免重測測試文件里的所有用例: it.only("只測試這個喲); it.skip("不要測這個");
cypress三問 - 怎么用 安裝yarn add cypress 或者 npm install cypress
安裝完畢后,./node_modules/.bin/cypress install安裝cypress環境(包括GUI工具)
配置package.json: 配置GUI和非GUI(terminal)兩種方式來運行cypress
"scripts": { "cypress": "cypress run", "cypress-gui": "cypress open",
?? 配置好后 先運行 yarn cypress[-gui] 或者 npm run cypress[-gui](中括號意思是可選)來初始化cypress,__生成默認配置和目錄__
cypress.json(與package.json同級目錄): cypress提供比較靈活的配置,可以根據自己需要定制行為,以下列一下我對一個項目的配置
{ "baseUrl": "http://localhost:8080", // 本地開發服務地址(webpack-dev-server) "integrationFolder": "src", // 自定義"src"為測試文件根目錄,默認是"cypress/integration" "testFiles": "**/*.cypress.spec.js", // 自定義測試文件的匹配正則,默認是"**/*.*",即所有文件 "videoRecording": false, // 關閉錄屏功能, 如果開啟錄屏功能,記得將"cypress/screenshots"目錄加入".gitignore",防止不小心將錄屏加到git中 "viewportHeight": 800, // 設置測試環境的頁面視圖的高度 "viewportWidth": 1600 // 設置測試環境的頁面視圖的寬度 }
cypress/plugins/index.js: cypress運行環境配置,可以用來配置webpack等。以下是配置webpack別名范例。默認這里不需要配置。
// 參考官方例子地址 https://github.com/cypress-io/cypress-example-recipes/blob/master/examples/preprocessors__typescript-webpack/cypress/plugins/index.js const wp = require("@cypress/webpack-preprocessor"); const path = require("path"); function resolve(dir) { return path.join(__dirname, "../..", dir); } module.exports = on => { const options = { webpackOptions: { resolve: { alias: { "@": resolve("src"), cypress: resolve("cypress") } } } }; on("file:preprocessor", wp(options)); };萬事俱備,測測測
簡單的一個例子
describe("測試頁面包含某元素", () => { it("有云 "前端哥哥們真帥,前端妹妹們真漂亮"", () => { cy.contains("前端哥哥們真帥,前端妹妹們真漂亮"); }); it("要有一個鏈接", () => { cy.get("a").should("have.length", 1); }); it("不存在class含有abc的元素", () => { cy.get(".abc").should("have.length", 0); }); });
互動的例子
describe("一起動", () => { it("獲取輸入框,輸入文字并按enter鍵", () => { const text = "not exist"; // type api用法: https://docs.cypress.io/api/commands/type.html#Usage cy.get("input").type(`${text}{enter}`); }); it("點擊按鈕", () => { cy.get("button").click(); }); });
網絡請求mock例子
Tip1: cy.route的路徑匹配是嚴格的,所以要注意是否需要加通配符。如 cy.route("/api/search", [])不會攔截/api/search?keyword=abc,只會攔截/api/search。Tip2: cy.route的method要注意,默認是GET,cy.route("/api/posts") 和 cy.route("POST", "/api/posts") 是不一樣的。
describe("要啥給啥", () => { beforeEach(() => { cy.server(); // 一定要在 cy.route 前調用 cy .fixture("/posts/list.json") // 我們在 cypress/fixtures 內創建mock用的數據 .as("postsData"); // 給 mock 數據取別名,以后 cy.route 使用 cy .route("/api/posts", "@postsData") .as("getPostsRoute"); // 給請求取別名,以供 cy.wait 使用 }) it("進入列表頁,攔截列表請求接口", () => { cy.wait("@getPostsRoute"); // 等待被攔截的接口請求完成 cy.get(".post").should("have.length", 10); // 要有10條數據被渲染到頁面上 }); })
實際場景例子: 結合上面所有姿勢,我們現在測試搜索頁面的搜索、操作結果
describe("test search page", () => { // 幾個 route 路徑變量 const searchRoutePath = "/api/items/activities?query=*"; const deleteActivityRoutePath = "/api/activities/*/items/batch?num_iids[]=*"; const undoActivityRoutePath = "/api/activities/*/items/undo"; function search(keyword) { // 將搜索行為和等待搜索返回封裝起來 cy .fixture("items/activities.json") // 處理mock數據,只返回符合搜索結構的數據 .then(data => data.filter(item => item.title.indexOf(keyword) !== -1)) .as("searchResult"); cy.server(); cy.route(searchRoutePath, "@searchResult").as("searchRoute"); const input = cy.get("input"); input.clear(); // 清空輸入框內文本 input.type(`${keyword}{enter}`); cy.wait("@searchRoute"); } before(() => { // 進行所有測試前,先訪問搜索頁 cy.visit("/activities/search"); }); it("should show no data tip when search result is empty", () => { const text = "not exist"; search(text); cy.contains(`沒有找到關于 ${text} 的結果`); }); it("should remove activity from list when clean successful", () => { search("成功"); cy .route("delete", deleteActivityRoutePath, { success: 0, fail: 0, waiting: 0, }) .as("deleteActivityResponse"); // within是讓cy執行的context保持在".activities-search"這個dom節點內 // 默認cy的執行是以上一個cy命令結果作為context // 如 "cy.get("a"); cy.get("span")",cy會在上一個命令找到的"a"標簽中查找"span" cy.get(".activities-search").within(() => { const items = cy.get(".result-item"); items.should("have.length", 1); const applyList = items.get(".apply-list"); applyList.should("not.be.visible"); // 每個數據項內詳細內容區域是隱藏的 const toggleBtn = items.get(".item-apply-count"); toggleBtn.click(); // 點擊顯示詳細內容區 applyList.should("be.visible"); applyList.children().should("have.length", 1); // 詳細內容區內數據只有1條 const cleanBtn = cy.contains("退出"); cleanBtn.click(); // 點擊詳細內容區里的“退出”按鈕 cy.wait("@deleteActivityResponse"); // 等待“退出”請求返回 cy.get(".apply-list").should("be", null); // 退出成功后,詳細內容區數據減1,即空 }); }); });幾個必讀文檔
network-requests : https://docs.cypress.io/guide...
assertions : https://docs.cypress.io/guide...
recipes 示例 : https://docs.cypress.io/examp...
code completion 代碼提示: https://docs.cypress.io/guide...
關于測試覆蓋率目前cypress沒有內置測試覆蓋率統計功能,github上有專門的issue在跟蹤這個,后續應該會有。issue上也有幾個臨時方案,目前我傾向使用chrome自帶的來查看。在GUI打開的測試的瀏覽器中打開devtools,切到Sources, 按下cmd+shift+p(windows用戶按ctrl+shift+p),輸入coverage,選擇重新刷新并統計代碼執行覆蓋率。
那么,high起來為了高(撩)質(測)量(試)代(M)碼(M),high起來。喜歡前端MM的可以手把手教起來了 (¬_¬)
本文章首發于本人公眾號:楓之葉。有興趣的可以長按下方二維碼關注。^v^
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94439.html
摘要:前言官方文檔目前只支持英文,好處是官方入門視頻很多,對于英文水平不好的也很容易入手優缺點優點只要你學好語法上應該不是很大問題獲取類似,對前端同學來說是好處缺點內置的工具集成了谷歌內核,決定你只能是在谷歌瀏覽器上測試,但隨著新版的內核采用內核 前言 官方文檔:https://docs.cypress.io 目前只支持英文,好處是官方入門視頻很多,對于英文水平不好的也很容易入手; 優缺點 ...
摘要:我之前寫過關于的文章,,最近在工作中用到比較多了,頓時覺得確實是比較優秀的一個。 我之前寫過關于cypress的文章,https://segmentfault.com/a/11...,最近在工作中用到cypress比較多了,頓時覺得cypress確實是比較優秀的一個。 1. 軟件安裝. 2. 安裝cypress 安裝cypress客戶端:http://download.cypress...
摘要:是一款開箱即用可以跑在瀏覽器上的測試工具。同樣,測試了也可以直接調試。這個時候我們的測試文件就可以訪問了,點擊之后發現他需要我們編寫測試用例,那么接下來就手把手教你編寫基本的測試用例。 What is E2E? 所謂的E2E就是end-to-end。 假設我們編寫的每個功能程序都是一個黑匣子,最終用戶也只會看到這個黑匣子,那么站在用戶的角度來看并不需要知道這個黑匣子內部是什么東西也不...
摘要:閱讀原文目前測試工具有哪些項目不需要不需要端到端測試一般都需要一個容器,來運行前端應用。向快速,一致和可靠的無剝落測試問好。 閱讀原文 1. 目前E2E測試工具有哪些? 項目 Web Star puppeteer Chromium (~170Mb Mac, ~282Mb Linux, ~280Mb Win) 31906 nightmare Electron 15502 ...
閱讀 3530·2021-11-23 10:10
閱讀 3291·2019-08-30 14:03
閱讀 2065·2019-08-30 13:09
閱讀 3391·2019-08-29 15:29
閱讀 1539·2019-08-29 11:23
閱讀 2001·2019-08-28 18:28
閱讀 2839·2019-08-26 13:34
閱讀 2167·2019-08-26 11:32