Automating CSS Regression Testing

The following is a guest post by Garris Shipon . We‘ve touched on the four types of CSS testing here before. Regression testing is the hardest. It‘s the type where you‘re trying to test if a change you made to CSS resulted in any unexpected visual problems. This is made more difficult with responsive designs. Garris built a tool for doing this as he embarked upon a new responsive design for a large scale site. Here, he‘ll walk you through the whole thing.

Why CSS testing?

Do a search for CSS regression testing and a common theme becomes clear – breaking CSS is easy, testing it is hard. This was the case at the onset of a large responsive refactoring project I scoped earlier this year for Art.com.

Like many other established web companies, Art.com is in the process of adding responsive behavior to its massive e-commerce web app, which was originally designed for 1024px desktop screens.

I realized this would be a big and delicate job. Adding multiple breakpoint behaviors which (by their very nature) are mostly off-screen at any point in time means we would have a lot of hard-to-find errors. We needed a way for our engineers to automate bug discovery before slamming our QA process with hundreds of ticky-tacky little layout issues (which would all need to be documented, tracked and fixed).

CSS testing options

Looking at existing options for CSS regression coverage, I discovered that most came with a lot of integration overhead. To me, these solutions seem more geared for QA engineers who are focused exclusively on testing. These testing apps have deep and wide coverage potential but are too complex and bulky for most UI engineers to easily integrate into their development process.

The solution I wanted would be easy to install locally, use familiar syntax and give us a reasonable amount of confidence that a selector change I make for mobile isn‘t going to result in a hard-to-find bug in my desktop layout.

Of the existing solutions, the one which had the most potential for my needs was phantomCSSwritten by James Cryer . This is an awesome tool for visually testing complex UI module interaction states, but it requires full-on CasperJS scripting which is still unnecessarily cumbersome for testing large sets of static CMS templates at different screen dimensions.

This situation was the impetus for creating BackstopJS , which is essentially a wrapper forResembleJS (also written by James Cryer ) that enables an easy-to-configure visual regression test matrix across multiple URLs, page elements and screen sizes.

The following is a 15 minute walk-through of an installation and initial configuration of BackstopJS.

Installation

BackstopJS can be downloaded as a .zip file from GitHub, but it‘s best to install it using the super useful Bower package manager . The rest of the instructional will be based on the Bower install and a simple demo project (download zip), which is taken directly directly the Bootstrap example page .

Node and the NPM package manager are foundational dependencies also required for the rest of the install. It‘s possible you already have these installed (from other projects). If not, I‘d really recommend you to learn more . There are really amazing developments going on in this ecosystem!

Expand the simple demo

Lets start by downloading the demo project files . Or, you can use your own active project. We will install the testing framework right into here:

Install BackstopJS with Bower & NPM

Go to your project root, in this case: myCoolProject

$ cd ~/path-to-myProjects/myCoolProject
$ bower install backstopjs

Your directory should look like this:

Install dependencies

So far so good, you now have BackstopJS scaffolding, but there are some super useful packages that BackstopJS depends on so we need to install those.

Install local dependencies with NPM

Node and the NPM package manager and required for the rest of the install.

$ cd bower_components/backstopjs
$ npm install

If you don‘t already have a global Gulp instance...

Gulp is a great system for enabling various task automation. It‘s great for project building, asset minification, CSS preprocessing etc. It is a more functional way of tackling the kinds of tasks Grunt became popular for.

$ sudo npm install gulp -g

If you don‘t already have a global PhantomJS install...

Well then, this is your lucky day! PhantomJS is a headless web browser. It does everything a web browser does, except display content to the screen.

$ sudo npm install phantomjs

If you don‘t already have a global CasperJS install...

Then don‘t miss this. CasperJS ( installation docs ) does for headless web clients what jQuery did for DOM selection.

$ sudo npm install -g casperjs

Install complete!

Still with me? If you have made it this far then you have (among other things) some badass CSS regression testing ingredients. Lets see what we can do.

Generate a test configuration template

From the myCoolProject/bower_components/backstopjs directory:

$ gulp genConfig

