1. 程式人生 > >ant design pro (十二)advanced UI 測試

ant design pro (十二)advanced UI 測試

一、概述

原文地址:https://pro.ant.design/docs/ui-test-cn

UI 測試是專案研發流程中的重要一環,有效的測試用例可以梳理業務需求,保證研發的質量和進度,讓工程師可以放心的重構程式碼和新增功能。

Ant Design Pro 封裝了一套簡潔易用的 React 單元測試和 E2E 測試方案,在專案根目錄執行以下命令就能執行測試用例。

npm run test:all  # 執行所有測試

二、詳細

2.1、單元測試

單元測試用於測試 React UI 元件的表現。我們參考了 create-react-app,使用 jest

 作為測試框架。

jest 是一個 node 端執行的測試框架,使用了 jsdom 來模擬 DOM 環境,適合用於快速測試 React 元件的邏輯表現,需要真實瀏覽器可以參考 E2E 測試部分。

2.1.1、寫一個用例

比如,我們可以建一個檔案 src/routes/Result/Success.test.js 來測試成功頁面元件的 UI 表現。

import React from 'react';
import { shallow } from 'enzyme';
import Success from './Success';   // 引入對應的 React 元件

it('renders with Result', () => {
  const wrapper = shallow(<Success />);                           // 進行渲染
  expect(wrapper.find('Result').length).toBe(1);                  // 有 Result 元件
  expect(wrapper.find('Result').prop('type')).toBe('success');    // Result 元件的型別是成功
});

這裡使用了 enzyme 作為測試庫,它提供了大量實用的 API 來幫助我們測試 React 元件。斷言部分沿用了 jest 預設的 jasmine2 expect 語法

2.1.2、本地執行

使用以下的命令將統一搜索和執行 src 下 *.test.js 格式的用例檔案。 

npm test .test.js

執行單個或一組用例

npm test src/routes/Result/Success.test.js  # 測試 Success.test.js
npm test src/routes                         # 測試 routes 下的所有用例檔案

2.1.3、測試 dva 包裝元件

被 dva connect 的 React 元件可以使用下面方式進行測試。

import React from 'react';
import { shallow } from 'enzyme';
import Dashboard from './Dashboard';

it('renders Dashboard', () => {
  // 使用包裝後的元件
  const wrapper = shallow(
    <Dashboard.WrappedComponent user={{ list: [] }} />
  );
  expect(wrapper.find('Table').props().dataSource).toEqual([]);
});

2.2、e2e 測試

端到端測試也叫冒煙測試,用於測試真實瀏覽器環境下前端應用的流程和表現,相當於代替人工去操作應用。

我們引入了 puppeteer 作為 E2E 測試的工具,puppeteer 是 Google Chrome 團隊官方的無介面(Headless)Chrome 工具。它預設使用 chrome / chromium 作為瀏覽器環境執行你的應用,並且提供了非常語義化的 API 來描述業務邏輯。

2.2.1、寫一個 e2e 用例

假設有一個需求,使用者在登入頁面輸入錯誤的使用者名稱和密碼,點選登入後,出現錯誤提示框。

我們寫一個用例來保障這個流程。在 src/e2e/ 目錄下建一個 Login.e2e.js 檔案,按上述業務需求描述測試用例。 

import puppeteer from 'puppeteer';

describe('Login', () => {
  it('should login with failure', async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.type('#userName', 'mockuser');
    await page.type('#password', 'wrong_password');
    await page.click('button[type="submit"]');
    await page.waitForSelector('.ant-alert-error'); // should display error
    await page.close();
    browser.close();
  });
});

更多 puppeteer 的方法可以參考 puppeteer/docs/api.md

2.2.2、執行用例

執行下列命令將執行 src 下所有的 *.e2e.js 用例檔案。 

npm test .e2e.js

注意,本地測試 e2e 用例需要啟動 npm start,否則會報 Failed: navigation error 的錯誤。

2.3、watch 模式

npm test -- --watch

新增 --watch 配置可以進入 watch 模式,當你修改和儲存檔案時,Jest 會自動執行相應用例。Jest 的命令列工具也提供了各種方便的快捷鍵來執行你需要的用例。

2.4、測試覆蓋率

npm test -- --coverage

新增 --coverage 配置可以顯示專案的測試覆蓋率。

2.5、聚焦和忽略用例

使用 xit() 取代 it() 可以暫時忽略用例,fit() 可以聚焦當前用例並忽略其他所有用例。這兩個方法可以幫助你在開發過程中只關注當前需要的用例。

2.6、接入整合測試服務

如果需要接入 travis、CircleCI、Gitlab CI 等整合測試環境,可以參考本倉庫提供的 .travis.yml

注意 e2e 測試需要整合環境支援 electron,如果不支援,你可以使用 npm test .test.js 單獨執行單元測試。

2.7、參考連結

更多測試技巧和功能請參考以下連結。