Email Subscription Form

Saturday, February 15, 2020

Why I'll Be Using Cypress For UI Automation

I've mentioned in previous posts that I don't do much UI automation.  This is because the team projects I am currently on have almost no UI, and it's also because I'm a strong believer that we should automate as much as we can at the API level.  But I had an experience recently that got me excited about UI testing again!

I was working on a side project, and I needed to do a little UI automation to test it out.  I knew I didn't want to use Selenium Webdriver, because every time I go to use Webdriver I have so much trouble getting a project going.  Here's a perfect example: just one year ago, I wrote a tutorial, complete with its own GitHub repo, designed to help people get up and running with Webdriver really quickly.  And it doesn't work any more.  When I try to run it, I get an error message about having the wrong version of Chrome.  And that is why I hate Webdriver: it always seems like I have to resolve driver and browser mismatches whenever I want to do anything.



So instead of fighting with Webdriver, I decided to try Cypress.  I had heard good things about it from people at my company, so I thought I'd try it for myself.  First I went to the installation page.  I followed the directions to install Cypress with npm, and in a matter of seconds it was installed.  Then I started Cypress with the npx cypress open command, and not only did it start right up, I also got a welcome screen that told me that there were a whole bunch of example tests installed that I could try out!  And it automatically detected what my browser was, and set the tests to run on that version!  When I clicked on the Run All Tests button, it started running through all the example tests.  Amazing!  In less than five minutes, I had automated tests running.  No more Chrome version must be between 71 and 75 messages for me!

The difference between Cypress and Webdriver is that Cypress runs directly in the browser, as opposed to communicating with the browser.  So there is never a browser-driver mismatch; if you want to run your tests in Firefox, just type npx cypress run --browser firefox, and it will open up Firefox and start running the tests.  It's that easy!  In comparison, think about the last time you set up a new Webdriver project, and how long it took to find the Firefox driver you needed, install it in the right place, make sure you had the PATH configured, and reference it in your test script.

Here are some other great features of Cypress:

  • There's a great tutorial that walks you through how to write simple tests.
  • Every test step has a screenshot associated with it, so you can scroll back in time to see what the browser looked like at each step.
  • Whenever you make a change to your test and save, the test automatically runs in the browser.  You don't need to go back to the command line and rerun a command.
  • You don't have to act like a user.  For example, you can make a simple HTTP request to get an authentication token instead of automating the typing of the username and password in the login fields.  
  • You can stub out methods.  If you wanted to test what happens when a certain request returned an error, you can create a stub method that always returns an error and call that instead of the real method.
  • You can mock HTTP requests.  You can set an HTTP request to return a 404 and see what that response looks like.
  • You can spy on a function to see how many times it was called and what values it was called with.
  • You can manipulate time using the Clock method- for example, you can set it to simulate that a long period of time has elapsed in order to test things like authentication timeouts.
  • You can run tests in parallel (although not on the same browser), and you can run tests in a Continuous Integration environment.

In addition, the Cypress documentation is so clear!  As I was investigating Cypress, it was so easy to find what I was looking for.  

If you are tired of fighting with Webdriver and are looking for an alternative, I highly recommend that you try Cypress.  In less than ten minutes, you can have a simple automated test up and running, and that's a small investment of time that can reap big rewards!


10 comments:

  1. Cypress is an amazing tool and their documentation is one of the best I've seen!

    ReplyDelete
  2. I like it as well. About parallelization, I’ve used CI to spin up containers in parallel, and there are npms to aggregate their reports

    ReplyDelete
    Replies
    1. can you please elaborate hiw you achieved it.Better if you can create a post and provide a link. thanks

      Delete
  3. Hi, Kristin! I've started learning test automation recently with Capybara (which is a Selenium and Ruby framework as far as I'm concerned) and I have already faced some of the problems you listed.
    Would you recommend newbies learning Cypress first instead of Selenium?

    ReplyDelete
    Replies
    1. Hi Claudio! I can't say definitively, since I only have about an hour of experience with Cypress so far. But so far it looks like a much better starting point for people who are new to UI automation.

      Delete
  4. This comment has been removed by the author.

    ReplyDelete
  5. I've also started using Cypress and have had a great experience so far. The documentation is really good. Also, I love the built-in support for making http requests from within tests. Makes simplifying workflows like Logins very easy.

    ReplyDelete
    Replies
    1. I'm looking forward to trying out the http request functionality in Cypress, and it will be the subject of a future blog post!

      Delete
  6. Thanx a lot! Can't wait for next post about Cypress exploration

    ReplyDelete
  7. I'm glad you liked this post, Valeriya! You can read my latest post on Cypress here: http://thethinkingtester.blogspot.com/2020/02/more-fun-with-cypress.html

    ReplyDelete

Book Review: Perfect Software and Other Illusions About Testing

"Perfect Software and Other Illusions About Testing", by Gerald Weinberg, is the best book on testing I have ever read.  It is a m...