This will generate a boilerplate JSON configuration file for you at the root of your project e.g. `myCoolProject/backstop.json`. This is where you can specify the URL‘s, selectors to test and at which breakpoints you want to test them at.

{
  "viewports" : [
    {
     "name": "phone",
     "viewport": {"width": 320, "height": 480}
    }
    ,{
     "name": "tablet_v",
     "viewport": {"width": 568, "height": 1024}
    }
    ,{
     "name": "tablet_h",
     "viewport": {"width": 1024, "height": 768}
    }
  ]
  ,"grabConfigs" : [
    {
      "testName":"http://getbootstrap.com"
      ,"url":"http://getbootstrap.com"
      ,"hideSelectors": [
      ]
      ,"removeSelectors": [
        "#carbonads-container"
      ]
      ,"selectors":[
        "header"
        ,"main"
        ,"body .bs-docs-featurette:nth-of-type(1)"
        ,"body .bs-docs-featurette:nth-of-type(2)"
        ,"footer"
        ,"body"
      ]
    }
  ]
}

In this configuration you can see three viewports objects, one for phone , tablet vertical andtablet horizontal , each with a name and a viewport property. You can add as manyviewports objects as you need. BackstopJS requires at least one .

Then we have grabConfigs . This specifies the URLs and element selectors that BackstopJS will test. The selectors generally accept standard CSS selector notation. It‘s useful to think of everygrabConfigs object as a test for a specific static page or global app state. Here too, you can add as many grabConfigs objects as you need. BackstopJS requires at least one .

You may notice that in this config, our URL is pointing to http://getbootstrap.com (the homepage of the Bootstrap design component library) and that is what we would see if we were to run our test now. This is here to illustrate that BackstopJS can point to local or remote URLs so it‘s easy to imagine repurposing the same tests for local development, QA, staging and production environments.

Modify the configuration template

For our demo we want to test our local project file, so please make the following change replacing the grabConfigs node in `myCoolProject/backstop.json`.

,"grabConfigs" : [
  {
    "testName":"http://getbootstrap.com"
    ,"url":"../../index.html"
    ,"hideSelectors": [
    ]
    ,"removeSelectors": [
    ]
    ,"selectors":[
      "nav"
      ,".jumbotron"
      ,"body .col-md-4:nth-of-type(1)"
      ,"body .col-md-4:nth-of-type(2)"
      ,"body .col-md-4:nth-of-type(3)"
      ,"footer"
    ]
  }
]

generating (or updating) reference screenshots

From the `myCoolProject/bower_components/backstopjs` directory:

$ gulp reference

This task will create a (or update an existing) bitmaps_reference directory with screen captures representing all specified selectors at every breakpoint. Take a look inside `bower_components/backstopjs/bitmaps_reference`:

So far so good. We now have our reference set. Now lets run a test!

Running our first test

We are about to run our first test. But keep in mind, we haven‘t changed anything in our project yet. So our tests should pass.

From the `myCoolProject/bower_components/backstopjs` directory:

$ gulp test

This task will create a new set of images in `myCoolProject/bower_components/backstopjs/bitmaps_test/<timestamp>/`.

Once the test images are generated, a web browser should open and a report comparing the most recent test bitmaps against the current reference images will run. Significant differences will be detected and shown.

Test screen shots should have been generated and a clean test report should be displayed. Now let‘s try changing our CSS and see what happens.

Updating our index file and running our second test

Open our test file at `myCoolProject/index.html` and add the following code somewhere in the<head> tag of the markup:

<style>
  .jumbotron {
    padding: 0px;
  }
</style>

Now, From the `myCoolProject/bower_components/backstopjs` directory.

$ gulp test

Our test should run again and errors should be found, scroll the report down to see a visual diff of the problems.

Our visual diff contains the reference capture, the most recent test capture and the visual diff file.

And there you have it – regression found!

This is a very simple example. In real life, designers and engineers may find themselves working on very complex responsive layouts. That is when a system like this really provides value. By automating the repetitive tasks we can move our CSS projects forward by focusing on more complex and creative tasks that can‘t be automated.

