🚀  Our new eBook is out – “CI/CD for Monorepos.” Learn how to effectively build, test, and deploy code with monorepos. Download now →

Exploring CasperJS and Continuous Integration

All Ruby developers are probably familiar with Capybara – the tool for interacting with web pages that we all use and love. A similar thing exists in the JavaScript world – CasperJS.

CasperJS is a navigation scripting and testing utility for PhantomJS.

Since the setup is really simple, I wondered if CasperJS can be used for testing a Rails application and more so, how hard it is to run those tests on Semaphore.

Simple example

Here is a single test that visits the posts page and checks if everything is in order:

javascript
// test/javascripts/posts.js
casper.test.begin('Posts', 2, function suite(test) {
  casper.start("http://0.0.0.0:3000/posts", function() {
    test.assertTextExists("Posts");
    test.assertTextExists("Here you can find all posts");
  });

  casper.run(function() {
    test.done();
  });
});

The full example repository can be found here.

Semaphore setup

The setup includes a few steps:

– preparing the Rails application
– installing CasperJS (PhantomJS is already available on Semaphore)
– loading test data
– running the Rails application server
– executing CasperJS tests

This translates nicely into several Semaphore build commands:

bundle install --deployment --path vendor/bundle
bundle exec rake db:setup
bundle exec rake db:test:prepare
git clone git://github.com/n1k0/casperjs.git ~/casperjs
cd ~/casperjs
sudo ln -sf pwd/bin/casperjs /usr/local/bin/casperjs
cd -
bundle exec rails server -p 3000 -e test &
sleep 30 # wait for server to run
casperjs --direct test test/javascripts/posts.js

Result

The result looks pretty green:

It’s worth noting that in this setup CasperJS tests don’t run in isolation: there are no database transactions so state persists across the whole test suite.

The right tool for the job

Is CasperJS a good fit for testing Rails applications on Semaphore? Probably not… There are other tools that can serve that purpose. But if you are looking for a tool for smoke testing a live instance of your app or you are more into JavaScript than Ruby, CasperJS is worth looking into.

If you do want use CasperJS in a Rails project, consider crafting a Rake task that can serve a similar purpose as the build commands from above.

What cool and unusual tools are you using in your project? Anything interesting in your Semaphore build commands? Let us know!

Have a comment? Join the discussion on the forum