Özellik, üretim veritabanında (veya test için bir klon) tanımlandığında, bu bir birim testi değildir . Bir birim testi, bir iş birimini kontrol eder ve çalışması için belirli bir dış durum gerektirmez. Bu Offer1
, veritabanında tanımlanan ve yalnızca bir erkek teklifi olduğu varsayılmaktadır . Bu dışsal durum. Dolayısıyla bu daha çok bir entegrasyon testi , özellikle bir sistem veya kabul testidir. Kabul testlerinin genellikle yazılmadığını (test çerçevesinde çalıştırılmadığını fakat insanlar tarafından manuel olarak yapıldığını) unutmayın.
Özellik etki alanı modelinde bir if
ifade ile tanımlandığında , aynı test bir birim testidir. Ve kırılgan olabilir. Ancak asıl sorun, kodun kırılgan olmasıdır. Genel bir kural olarak, kodunuz yerine iş davranışı yapılandırılabilirse kodunuz daha dayanıklı olacaktır. Çünkü küçük bir kodlama hatasını düzeltmek için acele bir dağıtım nadir olmalı. Ancak, önceden bildirilmeksizin değişen bir iş gereksinimi sadece Salı (haftada bir şeyler oluyor).
Testi çalıştırmak için bir birim test çerçevesi kullanıyor olabilirsiniz. Ancak birim test çerçeveleri, çalışan birim testleriyle sınırlı değildir. Entegrasyon testlerini de yapabilirler ve yapabilirler.
Eğer bir birim testi yazma olsaydı, hem yaratacak person
ve offer1
veritabanı durumuna hiçbir güven ile sıfırdan. Gibi bir şey
[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
var personId = Guid.NewGuid();
var gender = "F";
var person = new Person(personId, gender);
var id = Guid.NewGuid();
var offer1 = new Offer1(id, "ReturnsFalseWhenGivenAPersonWithAGenderOfFemale");
offer1.markLimitedToGender("M");
Assert.False(offer1.IsEligible(person));
}
Bunun işletme mantığına bağlı olarak değişmediğini unutmayın. offer1
Kadınları reddettiği iddiası değil . Bu yapıyor offer1
kadın reddeder teklifin türü.
Veritabanını testin bir parçası olarak oluşturabilir ve yapılandırabilirsiniz. C # 'da NUnit kullanarak veya Java’nın JUnit’inde veritabanını bir Setup
yöntemle kurarsınız. Muhtemelen test çerçevenizin benzer bir fikri vardır. Bu yöntemde, veritabanına SQL ile kayıt ekleyebilirsiniz.
Üretim veritabanı için bir test veritabanı yerine kod yazmanız zorsa, uygulamanızdaki test zayıflığı gibi geliyor. Test için, ikame edilmesine izin veren bağımlılık enjeksiyonu gibi bir şey kullanmak daha iyi olacaktır. Daha sonra mevcut iş kurallarından bağımsız testler yazabilirsiniz.
Bunun bir yararı, işletme sahibinin (zorunlu olarak şirket sahibi değil, ürün hiyerarşisindeki bu üründen sorumlu kişi gibi) iş kurallarını doğrudan yapılandırması için genellikle daha kolay olmasıdır. Çünkü bu tür bir teknik çerçeveye sahipseniz, işletme sahibinin teklifi yapılandırmak için bir kullanıcı arayüzü (UI) kullanmasına izin vermek kolaydır. İşletme sahibi, kullanıcı arayüzünde sınırlamayı seçer ve markLimitedToGender("M")
aramayı yapar. Sonra teklif veritabanına devam edildiğinde, bunu saklardı. Ancak bunu kullanmak için teklifi saklamanız gerekmez. Böylece testleriniz veritabanında bulunmayan bir teklif yaratabilir ve yapılandırabilir.
Sisteminizde açıklandığı gibi, işletme sahibi, uygun SQL'i yayınlayacak ve testleri güncelleyecek teknik gruba bir istekte bulunmak zorunda kalacaktır. Veya teknik grup kodunuzu ve testlerinizi (veya daha sonra kodları test ederek) düzenlemek zorundadır. Bu oldukça ağır bir yaklaşım gibi görünüyor. Bunu yapabilirsin. Ancak yazılımınız (sadece test değil) yapmak zorunda kalmazsanız daha az kırılgan olacaktır.
TL; DR : Böyle testler yazabilirsiniz, ancak yazılımınızı yazmaktan daha iyi olabilirsiniz, böylece yapmak zorunda kalmazsınız.