RSpec – czytelna dokumentacja testów
💡

RSpec – czytelna dokumentacja testów

Jeśli jesteś programistą Ruby on Rails, to testowanie jest Twoim chlebem powszednim, jest w Twojej krwi. A może nie miałeś/miałaś jeszcze do czynienia z testami, bo dopiero zaczynasz przygodę z dzieckiem DHH. W każdym razie, mam dla Ciebie wskazówkę, która sprawi, że Twoje testowanie będzie o wiele bardziej czytelne i wygodne. I za każdym razem na hasło RSpec, pomyślisz „czytelna dokumentacja testów”.

Do testowania używam najpopularniejszej biblioteki w świecie RoR – RSpec. Dodatkowo mój setup uzupełnia DatabaseCleaner, ShouldaMatchers i FactoryBotRails.

group :test do
	gem 'rspec-rails',
	gem 'factory_bot_rails'
	gem 'shoulda-matchers'
	gem 'database_cleaner'
end
ENV["RAILS_ENV"] ||= "test"
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'shoulda/matchers'

Dir[Rails.root.join("spec/support/**/*.rb)].each { |f| require f }

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end

Kod, który będziemy testować wygląda następująco:

class Fotballer < ApplicationRecord
	validates :name, presence: true, length: { maximum: 250 }
	validates :surname, presence: true, length: { maximum: 250 }
	validates :club, length: { maximum: 250 }
	validates :nationality, presence: true, length: { maximum: 30 }
end
require 'rails_helper'

RSpec.describe Footballer, type: :model do
	describe "database columns" do
		it { should have_db_column(:name).of_type(:string) }
		it { should have_db_column(:surname).of_type(:string) }
		it { should have_db_column(:club).of_type(:string) }
		it { should have_db_column(:nationality).of_type(:string)
	end
end

Przy podstawowej konfiguracji RSpeca, umieszczonej w pliku spec_helper.rb i wykonywaniu testów konsola nie drukuje nam zbyt czytelnych komunikatów, a śledzenie postępu poszczególnych testów jest niemożliwe. Spójrzmy tylko na to, co otrzymujemy.

image

Co jeśli chcielibyśmy na bieżąco monitorować postęp testów i sprawdzić, co już się wykonało i jest na zielono, a co nie przeszło? Wystarczy lekko zmienić konfigurację RSpeca w spec_helper.rb i ustawić config.color na true i config.formatter na :documentation.

RSpec.configure do |config|
  config.color = true
  config.tty = true
  config.formatter = :documentation
end

Rezultat testów wygląda znacznie lepiej niż poprzednio.

image
image
image

Osobiście dużą wagę przywiązuję do tego, jak test drukuje się w konsoli. W przypadku błędu o wiele łatwiej dojść, gdzie leży problem. A poza tym sprawdzając cały system, już w trakcie wykonywania testów jestem w stanie oszacować ile jeszcze poprawek mnie czeka.

Jeśli natomiast masz ochotę wysiąść z konsoli i edytora i użyć jedynego słusznego obecnie IDE dla RoR, jakim jest Ruby Mine, to tam testy są świetnie obsłużone. Sam teraz preferują to narzędzie. Wystarczy jeden klik i postęp testów jest czytelny i zrozumiały. Ważne, żeby wybrać coś pod własne preferencje.

Tak czy inaczej, dla mnie zawsze zestawienie: RSpec – czytelna dokumentacja testów, będzie tożsame.

Poczytaj na ten temat w dokumentacji RSpec.