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
Video Summary and Transcription
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.
Check out more articles and videos
We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career
Workshops on related topic
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn
Tests rely on many conditions and are considered to be slow and flaky. On the other hand - end-to-end tests can give the greatest confidence that your app is working. And if done right - can become an amazing tool for boosting developer velocity.
Detox is a gray-box end-to-end testing framework for mobile apps. Developed by Wix to solve the problem of slowness and flakiness and used by React Native itself as its E2E testing tool.
Join me on this workshop to learn how to make your mobile end-to-end tests with Detox rock.
Prerequisites- iOS/Android: MacOS Catalina or newer- Android only: Linux- Install before the workshop
1. Welcome to Postman- Explaining the Postman User Interface (UI)2. Workspace and Collections Collaboration- Understanding Workspaces and their role in collaboration- Exploring the concept of Collections for organizing and executing API requests3. Introduction to API Testing- Covering the basics of API testing and its significance4. Variable Management- Managing environment, global, and collection variables- Utilizing scripting snippets for dynamic data5. Building Testing Workflows- Creating effective testing workflows for comprehensive testing- Utilizing the Collection Runner for test execution- Introduction to Postbot for automated testing6. Advanced Testing- Contract Testing for ensuring API contracts- Using Mock Servers for effective testing- Maximizing productivity with Collection/Workspace templates- Integration Testing and Regression Testing strategies7. Automation with Postman- Leveraging the Postman CLI for automation- Scheduled Runs for regular testing- Integrating Postman into CI/CD pipelines8. Performance Testing- Demonstrating performance testing capabilities (showing the desktop client)- Synchronizing tests with VS Code for streamlined development9. Exploring Advanced Features - Working with Multiple Protocols: GraphQL, gRPC, and more
Join us for this workshop to unlock the full potential of Postman for API testing, streamline your testing processes, and enhance the quality and reliability of your software. Whether you're a beginner or an experienced tester, this workshop will equip you with the skills needed to excel in API testing with Postman.
We will cover writing tests, covering every application feature, structuring tests, intercepting network requests, and setting up the backend data.
Anyone who knows JavaScript programming language and has NPM installed would be able to follow along.