There are a lot of things I can imagine for BackstopJS to satisfy more use cases, here are a few obvious ones I would love to have for myself:

  • A UI for managing multiple config profiles and associated reference data.
  • Firefox and IE rendering
  • Currently, screenshots are executed when the native document ready event is fired, it would be more useful if we could specify a custom ready event for things like web apps that may be making Ajax calls or running some other async process before the display can be fully rendered.
  • A much easier install process

    来源: http://www.tuicool.com/articles/qeeIrqr

时间: 2024-10-16 16:04:00

Automating CSS Regression Testing的相关文章

Web自动化测试工具调研

背景 Web自动化测试越来越被重视, 因为现在Web已经是工程化的状态. 如何通过工具测试, 保证Web开发的质量,提升开发效率,是Web工具的诞生的来由. Web测试分为以下几个方面: 1. 界面测试 测试界面是否正常,这是前端测试最基础的环节. 2. 功能测试 测试功能操作是否正常,由于涉及交互,这部分测试比界面测试会更复杂 3. 性能测试 页面性能越来越受到关注,并且性能需要在开发过程中持续关注,否则很容易随着业务迭代而下降. 4. 安全性测试 测试Web界面和WebServer的安全性,

用CSS制作伪标签云

performance testing stress testing conformance testing acceptane testing smoke testing regression testing white box testing system testing black box testing load testing compatibility testing unit testing 这就是我们要制作的标签云效果. HTML代码 <ul class="cloud&qu

CSS选择器的优化

前面花了几个篇幅着重介绍了CSS的选择器的使用,我将其分成三个部分:CSS3基本选择器.CSS3属性选择器详解以及CSS3伪类选择器详解.那么今天我主要想和大家一起来学习——CSS选择器方面的性能优化.因为对性能这一块一直都是很弱的,所以今天先从选择器开始入手,加强自己.如果你也感兴趣那就跟我一起来吧. 浏览器如何识别你的选择器 首先我们需要清楚,浏览器是如何读取选择器,以识别样式,并将相应的样式附于对应的HTML元素,达到美化页面的效果.Chris Coyier曾在<Efficiently R

selenium docs

Note to the Reader - Docs Being Revised for Selenium 2.0! Introduction Test Automation for Web Applications To Automate or Not to Automate? Introducing Selenium Brief History of The Selenium Project Selenium’s Tool Suite Choosing Your Selenium Tool S

性能工具列表

Load and Performance Test Tools BrowserMob- On-demand, self-service, low-cost, pay-as-you-go service enables simulation of large volumes of real browsers hitting a website. Utilizes Amazon Web Services, Selenium. Uses real browsers for each virtual u

Java开源项目(备查)

转自:http://www.blogjava.net/Carter0618/archive/2008/08/11/221222.html Spring Framework  [Java开源 J2EE框架] Spring 是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯.Spring的架构基础是基于使用JavaBean属性的 Inversion of Control容器.然而,这仅仅是完整图景中的一部分

15款加速 Web 开发的 JavaScript 框架

JavaScript 可以通过多种方式来创建交互式的网站和 Web 应用程序.利用 JavaScript,可以让你移动 HTML 元素,创建各种各样的自定义动画,给你的访问者更好的终端用户体验. 对于开发人员你来说,有无数的 JavaScript 框架可选择,往往是很难选择最适合您需要的.所以在这篇文章中,我收集了15个有用的和流行的 JavaScript 框架,旨在简化前端应用程序开发. 您可能感兴趣的相关文章 期待已久的2013年度最佳 jQuery 插件揭晓 小伙伴们都惊呆了!8个超炫的

Assignment3:白盒测试以及测试框架简介

一. 白盒测试简介 白盒测试又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试.白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的."白盒"法全面了解程序内部逻辑结构.对所有逻辑路径进行测试."白盒"法是穷举路径测试.在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据.贯穿程序的独立路径数是天文数字. 采用什么方法对软件进行测试呢?常用的软件测试方法有两大类:静

Jmeter3.0新特性

2016-5-19昨日,Jmeter又更新了新版本. 那么新版本有哪些新特性呢? Changes This page details the changes made in the current version only. Earlier changes are detailed in the History of Previous Changes. Version 3.0 Summary New and Noteworthy Known bugs Incompatible changes B