RoR – Επιτάχυνση των tests

Όταν τρέχουμε τα tests μας, χρειάζονται κάποια δευτερόλεπτα ώστε αυτά να ξεκινήσουν να τρέχουν (τουλάχιστον αυτό συμβαίνει όταν χρησιμοποιούμε RSpec). Ο λόγος είναι ότι για να τρέξουν τα tests χρειάζεται να φορτωθεί στη μνήμη ολόκληρη η εφαρμογή μας.

Χρησιμοποιώντας το Spork

Ένας τρόπος να επιταχύνουμε αυτή τη διαδικασία είναι με τη χρήση του Spork. Για να χρησιμοποιήσουμε το Spork θα πρέπει να φορτώσουμε τα κατάλληλα gems στο gemfile μας.

group :development, :test do
  ...
  gem 'spork-rails'
end

Χρησιμοποιούμε το gem ‘spork-rails’ αντί του ‘spork’, γιατί ενώ το Spork υποστηρίζει διάφορα frameworks, η υποστήριξη για Rails αφαιρέθηκε.

Στη συνέχεια τρέχουμε:

bundle install
bundle exec spork --bootstrap

Πριν συνεχίσουμε θα πρέπει να φτιάξουμε τα configuration αρχεία. Για παράδειγμα, αν χρησιμοποιείτε RSpec ως test framework, στο αρχείο /spec/spec_helper.rb θα έχουν προστεθεί αυτόματα 2 block από το Spork. Θα πρέπει να μοιράσουμε τα προυπάρχοντα settings του αρχείου σε αυτά τα 2 blocks. Το πιο εύκολο είναι να τα βάλουμε μέσα στο block Spork.prefork.

Τέλος, για να ολοκληρώσουμε θα πρέπει να τρέξουμε την εντολή ‘spork’. Πριν την τρέξουμε όμως μπορούμε αν θέλουμε να χρονομετρήσουμε τα tests μας για να δούμε τη διαφορά. Για να χρονομετρήσουμε χρησιμοποιούμε την εντολή time, π.χ. ‘time bundle exec rspec’. Αφού ξεκινήσουμε το Spork, μπορούμε να ξανατρέξουμε τα tests και να δούμε πόσο πιο γρήγορα είναι.

Guard και Spork μαζί

Αν χρησιμοποιούμε το Guard για αυτοματοποίηση των tests, τότε για να συνεργαστούν Guard και Spork θα πρέπει να προσθέσουμε άλλο ένα gem.

gem 'guard-spork'

Στη συνέχεια τρέχουμε:

bundle install
bundle exec guard init spork

Αυτό θα προσθέσει κάποια πράγματα στο Guardfile, που αν θέλουμε μπορούμε να τροποποιήσουμε (π.χ. να βάλουμε να ξεκινάει το Spork αυτόματα όταν θα ξεκινάμε το Guard).

Έτσι, έχοντας Guard και Spork εγκατεστημένα μπορούμε να βελτιώσουμε και να επιταχύνουμε το περιβάλλον ανάπτυξής μας, αλλά και ουσιαστικά να κάνουμε τη χρήση tests πιο εύκολη.

RoR – Αυτοματοποίηση των tests

Αν θέλουμε να αποφύγουμε, κάθε φορά που θέλουμε να τρέξουμε τη σουίτα των tests μας, να γυρίζουμε σε γραμμή εντολών, μπορούμε να το γλιτώσουμε με τη βοήθεια του “Guard“. Το Guard έχει την δυνατότητα όχι μόνο να τρέχει αυτόματα τα tests μας κάθε φορά που κάνουμε κάποια αλλαγή σε ένα αρχείο, αλλά και να τρέχει μόνο εκείνα τα tests που αντιστοιχούν στον αλλαγμένο κώδικά μας.

Αρχικά πρέπει να προσθέσουμε στο Gemfile το κατάλληλο gem. Θεωρώντας ότι χρησιμοποιούμε RSpec αντί Test::Unit προσθέτουμε το ‘guard-rspec’ (αλλιώς σκέτο ‘guard’) στο group ‘development’:

group :development do
  gem 'guard-rspec'
end

Σύμφωνα με το Rails Tutorial, πρέπει επίσης να προσθέσουμε κάποια ακόμα gems κάτω από το group ‘test’, ανάλογα με το λειτουργικό μας. Εφόσον χρησιμοποιούμε Rails 4 (για παλιότερες εκδόσεις είναι λίγο διαφορετικά) προσθέτουμε:

  • Σε Linux:
    group :test do
      gem 'libnotify'
    end
    
  • Σε Windows:
    group :test do
      gem 'rb-notifu'
      gem 'win32console'
      gem 'wdm'
    end
    
  • Σε OS X:
    group :test do
      gem 'growl'
    end
    

Στη συνέχεια τρέχουμε:


bundle install
bundle exec guard init rspec

Μπορούμε αν θέλουμε να τροποποιήσουμε το παραγόμενο ‘Guardfile’. Για να μην τρέχουν όλα τα tests κάθε φορά μπορούμε να προσθέσουμε (πάντα στη περίπτωση που χρησιμοποιούμε  RSpec αντί Test::Unit):

guard 'rspec', all_after_pass: false do
...
end

Εν τέλει τρέχουμε:


bundle exec guard

Έτοιμοι!

RoR – Χρήση RSpec αντί Test::Unit

Αν θέλετε σε ένα καινούριο project με Ruby on Rails να χρησιμοποιήσετε ως testing framework το RSpec αντί του Test::Unit μπορείτε κατά τη δημιουργία απλά να πληκτρολογήσετε:


rails new my_app --skip-test-unit

Σε αυτή την περίπτωση δε θα δημιουργηθεί ο φάκελος ‘test’. Αν έχετε ήδη δημιουργήσει ένα project μπορείτε βέβαια να σβήσετε το φάκελο ‘test’ (προσοχή μη χάσετε υπάρχοντα tests). Στη συνέχεια χρειάζεται να προσθέσουμε στο Gemfile στο group ‘development’ και ‘test’ το εξής:


gem 'rspec-rails'

Μετά τρέχουμε διαδοχικά:


bundle install
rails generate rspec:install

Είμαστε πλέον έτοιμοι!