Rspec ve Ruby on Rails kullanarak Test Odaklı Geliştirme (TDD).

Test Odaklı Geliştirme (TDD) nedir?

Yazdığınız testler ile kodunuzun geliştirilmesinin ileriye taşındığı bir yazılım geliştirme sürecidir. Karşıt-sezgisel görünebilir, ancak TDD ile başarısız olacak testler yazarsanız ardından bu testleri geçecek kod yazarsınız. Burada aslinda iki kural vardir.

  • İlk önce başarısız bir otomatik testiniz olmadıkça bir satır yeni kod yazmayın.
  • Yinelemeyi Ortadan Kaldirin

    Bu kurallar bizi TDD’nin Red / green / refactor yöntemine götürür. Oluşturduğunuz ilk test başarısız olacak ve ardından testi geçmek için gerekli kodu yazacaksınız. Kırmızı, başarısız olduğunu ve yeşil, geçtiğinizi gösterir. Ancak, yeşil işinizin bittiği anlamına gelmez. Testi geçtikten sonra, yazdıklarınızı yeniden düzenlemeniz gerekecek.

Neden önce test etmelisiniz?

İlk önce test etmek, hataları ve kod tabanınızın boyutu ve karmaşıklığı arttıkça yeniden düzenleme ihtiyacını en aza indirebilir. İyi yazılmış ve test edilmiş kodla başlamak, maliyet ve zamandan da tasarruf sağlayabilir.

Testler ayrıca bir uygulamadaki özelliğiniz için belge görevi görebilir. Takımdaki diğer geliştiriciler testlerinizi okuyabilir ve kodunuzun neyi başarmak istediğini kolayca anlayabilir.

Önce testleri oluşturarak, test ettiğiniz işlevin çalışmasının amaçlandığı şekilde çalıştığından ve hattın ilerisindeki sürprizlerden kaçınıldığından emin olabilirsiniz.

Rspec nedir?

Ruby’de yazılmış, alana özgü bir dildir ve özellikle test yazımı için tasarlanmıştır. Ruby uygulamalarını test etmek için kullanılır. Bununla birlikte, RSpec-rails olarak adlandırılan Ruby on rails uygulamalarını test etmek için bir gem’de vardır.

Bu eğitimde, Rspec’in rails test sürümünü kullanacağız.

Kurulum

Yeni bir rails uygulaması oluşturalım. Terminali açalım ve uygulamayı oluşturmak istediğiniz dizinde bu komutu çalıştıralım

rails new [uygulamanizin-adi] -T

-T eklentisini kullanmamızın nedeni, bu yazimizda Rspec kullanacağımızdan, rails’in Mini-testinin yüklenmesini önlemektir.

Rspec Gem’ini, gem dosyasının geliştirme ve test bölümüne eklediğinizden emin olun. Gem rpsec-rails sürümünüz farklı olabilir.

#gemfile
group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails'
end

Bundan sonra, terminalde asagidaki komutu çalıştırmaniz gerekecektir. Bu kod ile ekledigimiz gem’i kullandigimiz ruby surum dizinine yukleyecegiz.

bundle install

Gem’i yukledigimize gore simdide Rspec-rails icin gerekli dosyalari olusturmak icin asagidaki komutu girelim;

rails generate rspec:install

Artık test için ayarlandığımıza göre, RSpec sözdizimlerinin bazılarının üzerinden geçelim.

Önemli anahtar kelimeler

  • describe
  • context
  • it
  • expect

describe nedir?

Description anahtar sözcüğü Rspec’te örnekler olarak adlandırılan bir grup test içerir.
Anahtar kelime, bir sınıf adı veya bir dize argümanı alır.

describe Araba do 

end

Yukaridaki ornegimizde bir do/end blogu icine aliyoruz.

context nedir?

Context anahtar sözcüğü, argüman olarak bir sınıf adı veya dizesi alabilmesi ve ayrıca bir ruby do / end bloğundaki örnekleri de içermesi açısından tanımlamaya benzer. Kullanımı isteğe bağlıdır, ancak testinize daha fazla bilgi eklemenize yardımcı olabilir.

