Visual Regression tests components via screenshot matching. I'll show how you do that in three different libraries/frameworks. Additionally, I will use Storybook to extract the components from your SPA choice.
Visual Regression with Puppeteer, Playwright and Cypress
AI Generated Video Summary
Hello, I'm Rainer Haneckamp, a trainer and consultant at Angular Architects. In this talk, we'll explore visual regression testing using tools like Puppeteer, Playwright, and Cypress. We'll learn how to use Storybook and Puppeteer with Jest for visual regression testing. We'll also see how Jest and Playwright can be used together for visual regression testing. Finally, we'll discover how to use Cypress for visual regression testing. Thank you for watching!
1. Introduction to Visual Regression Testing
Hello, I'm Rainer Haneckamp, a trainer and consultant at Angular Architects. In this talk, we'll explore visual regression, which involves creating screenshots and comparing them to reference images. Visual regression is crucial for all types of applications, as it impacts the first impression. I'll demonstrate using Puppeteer, Playwright, and Cypress.
Hello, and thank you very much for joining my talk. My name is Rainer Haneckamp. I am from Austria, and I am a trainer and consultant at Angular Architects. So this means I spend most of my time with Angular.
This talk is about visual regression. So this means that we will create automatically screenshots from our application, from our components, and we will match them against existing reference images. This is very similar to what we find with just snapshots, but whereas the snapshots are based on strings, visual regression uses real images.
And as I said before, we are doing a lot of workshops, and every time that I'm introducing this topic, there are two different types of developers. The first type says, well, that's great. I always wanted to see how this works. This is exactly what I needed. And it is very most likely that they are working on UI libraries or that they have applications. There a lot of time is invested into a very attractive design.
The majority though says, well, I'm writing business application or applications, and most of my time I'm using form elements. I'm using grids, and I don't create them by myself. I use already an existing framework like Material Bootstrap or whatever. Why do I have to care about visual regression? If you are sharing this opinion, then just think what happens when you're entering a website and you see that the buttons are overloaded, overflowing, or that the text is overflowing or something like that. Would you really trust this website? Would you really be ready to pay for some of their services? Very likely not. Why? Because the first impression was already a very bad one. And as everywhere in life, first, the first impression really counts. And as it is in applications, the visual part is always the first impression. So don't underestimate that, regardless what type of application you have.
And this is how we are going to do it. I will show you how to do visual regression by using three different libraries, frameworks. I will start with just Puppeteer, then Playwright, and then Cypress. Let's start. Okay, so here we are. This is our application, and what we want to test is this holiday card here. The first action is already that we don't create a screenshot of this URL, because it also contains the side menu here on the left side, the header. And if something changes there, then the test would throw an error, although the holiday card still looks nice.
2. Using Storybook and Puppeteer with Jest
We use Storybook to extract components and show them in an isolated way. Puppeteer allows remote control of a Chromium-based browser for taking screenshots, combined with Jest. The Jest Puppeteer preset configures most things, and we have two important dependencies: Jest Puppeteer and ImageSnapshot.
And because of that, we are using Storybook. Storybook is a library that allows us to extract components out of our application and to present or show them in an isolated way. And this is something that I have already done. So this is the Storybook instance. I can click through the different variations, and that's what I'm going to use for visual regression.
Let's take a quick look into our code, how this can be done. So Storybook requires a default configuration. In my case, this is Angular. I need to define all the dependencies, and then I just create the so-called stories, which are the different variations. And for that I'm used here, a self-written factory method.
So we'll start with Puppeteer. Puppeteer is a library that allows you to remotely control a Chromium-based browser. This also allows you to make screenshots, and that's what we're going to combine here with Jest. You see here that I have already a Jest configuration that has a Jest Puppeteer preset. So everything is already, or most things are already configured by this preset. And in our package JSON we have these two important dependencies. The one is of course Jest Puppeteer along with Puppeteer itself. And the second is ImageSnapshot which is able to do the matching of the two images. And that's everything that we need to do except to write the test.
3. Visual Regression Testing with Jest and PlayWrite
I have prepared a parameterized test using the global page object to open a URL and navigate to my storybook instance. I take screenshots and match them using the ImageSnapshot matcher. When running the test, Jest creates new screenshots if none exist. By changing the CSS, we can compare the reference and current screenshots to identify differences. PlayWrite is similar to Puppeteer and comes with its own testing library. It supports visual regression and allows configuration for multiple browsers. PlayWrite considers cases without a reference image as failures, while subsequent runs only fail if there are real differences.
I have already prepared the test here. This is how it would look like. This is a parameterized test because I am trying all the variations that I have. I am using the global page object to open a URL, navigate to my storybook instance. And once this is done I am creating a screenshot from what I see or what Jest sees and then I just call the matcher to match ImageSnapshot.
Let's run the test and we see that since no screenshots are there yet Jest is creating new ones and we find here this ImageSnapshot directory. If we open it we see the screenshots. Now let's try to change something and verify how it looks. So I am in my CSS of my holiday card and I'm changing it from font weight to normal so from bold to normal. We will see if our test will show us the difference now. We see that a lot of tests failed. Let's verify how we can see this. We find in the ImageSnapshots a further sub directory a div output and that shows us on the left side the reference, on the right side the current one, and in the middle we see the difference.
So the next thing is already PlayWrite. Very quick here. What do we require for PlayWrite or what is it? PlayWrite is very similar to Puppeteer. It can be seen as a rewrite done by Microsoft. It comes with its own testing library and it also supports visual regression out of the box. So we see here the dependency. There's just one package. We have a configuration here. We can define multiple browsers. We also see here WebKit. So this is the test for Safari and then we have the actual test. And as we see here, it looks more or less very similar to what we have seen before with Jest. Now let's run the test here as well. In contrast to Jest or Puppeteer, PlayWrite counts cases where we don't have a reference image yet as a failure. So that's why we see here everything red. When we run it the next time, it will only fail if there is a real difference. And of course, the images are also there.
4. Using Cypress for Visual Regression Testing
To use Cypress for visual regression testing, add the Cypress plugin for snapshots, update the CypressJSON configuration, and run the test. Open the directory, import the snapshot in the support and plugins directories, open the Storybook instance, match the snapshot from the document, and check the image snapshots directory for the result. Thank you for watching and stay tuned for the Q&A.
Just need to open this directory and you see here that it's everything is there. And now to Cypress. Cypress is a very popular end-to-end framework. What we require? Cypress, of course, but also the Cypress plugin for snapshots. We need to add that snapshot in our support directory in the index, just import it. Also do the same in the plugins directory itself. You see it here. And you also want to update the CypressJSON itself. There you need to add the configuration.
What's left? Well, running the test, of course. How does it look like? We're opening the Storybook instance. We're then saying, well, I have the document and I want to match the snapshot from it. Let's try it out. The test is now running. We see the screenshot. We see everything's fine. Let's check for the snapshot itself. It's part here of the image snapshots directory. No surprise. Looks very familiar. And that's it.
So I hope that my talk was useful. Thank you very much, of course, for watching. My source code is available as well. It will be posted afterwards and I'm already looking forward to the Q&A. See you then.