27 Eylül 2022

Mocha ile otomatik test yazma

Bundan sonraki görevlerde otomatik test kullanılacak.

Otomatik test, aslında, bir geliştiricinin asgari eğitiminin bir parçasıdır.

Neden teste ihtiyaç var?

Fonksiyon yazıldığında, genelde ne olması gerektiğini düşünürüz: hangi parametre hangi sonucu verecek gibi.

Geliştirme yaparken, bu fonksiyonun çıktısı ile bekleneni birbiri ile karşılaştırılabilir. Örneğin bu konsolda yapılabilir.

Eğer bir şey yanlışsa kod değiştirilir ve tekrar çalıştırılır, ta ki doğru çalışana dek.

Fakat bunları tekrar tekrar çalıştırmak iyi bir yöntem değildir.

Bu tekrarları yaparken, bir şeyleri atlamak çokça karşılaşılan bir durumdur.

Örneğin, f diye bir fonksiyon yazılırken. Test: f(1) çalışır fakat f(2) çalışmaz. Kod düzeltildi, şimdi f(2)çalışmakta. Tamamlandı mı? Fakat f(1) tekrar test edilmedi. Bu bir hataya neden olabilir.

Bu çok tipiktir. Bir şey geliştirirken çoğu zaman muhtemel olan durumları aklımızda tutarız. Fakat programcıların bu durumların tamamını aklında tutması beklenemez. Bundan dolayı bir tanesini düzeltirken diğerini kırmak çokça yaşanılan bir durumdur.

Otomatik testlerin koddan ayrı yazılması demektir. Kolayca çalıştırılır ve tüm durumları kontrol edebilir.

Davranışa Yönelik Geliştirme – Behaviour Driven Development (BDD)

Diyelim ki Davranışa Yönelik Geliştirme tekniğini kullandınız, BDD sadece test için değil, bundan daha fazlasıdır.

BDD üç şeyin iç içe bulunmasıdır. Bunlar: test, dökümantasyon ve örneklerdir.

Yeteri kadar konuştuk. Şimdi örneklere geçebiliriz.

Üs fonksiyonunun geliştirilmesi: Özellikler

Diyelim ki us(x,n) adında bir fonksiyon yazmak isteyelim. Bu xi üssü olan n kadar artırsın. Ayrıca n≥0 olduğunu varsayalım.

Bu görev sadece örnektir: Bunun yaptığını yapan ** operatörü vardır ve aynı işi yapar. Burada bizim konsantre olacağımız olay bunun geliştirilmesi sürecidir. Bu daha karmaşık görevlerde de aynı şekilde kullanılabilir.

us fonksiyonunu yaratmadan önce, fonksiyonun ne yapacağını tanımlamanız gerekmektedir.

Bu tanımlamaya ayrıntılar veya özellikler diyebilirsiniz. Kısaca bu aşağıdaki gibidir:

describe("us", function() {

  it("n. kuvvetini alir", function() {
    assert.equal(us(2, 3), 8);
  });

});

Bu özelliğin 3 ana bölümü vardır:

describe("baslik", function() { ... })

Fonksiyonun neyi tanımladığı yazılır. Bizim durumumuzda bu üs’tür.

it("baslik", function() { ... })

it bölümünde ise daha okunaklı bir şekilde, hangi koşulda ne yaptığı açıklanır. ikinci argüman ise bunu test eder.

assert.equal(value1, value2)

it bloğunun içindeki kod eğer doğru ise hatasız döner.

assert* fonksiyonu us’ün beklendiği gibi çalışıp çalışmadığını kontrol eder. Burada assert.equal’ı kullanılmaktadır. Argümanları karşılaştırarak eşitlik olmadığı durumda hata verir. Burada us(2,3), 8 e eşit mi diye bakılır.

İleriki dönemlerde farklı karşılaştırmaları göreceksiniz.

Geliştirme akışı

Genelde akış şu şekildedir:

  1. Başlangıçta en basit fonksiyonalite test edilir.
  2. Bunun uygulaması yapılmıştır.
  3. Çalışıp çalışmadığını Mocha kullanarak yapabilirsiniz. Hata alındığında kod tekrar düzeltilmeli, ta ki her şey düzgün şekilde çalışana kadar.
  4. Şu anda çalışan ve uygulaması yapılmış bir testiniz var.