describe Araba do 
 context "validations" do
 end
end

it and expect nedir?

Rspec anahtar sözcüğü “it” bir testi veya örneği tanıtmak için kullanılır.

describe Araba do 
 context "validations" do
  it "ismin oldugundan emin ol" do 
  end
 end
end

expect anahtar kelimesi, test sonuçlarından bir beklentiyi ana hatlarıyla belirtir.

expect("deger").to eq("gercek degeri")

Bunun nasıl çalıştığını bir örnek olarak görelim. Bir Araba modeli oluşturalim.

rails generate model araba isim:string

Bu komut araba adinda bir model ve isim:string olarak bir veritabani sutunu acicaktir, ayrıca RSpec testlerini çalıştırmak için gereken dosyayı da oluşturacaktır. Uygulamanızda bu konumda yer alacaktır;

spec/models/araba_spec.rb

Artık TDD ile başlamaya hazırız. Araba modelimiz bir isim gerektirir. İsmi veritabanına kaydedilmeden önce doğrulamak istiyoruz.

require 'rails_helper'

RSpec.describe Araba, type: :model do
  context 'validations' do
    it "ismin oldugundan emin ol" do
      araba = Araba.new(isim: "").save
      expect(araba).to eq(false)
    end
  end
end

Yukarıdaki test, başlatılan araba nesnesinin yanlış döndürmesini bekler çünkü isim özniteliğine boş bir dizge aktardık, ancak yerinde herhangi bir doğrulamamız yok, bu nedenle beklentimiz false olduğunda true aliriz.

Yürüttüğümüz tek bir testimiz olduğundan, komut satırına RSpec yazabiliriz ve testi calistirabiliriz.

Test başarısız olucaktir ve TDD’nin kırmızı / yeşil / refaktöründe ilk kırmızımız var. Boş dizelerin isim özniteliğine kaydedilmesini önlememiz ve bu testi yeşile çevirmemiz gerekir.

Uygulamamızdaki Araba modelimize bir isim doğrulaması (validation) eklememiz gerekecek. app/models/araba.rb dosyamiza ulasalim ve eklentimizi yazalim;

class Araba < ApplicationRecord
  validates :isim, presence: true
end

Şimdi testi tekrar yapıyoruz, geçmesini ve aradığımız yeşili bize vermesini beklemeliyiz.

Testimiz şimdi geçti ve bu örnek için, araba modeli doğrulamaları için bir refaktör yapmamız gerekmeyecek.

Yazacağımız bir sonraki test, arabanin isminin en az iki karaktere sahip olmasını sağlayacaktır.

Öyleyse başarısız olacak bir test yazarak başlayalım.

 it "ismin iki karakterden fazla oldugundan emin olun" do
      araba = Araba.new(isim: "B").save
      expect(araba).to eq(false)
 end

Bunu test ettigimizde başarısız testimiz var, bu yüzden şimdi bizi yeşile götürecek doğrulamayı oluşturmamız gerekiyor.

Araba.rb dosyamıza bunu ekleyeceğiz;

validates :isim, length: {minimum: 2}

Uzunluk Active Record yardımcısını kullanarak, yalnızca 2 veya daha fazla karakter içeren adların kaydedilebileceğinden emin olabiliriz.

Testi tekrar yapalım ve geçip geçmediğimizi görelim.

Testi geçtik ve bu örnek bir refactor gerektirmeyecek.

Bu yazimiz için, geçerli isimlerin kabul edilmesini sağlamak için bir test daha oluşturacağız.

it "gecerli isimlerin kayit oldugundan emin olun" do
      araba = Araba.new(name: "BMW")
      expect(araba).to be_valid
end

Bu senaryoda ise, başarısız olmasını beklemiyorum ama sadece neyi test edebileceğinizi göstermek için ekliyorum.

Umarım bu yazimizdan sonra TDD ve Rspec’i daha iyi anlarsınız.

0.00 avg. rating (0% score) - 0 votes
0 Comments

No Comment.