Thread overview
AyarYonetici sınıfını test etsek?
May 25, 2012
zafer
May 26, 2012
Salih Dinçer
May 26, 2012

Bir başka konuda sizlerin desteği ile geliştirdiğim AyarYönetici sınıfını zorlu koşullar altında test etmek istiyorum :) Yani kısaca unittestler ile metotlerı kontrol etmek niyetindeyim. AyarYonetici kodlarını aşağıya ekliyorum;

module AyarYonetici;

import std.conv;
import std.file;
import std.json;

public class AyarYonetici
{
	private string[string] ayarTablosu;
	private string ayarDosyasi;

	public this(string ayarDosyasi)
	{
		this.ayarDosyasi = ayarDosyasi;

		AyarDosyasindanOku();
	}

	private void AyarDosyasindanOku()
	{
		string ayarBilgisi = to!string(read(ayarDosyasi));

		JSONValue[string] ayarListesi = parseJSON(ayarBilgisi).object;

		JSONValue[] programAyarlari = ayarListesi["programAyarlari"].array;

		foreach (ayarlar; programAyarlari)
		{
			JSONValue[string] ayar = ayarlar.object;

			EslemeTablosunaEkle(ayar["anahtar"].str, ayar["deger"].str);
		}
	}

	private void EslemeTablosunaEkle(string anahtar, string deger)
	{
		ayarTablosu[anahtar] = deger;
	}

	@property const(string[string]) AyarAnahtari() const
	{
		return ayarTablosu;
	}
}

ilk olarak AyarDosyasindanOku() metodu için test yazmak istiyorum ama dışarıdan bir dosya alıp ona göre işlemler yapıyor. Bu durumda nasıl bir yol izlemeliyim?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 26, 2012

Bu konuda std.file (https://github.com/D-Programming-Language/phobos/blob/master/std/file.d) sınıfının unittest'ini kullanabilirsin...

Burada deleteme adında bir özellik var ve kullanılan işletim sistemine göre path'de temp dizini neresi tanımlanmışsa oraya dosya oluşturup yazıyor:

unittest
{
   write(deleteme, "1234");
   scope(exit) { assert(exists(deleteme)); remove(deleteme); }
   assert(read(deleteme, 2) == "12");
   assert(read(deleteme) == "1234");
}

JSON yazma bölümünü de std.json (https://github.com/D-Programming-Language/phobos/blob/master/std/json.d) ile birlikte ali.to!JSONValue (http://ddili.org/forum/post/5382) kullanarak halledebileceğini düşünüyorum. Çünkü çok güzel bir sınıfı o.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 26, 2012

Alıntı (zafer):

>

AyarDosyasindanOku() metodu için test yazmak istiyorum ama dışarıdan bir dosya alıp ona göre işlemler yapıyor

Salih'in dediği gibi benim de sistemde /tmp diye bir klasör olduğunu varsaydığım ve mecburen orada oluşturduğum dosyaları kullandığım oldu.

Ancak, birim testlerinin olabildiğince programın kendi olanaklarını kullanması gerekir. Örneğin, bir sunucu ile konuşan bir sınıf bile aslında gerçek bir sunucu ile konuşmamalıdır. Testler ona sunucu gibi davranan sahte bir sınıf vermelidir. Bu sınıflara mock, fake, stub, vs. gibi isimler veriliyor.

Böyle sahte sınıfların başka bir nedeni de hızlı olmalarıdır. Sonuçta birim testleri ürünün kalite kontrol testleri sayılmazlar. Onlar, kodun güvenliğini garanti ettikleri için programın geliştirilmesi sırasında neredeyse her zaman çalıştırıldıkları için çok hızlı olmak zorundadırlar.

Kodların birim test edilebilir (unit testable) olmaları durumunda tasarımın da daha üstün olduğu farkedilir.

Bu gibi sorunlu durumlara düşülmesinin bir nedeni de TDD'yi (test driven development) takip etmemiş olmaktır. Eğer her kodun önce birim testi yazılsa, zaten bütün kodun kolayca birim test edilebilir durumda olur. AyarYonetici sınıfı aslında iyi durumda sayılır çünkü hangi dosyayı kullanacağını dışarıdan alıyor. En kolayı yine Salih'in söylediği gibi /tmp altında bir dosya oluşturup testten sonra da silmektir.

Başka bir tasarım, dosya ismi değil, FILE alabilir. O zaman sınıfa bellekte yaşayan bir FILE nesnesi verilebilir. Phobos'ta bu işi kolaylaştıran bir olanak yok. (Aslında std.stream.MemoryStream var ama std.stream'in gidici olduğunu duyduğumuz için önemsemeye biliriz. Zaten MemoryStream bir FILE değil, bir Stream.)

Çok laf ettim. Sonuç: Salih'in fikri uygun.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]