CSS回归测试

原文地址,未经作者确认或授权的翻译版本。

摘要

从CSS3开始,自适应设计会推动视觉和CSS测试的进展,PhantomCSS 是众多支持这个UI测试改变的新工具的一员。

为什么?

无论有没有样式规范,我们都在进行视觉测试。执行一次人工测试还可以接受,那不断重复的呢?对于一个丰富的界面设计,一个自适应设计或者一个复杂的应用,人工回归测试的风险和消耗会更高。没有人愿意因为一些padding改变就对一个页面做对于不同视窗大小的重新测试。

一些长期项目很快就仅仅因为修改CSS而不影响现有布局的困难而变的越来越组织混乱与庞大。CSS的延展性,修改、添加或者删除样式的能力是至关重要的。只有人工测试的CSS重构是不恰当的,CSS自动测试可以使CSS重构变得更轻松。

CSS可回归性是比较难来定位的,一些情况是由于对设计无感,更多的是因为被破坏的页面当前没有处于开发阶段。自动测试才能更快更简单的发现这些回归测试点。

有一些对于CSS测试的错误概念,认为使用XPath或者CSS选择进行一些元素存在的断言就达到了样式测试的目的。仅仅因为.red-button存在,不一定意味着它是可见的,也不一定就能断定这个按钮是红色的。button {background:blue !important}可以很容易改变它的颜色。同样的selenium.isVisible("*[cantains(@class "red-button")]")也不能证明这个元素是可见并且样式准确;这只是证明了此元素不含有display:none这样的样式,但是没有办法考量z-index或者位置。做样式测试不仅仅是做HTML标记的断言。

怎么做?

要进行CSS自动测试,有两种方式。第一种是截屏比对;第二种通过JavaScript调用window.getComputedStyle()获取计算后的样式并进行断言。这两种各有明显的优势和不足。 第二种方式强绑定了实现,从而变得可能比较脆弱。 第一种方式离设计太近了,当页面中有可变内容时就会有问题。

作者更倾向与截屏比对;它的测试基于用户所见而不是用户所见的抽象。对于可变性的问题,有两种解决方案。第一种是不要测试页面自身,而是测试页面的静态版本,使用一样的CSS,不同但是不变的内容。针对内容发布的不同形式,每次测试可以通过数据库配置来实现,使用JavaScript来Mock API返回的结果,或者在CMS中做一个只有固定数据的分枝可以达到此目的。如果你足够幸运,有一份在线样式规范(例如,使用生产环境的CSS生产的HTML),那么强烈建议可以只使用这个进行测试。

PhantomCSS介绍

PhantomCSS 是一个命令行工具,作者为了基于截屏比对的CSS测试而开发了它,并且使用PhantomJSCasperJS为Huddle提供了功能测试套件。为了使对UI的隔离的测试,作者Mock掉了ajax请求。在功能测试中国年对UI的完全控制,使得视觉测试变得相对简单。

下面是使用PhantomCSS进行测试的一个样例

casper.
  start("https://my.testpage.com").
  then( function should_look_like_this(){
    phantomCSS.screenshot('.my-css-selector');
  }).
  then( function user_clicks_link(){
    casper.page.sendEvent('click', 10, 10);
  }).
  then( function should_look_different_than_before(){
    phantomCSS.screenshot('.my-css-selector');
  }).
  then( function now_check_the_screenshots(){
    phantomCSS.compareAll();
  });

上面的代码对一次点击事件页面的改变进行了测试。它生成了对于页面的一部分的截屏,使用CSS选择器.my-css-selector进行定义。每次运行时,都会生成一个截屏,与原截屏进行比对。一般不会有什么区别,如果有,PhantomCSS会生成一个diff图片来反馈。下面的图片展示了一个失败的测试的三个截屏。

image.png

失败的图片显示出因为字体大小的不同而产生的一些差异,Click me的竖直方向的对齐也有一些问题。图片使用粉色标识出了区别。

通过PhantomCSS,可以发现一些问题。开发团队通过视觉测试以及在不同设备上的基线截屏,可以发现因为反锯齿、原生表单域以及CSS animation 以及transition而造成的样式不同。不同的操作系统和设备都可能造成测试失败。PhantomCSS在图片比对时可以忽略反锯齿、忽略动画或者隐藏有问题的元素。

其他

PhantomCSS不是CSS回归测试唯一可选的工具,作者也强力推荐下面的这些。

GhostStory, Cactus, Needle, CSSCritic, fighting-layout-bugs, sikuli, Mogo

未来

由于Ajax以及重JS客户端的SPA的出现,作者认为没有测试的富交互应用变得非常不可靠。自动视觉回归测试变得很重要,且迫切需要。随着Web技术的发展,作者很确信视觉测试的工具也会随之演进和应用。而且我们不应该只关心界面,对于CSS3的keyframe animation, canvas, WebGL又怎么办呢。作者认为Web前端的变革,必然带来Web UI测试的变革。

本人感想

本人也算经历了很多Web UI端的开发工作,Web自动化测试时Web开发必不可少且越发重要的一环,这点时毋庸置疑的。不过视觉回归测试、视觉还原度测试倒是未曾经历过,这个观点提出了也有几年了,未曾听任何业内人士说起过,不知是自己孤陋寡闻还是这个概念已经落伍。

现在看起来视觉回归测试、诗句还原度测试。对某些应用可能是可行的,例如某些前端制图软件,某些大数据,地图相关报表软件。还是可能期望对视觉还原后的效果有所限制的。

这样的一个观点现在才听说,竟然觉得还有些新颖,也是醉了。

以上。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,728评论 1 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,506评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,024评论 4 62
  • 有幸看到一本泰食有关的日文书,虽然文字大部分看不懂,但色彩洋溢的图片着实诱惑到了我。于是决定去吃一吃。盼望着,盼望...
    眉沁绿阅读 812评论 1 3
  • 去年7月买的书,只看了一次,这一次因为百日挑战的计划,重新整理,再一次发现错过很多知识,话不多说,看看自己究竟学到...
    海豚的世界阅读 915评论 2 3