KaderTarlan

BlogCan

RSpec Nedir?

Rspec , Ruby dili ile yazılmış, ruby kodlarınızın testlerinde kullanılan bir test çatısıdır.

RSpec ile ilk test kodlarımızı yazmaya başlayalım. Bunun için öncelikle rspec kurmalıyız. Dizinimizi yaratıp içine giriyoruz.
mkdir example_rspec
cd exapmle_rspec
gem install rspec

Sonraki komutumuz,
rspec --init
çıktımız ise;

1
2
  create   .rspec
  create   spec/spec_helper.rb

Varsayılan olarak .rspec ve spec_helper.rb dosyalarını oluşturuyor.

.rspec gizli dosya olarak oluşturuluyor.
Bu dosya varsayılan olarak configurasyon seçeneklerini içeriyor.
İsterseniz bunları uygulamabilirsiniz veya deiğştirebilirsiniz.
Bu dosyada yer alan bazı seçenekler,

–format progress: Spec çalışmasında ilerlemeyi görüntüler.
–out : belirtilen dosyaya yönlendirme yapar.
–color: terminal çıktısında renk kullanır. Yeşil valid , red invalid testler için kullanılır.
–fail-fast : fail veren ilk testte spec durur.
–format html: Görüntüler html biçiminde bir dosyaya yönlendirilebilir.
Tüm seçeneklere erişmek isterseniz rspec --help komutunu verebilirsiniz.

Şimdide ana dizinimizin içinde lib dizini oluşturup kodlarımızı yazacağımız ornek.rb dosyası oluşturacağız.
Ayrıca ana dizinimizde spec dizinimizin altında bir lib dizini ve testlerimiz için ornek_spec.rb dosyası oluşturalım.

project source code: mkdir lib -> cd lib -> nano ornek.rb
rspec code: spec/lib/ornek_spec.rb

Burada ornek_rspec.rb dosyamıza test adımlarımızı yazacağız.
ornek.rb dosyamıza ise kodumuzun kendisini yazacağız.

Şimdi ornek_spec.rb dosyamızı açıp içine,

1
2
3
4
5
require "rspec"
require "spec_helper"
describe "a example" do
  it "is name Ornek"
end

describe ile oluturacağımız testi tanımlıyoruz.
it oluşturulan testin tanımını yapıyoruz.

Kodumuzu yazıp kaydediyoruz ve rspec spec/lib/ornek_spec.rb komutu ile konsolda çalıştırdığımızda çıktımız;

1
2
3
4
5
6
7
Pending:
  a example is name Ornek
    # Not yet implemented
    # ./spec/lib/ornek_spec.rb:4

Finished in 0.00059 seconds (files took 0.10746 seconds to load)
1 example, 0 failures, 1 pending

Burada Pending ile Not yet implemented çıktısı alıyoruz, kodumuzda şöyle bir değişiklik yaparsak;

1
2
3
4
5
require "spec_helper"
#describe "a exapmle" do
describe Example do
 it "is name Ornek"
end

Kodumuzu kaydedip rspec spec/lib/ornek_spec.rb komutuyla tekrar çalıştırırsak,

1
/example_rspec/spec/lib/example_spectop (required)> initialized constant Example (NameError)

Uninitialized hatası aldık çünkü Example classımız henüz yok.

Burada önce testi yazıp, çalıştırıp, Fail aldık. Testin verdiği çıktıya göre de yeterli kodumuzu yazıp Faili, Pass edeceğiz. Bu da Test Driven Development (TDD) yapısına uymakta.

Bunun için lib/ornek.rb dosyamızda,

1
2
class Example
end

Şimdilik Classımızı oluşturmuş olduk. Test çalıştığında Classı bulamadım hatası vermeyecek.
Bu classı da spec/lib/ornek_spec.rb dosyamıza haber vereceğiz. Onu da require "example" komutunu lib/ornek_spec.rb dosyamıza ekleyerek sağlayacağız, ekledikten sonra;

spec/lib/ornek_spec.rb komutunu verdiğimizde,

1
2
3
4
5
6
7
Pending:
  Example is name Ornek
    # Not yet implemented
    # ./spec/lib/ornek_spec.rb:5

Finished in 0.00029 seconds (files took 0.10765 seconds to load)
1 example, 0 failures, 1 pending

Gördüğünüz gibi hata almadık. Fakat hala implement edilmediğini söylüyor.

Şimdi de spec/lib/ornek_spec.rb dosyamıza bişeyler dolduralım;

1
2
3
4
it "is name Ornek" do
  new_example =Example.new
  new_example.name.should == 'Ornek'
 end

Kodumuz da yeni bir Ornek methodu oluştuğunda ve adının Ornek olmasını istediğimizi söyledik.

Testimiz çalıştığında yeni oluşan örnek methodunun adını kontrol edip bunun ‘Ornek’ olup olmadığını kontrol edecek.
Eğer adı ‘Ornek’ ise testimiz Pass edecek değilse Fail edecek.

Testimizi kaydettikten sonra rspec spec/lib/example_spec.rb komutunu kullanarak çalıştırıyoruz ve çıktımız,

1
2
3
4
5
6
7
8
1) E is name Ornek
     Failure/Error: new_example.name.should == 'Ornek'
     NoMethodError:
       undefined method `name' for #<Example:0x007f5f89721c40>
     # ./spec/lib/ornek_spec.rb:7:in `block (2 levels) in <top (required)>

Finished in 0.00045 seconds (files took 0.1093 seconds to load)
1 example, 1 failure

NoMethodError hatamızı aldık. Hatırlarsanız boş bir Class oluşturmuştuk, boş Classa gitti ve Ornek adında bir method bulamadı.

Şimdi kod parçamızdaki Classımızı hatamızı yok edecek şekilde düzenlemeliyiz.
Kırmızıyı yeşile çevirme aşaması. Değişikliklerimizi source kodumuzda yapacağız ki testimiz fail vermesin.

nano lib/ornek.rb

1
2
3
4
5
6
class Example
  attr_accessor :name
  def initialize
    @name = 'Ornek'
  end
end

Testimizi rspec spec/lib/ornek_spec.rb komutumuzla tekrar calıştırdığımızda,

1
2
Finished in 0.00212 seconds (files took 0.11077 seconds to load)
1 example, 0 failures

Görüyoruz ki kırmızı yazımız yeşile dönmüş durumda. Testimiz Fail vermedi.