BackstopJS

2024-06-27 17:17:24 444
BackstopJS 是一个开源的视觉回归测试工具,用于自动化检测网页或应用程序在代码更改前后的视觉差异。通过捕获页面截图并进行像素对比,BackstopJS 可以帮助开发者发现和修复视觉回归问题,确保应用程序的视觉一致性和用户体验。

特点

  1. 自动化截图:在指定视口和设备配置下自动捕获网页或组件的截图。
  2. 像素级对比:进行像素级别的图像对比,检测视觉变化和回归。
  3. 多视口支持:支持多种设备和浏览器视口,确保跨平台一致性。
  4. 详细报告:生成详细的视觉差异报告,突出显示变化部分,便于审查和修复问题。
  5. 易于集成:与各种 CI/CD 工具和测试框架无缝集成,自动化视觉测试流程。
  6. 灵活配置:通过简单的配置文件自定义测试参数和设置。

使用场景

  1. 视觉回归测试:捕获代码变化前后的视觉差异,防止意外的视觉回归。
  2. 跨设备和浏览器测试:确保应用在不同设备和浏览器上的一致性。
  3. UI 组件库测试:自动捕获和比较 UI 组件的视觉变化。
  4. 自动化测试:集成 CI/CD 工具,自动运行视觉测试,确保持续集成中的高质量交付。

安装方式

使用 npm 安装 BackstopJS:

npm install -g backstopjs

初始化 BackstopJS 配置文件:

backstop init

使用示例

配置文件 (backstop.json)

创建一个 backstop.json 文件,定义测试设置:

{
  "id": "backstop_default",
  "viewports": [
    {
      "label": "phone",
      "width": 320,
      "height": 480
    },
    {
      "label": "tablet",
      "width": 1024,
      "height": 768
    }
  ],
  "scenarios": [
    {
      "label": "homepage",
      "url": "https://example.com",
      "selectors": ["document"],
      "delay": 5000,
      "misMatchThreshold" : 0.1
    }
  ],
  "paths": {
    "bitmaps_reference": "backstop_data/bitmaps_reference",
    "bitmaps_test": "backstop_data/bitmaps_test",
    "engine_scripts": "backstop_data/engine_scripts",
    "html_report": "backstop_data/html_report",
    "ci_report": "backstop_data/ci_report"
  },
  "report": ["browser"],
  "engine": "puppeteer",
  "engineFlags": [],
  "asyncCaptureLimit": 5,
  "asyncCompareLimit": 50,
  "debug": false,
  "debugWindow": false
}

运行测试

  1. 生成参考截图:
backstop reference
  1. 运行测试并比较新旧截图:
backstop test

查看报告

生成的视觉差异报告将存储在 backstop_data/html_report 目录下,可以通过浏览器打开查看。

常用 API 介绍

  1. backstop reference:生成参考截图,用于后续比较。

    backstop reference
    
  2. backstop test:运行测试并比较新旧截图,生成差异报告。

    backstop test
    
  3. backstop approve:如果新截图被批准为正确版本,可以将其更新为参考截图。

    backstop approve
    
  4. viewports:定义要测试的设备和浏览器视口。

    "viewports": [
      {
        "label": "phone",
        "width": 320,
        "height": 480
      }
    ]
    
  5. scenarios:定义要测试的场景,包括 URL、选择器、延迟等。

    "scenarios": [
      {
        "label": "homepage",
        "url": "https://example.com",
        "selectors": ["document"],
        "delay": 5000,
        "misMatchThreshold" : 0.1
      }
    ]
    
  6. misMatchThreshold:设置图像比较时的误差阈值,以容忍微小的视觉变化。

    "misMatchThreshold": 0.1
    
  7. paths:定义存储截图和报告的路径。

    "paths": {
      "bitmaps_reference": "backstop_data/bitmaps_reference",
      "bitmaps_test": "backstop_data/bitmaps_test"
    }
    

高级用法

自定义脚本

可以通过 engine_scripts 配置选项来定义自定义脚本,在捕获截图前执行特定操作,例如模拟用户交互。

"engine_scripts": {
  "onReadyScript": "path/to/onReady.js"
}

onReady.js 中编写脚本:

module.exports = async (page, scenario, viewport, isReference) => {
  await page.click('#someElement');
  await page.waitForSelector('#someOtherElement');
};

集成 CI/CD 工具

以下是一个简单的 GitHub Actions 配置示例,用于集成 BackstopJS 进行视觉测试:

name: Visual Testing

on: [push, pull_request]

jobs:
  visual-tests:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Install BackstopJS
        run: npm install -g backstopjs

      - name: Run visual tests
        run: backstop test

官方资料