1. 介绍

Backstopjs 是借助一个新的无头浏览器实现的(puppet),用于 UI 自动化还原测试,可以帮助我们将页面与 UI 设计图自动进行对比,标记出差异位置并生成可视化报表。

npm

2. 安装

  1. $ npm i backstopjs
  2. $ yarn add backstopjs -D

3. 初始化

  1. $ backstop init

然后会生成一个文件夹(backstop_data)和一个配置文件(backstop.json)

我们先来看一下配置文件 backstop.json

  1. {
  2. // 项目的名称
  3. "id": "backstop_default",
  4. // 要测试的尺寸
  5. "viewports": [
  6. {
  7. "label": "phone",
  8. "width": 320,
  9. "height": 480
  10. },
  11. {
  12. "label": "tablet",
  13. "width": 1024,
  14. "height": 768
  15. }
  16. ],
  17. "onBeforeScript": "puppet/onBefore.js",
  18. "onReadyScript": "puppet/onReady.js",
  19. // 要测试的项目
  20. "scenarios": [
  21. {
  22. // 页面名称(不能用中文)
  23. "label": "BackstopJS Homepage",
  24. // 模拟 cookie 信息
  25. "cookiePath": "backstop_data/engine_scripts/cookies.json",
  26. // 项目地址
  27. "url": "https://garris.github.io/BackstopJS/",
  28. "referenceUrl": "",
  29. // 直到控制台打印某字符才截屏
  30. "readyEvent": "",
  31. // 等待页面中出现某个元素时才截屏
  32. "readySelector": "",
  33. // 延时指定时间后截屏(毫秒),可以和 readyEvent 同时使用
  34. "delay": 0,
  35. // 要隐藏的元素(比如广告、通知类的元素)
  36. "hideSelectors": [],
  37. // 删除元素
  38. "removeSelectors": [],
  39. // 鼠标 hover
  40. "hoverSelector": "",
  41. // 鼠标 点击
  42. "clickSelector": "",
  43. "postInteractionWait": 0,
  44. "selectors": [],
  45. "selectorExpansion": true,
  46. "expect": 0,
  47. // 允许的偏差度(百分比0.00%-100.00%)
  48. "misMatchThreshold" : 0.1,
  49. "requireSameDimensions": true
  50. }
  51. ],
  52. "paths": {
  53. // 存放美工给你的设计图(用来和你做完的网站对比)
  54. "bitmaps_reference": "backstop_data/bitmaps_reference",
  55. "bitmaps_test": "backstop_data/bitmaps_test",
  56. "engine_scripts": "backstop_data/engine_scripts",
  57. "html_report": "backstop_data/html_report",
  58. "ci_report": "backstop_data/ci_report"
  59. },
  60. "report": ["browser"],
  61. "engine": "puppeteer",
  62. "engineOptions": {
  63. "args": ["--no-sandbox"]
  64. },
  65. "asyncCaptureLimit": 5,
  66. "asyncCompareLimit": 50,
  67. "debug": false,
  68. "debugWindow": false
  69. }

详细的配置说明可以参考开头的链接

4. 例子

下面我们拿腾讯地图为例,做一个简单的例子🌰

配置要测试的响应式尺寸及项目地址

  1. "viewports": [
  2. {
  3. "label": "phone",
  4. "width": 375,
  5. "height": 667
  6. },
  7. {
  8. "label": "tablet",
  9. "width": 1024,
  10. "height": 768
  11. }
  12. ],
  13. ...
  14. "scenarios": [
  15. {
  16. "label": "home",
  17. // 项目地址
  18. "url": "https://map.qq.com/m/",
  19. }
  20. ]

然后将美工给你的设计图放到

./backstop_data/bitmaps_reference 文件夹中

名称的定义比较恶心,我贴一下例子中的名字

  • backstop_default_home_0_document_0_phone.png
  • backstop_default_home_0_document_1_tablet.png

backstop_default 是项目名,对应配置文件中的 id 属性 home 是页面的名称 0 为页面的索引(因为可以配置多个页面,所以需要区分开) document_0_phone 是 viewports 属性的下标(因为要测试多个尺寸,所以也需要区分)

5. 运行

然后我们运行测试一下

  1. $ backstop test

执行完会自动打开测试报告页面

BackstopJs - 图1

可以看到有一项成功,一项失败

BackstopJs - 图2

BackstopJs - 图3

backstop 已经把与设计稿有出入的位置标记出来了

当然实际场景没有这么简单,我们可以通过 backstop 的配置文件来完成更复杂的场景,具体可以参考官方的配置说明 npm