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!