2011-02-02 17 views
12

CQRS'nin uygulanmasına yönelik tavsiyelerin, ADO.NET'in doğrudan veritabanına (veya belki de LINQ tabanlı bir ORM'ye) yönelik sorgulamaları gibi, oldukça yakın bir şekilde meta sorgu uygulamasının savunulduğu göz önüne alındığında, bunun bir hata olduğunu ve birim test edin?CQRS'yi uygulama - İnce okuma katmanını test etmek gerekli mi?

Gerçekten gerekli olup olmadığını merak ediyorum? konuda

Düşüncelerim:

  1. ek mimari karmaşıklık bir mockable "İnce Oku Katmanı" sağlamak için minimumda mimari töreni tutmak için tavsiye doğası karşısında görünüyor.
  2. Bir kullanıcının oluşturabileceği her sorgu açısını etkili bir şekilde kapsayacak birim testlerinin sayısı korkunçtur.

Özellikle ben bir ASP.NET MVC uygulamasında CQRS dışarı çalışıyorum ve benim denetleyicisi eylem yöntemleri test birimi rahatsız, ya da sadece yerine Alan Modeli test etmek olup olmadığını merak ediyorum.

Şimdiden çok teşekkürler.

+0

"Bir kullanıcının oluşturabileceği her sorgu açısını etkili bir şekilde kapsayacak birim sınama sayısı korkunçtur." bunu daha fazla açıklayabilir misin? Kullanıcılar neden sorgularını oluşturuyor? Sorgu tarafınız bu konuyu ele almalı ve sorgu/görüntüleme hizmetinizi test edebilirsiniz (eğer görüş alanınızın kapsamını gerçekten azaltmanız gerekiyorsa) – roundcrisis

+0

Açık 2. - belki de kullanıcının gerçekten neye ihtiyacı olduğunu düşünerek düşünmeye başlayabilirsiniz. umut verici tam özgürlük yerine. –

+0

Bu test, Avrupa veya Amerika'da yaşıyorsanız tekrarlayan, maliyet etkin olmayan bir test gibi görünebilir ... –

cevap

4

Bu tür bir kodu test eden birimin bu kadar faydalı olmadığını size katılıyorum. Ancak bazı yararlı testler için hala bir alan var.

Sen bazı doğrulama gerçekleştirmek gerekir kullanıcının bu yüzden, o geçersiz istek sınamak eğer sorgu parametreleri, parametreler uygun bir özel durum ve geçerli parametresine izin verilir okuyun.

Bir ORM kullanıyorsanız, eşleme kodunu sınamak için maliyet/fayda oranını çok iyi buluyorum. ORM'inizin test edildiğini varsayın, haritalamada hatalar olabilir, ancak yakında bunları bulup düzelteceksiniz.

Ayrıca, bazı tümleştirme sınamalarını (aynı Sınama çerçevesini kullanarak) yazmak için, yalnızca veritabanına bağlantı kurabildiğinden ve ORM yapılandırmasının hiçbir eşleme özel durumu atmadığından emin olmak için yararlı buluyorum. Asıl db'yi sorgulayan birim testleri yazmak istemezsiniz.

1

Test edilen bu ünite gibi bir şey görmüş olduğum gibi, ünite testinin veritabanında bir dizi şey oluşturmasını sağlamaktır, ünite testlerinizi çalıştırırsınız, ardından oluşturulan şeyleri temizlersiniz.

Geçmiş bir işte, nesneleri ve ilişkilerini tanımlamak için bir veri yapısı kullanarak bu kurulumu çok güzel gördüm. Bu nesneler oluşturmak için ORM üzerinden çalıştırıldı, bu ilişkilerle, veriler için sorgular için kullanıldı ve sonra nesneleri silmek için ORM kullanıldı. Birim sınamalarını, bu değerleri geçersiz kılmayan birim sınamalarında kullanmak üzere, her sınıf belirtilen varsayılan değerleri ayarlamasını kolaylaştırmak için. Daha sonra birim testlerindeki veri yapısı, varsayılan olmayan değerleri belirtmek için gerekliydi, bu da ünite testlerinin kurulumunu çok daha kompakt hale getirdi.

Bu birim testleri çok kullanışlıdır ve veritabanı etkileşiminde birtakım hatalar yakalamıştır.

+0

Öneriniz için teşekkürler, ancak bu kesinlikle birim testleri değil, bu entegrasyon testleri. Dev makinemde bunun için fazladan bir şey istemiyorum. –

0

Bir asp.net mvc uygulamasında bir de sqrc uyguladım. Ancak sql ve 'ADO.NET sorguları' veya 'Linq' yerine document database(mongodb) ve her komut veya olay işleyicisini doğrudan güncelleme veritabanını kullanıyoruz.

Ve bir komut/olay işleyicisi için bir test oluşturdum. % 100 ünite testinden sonra etki alanımın% 95'in üzerinde çalıştığını biliyorum. Ancak, eylemler/denetleyiciler/ui'yi ui testlerini uygulamam (selenium kullanarak).

Bu nedenle, etki alanı için hem birim testleri (komutlar/olay işleyicileri ve veritabanına doğrudan güncelleştirmeler) hem de ui bunu 'bütünleştirme sınamalarını' test ediyor.

Etki alanı bölümünü en azından sınamanız gerektiğini düşünüyorum, çünkü tüm mantıklarınız komut/olay işleyicilerinde kapsüllenmiş.

FYI: Ayrıca, depolanmış yordamlar aracılığıyla veritabanına doğrudan güncelleştirmelerden ziyade, varlık çerçevesinden önce etki alanı bölümünü geliştirmeye başladım, ancak belge veritabanından gerçekten memnun kaldım. Bazı farklı belge veritabanlarını denedim ama mongodb benim için en iyisi.

2

Muhtemelen bildiğiniz gibi birim testi kod kapsamı konusunda daha az ve hataları önlemek iyi tasarımla ilgili olduğundan daha azdır. Ben genellikle acele ederken okuma modeli olay işleyicileri test atlamak ederken, kod TDD'd olmalıdır tüm nedenlerden dolayı muhtemelen yapılması gerektiğini hiç şüphe yoktur.

Ayrıca, HTTP eylemlerimi sınamayan bir birim de olmadım (Nancy'yi .NET MVC kullanmıyor olduğumdan beri denetleyicim yok).

Bunlar, tümleştirme noktalarıdır ve çoğunun komut işleyicilerinde ve etki alanı modelinde kapsüllendiği için fazla mantık içermeme eğiliminde değildir. onlar çok basit ve çok tekrarlanan çünkü

Ben test etmek değil oldukça kolay olduğunu düşünüyorum sebebi neredeyse hiç derin salt modeline olayların denormalizasyon içinde düşünme, orada olduğunu. Aynısı, isteği hemen hemen işleyen ve istemciye bir yanıt vermek için bazı temel mantıkla, etki alanına bir komut veren HTTP işleyicilerim için de geçerlidir.

Gelişirken, sıklıkla bu kodda hatalar yapıyorum ve TDD kullanıyor olsaydım muhtemelen bu hatalardan çok daha azını yapardım, ama aynı zamanda çok daha uzun sürer ve bu hataların tespit edilmesi ve düzeltilmesi çok kolay olur.

güdülerim yine de hepsi çok gevşek bağlı bir olay, hala burada olsa TDD başvurmalıdır söylüyor ve testleri yazmak zor olmamalı. Denetleyicilerinizdeki kod kokusunu gösteren testleri yazmakta zorlanıyorsanız.

2

Deneyimimde, iyi bir normalleştirilmiş okuma modeli oluşturuyorsanız, okumaların% 90 -% 99'unu yapacaksınız DO NOT, bunların etrafında birim testleri yapmanıza gerek yoktur.

Bir CQRS uygulamasının TDD uygulamasının en etkili ve etkili yolunun, komutları etki alanınıza yönlendiren bütünleştirme testleri yazmak olduğunu ve sonra da, verilerinizin onaylarınız için DB'den çıkmasını sağlamak için Sorguları kullandığını buldum.

İlgili konular