SORU
10 NİSAN 2011, Pazar


ASP.NET MVC3 ve Varlık Çerçevesi Kod ilk mimarlık

My previous question bana bir daha böyle katmanlar, depo, bağımlılık enjeksiyon ve mimari şeyler hakkında düşünmeye itti.

Benim mimarlık şimdi bu gibi görünüyor:
İlk EF kodu kullanıyorum, ben sadece POCO sınıfları ve bağlama yaptı. Db ve model oluşturur.
Yüksek seviye iş katmanı sınıfları (Sağlayıcıları). , RoleProvider, TaskProvider vb MemberProvider gibi, her etki alanı için farklı bir sağlayıcı kullanıyorum. ve bu sağlayıcılar her benim DbContext yeni örnek yapıyorum.
O zaman ben benim kontrol Bu sağlayıcıları oluşturmak, veri almak ve Görüş gönderin.

Benim ilk mimari sadece karmaşıklık ekler söylendi çünkü, bu yüzden sadece EF sadece kullanmıyorum neden kurtuldum havuz, dahil. Doğrudan Denetleyicilerinden EF.. çalışma yaptığını yapmak istedim, ama testler yazmam gerekiyor ve gerçek veritabanı ile karmaşık bir bölümdü. Sahte çakma veri bir şekilde geçirdim. Her sağlayıcı için bir arayüz yaptım ve listeler içinde kodlanmış veri ile sahte sağlayıcıları yaptı. Ve bu şey, geri, yere geldim doğru devam etmek için nasıl emin değilim.

Bu şeyler çok hızlı overcomplicated başlar... pek çok yaklaşım ve"... sadece çok fazla gürültü yaratır ve işe yaramaz kod. "pattterns

Oluşturmak için BASİT ve test edilebilir bir mimarlık ve Varlık Çerçevesi ile ASP.NET MVC3 uygulama var mı?

CEVAP
10 NİSAN 2011, Pazar


Eğer TDD (veya yüksek test kapsamı ile başka bir test yaklaşımı) kullanın ve birlikte EF istiyorsanız entegrasyonu yazmak veya uç uca testler gerekir. Burada sorun, ya da tarihsel veya depo alay ile herhangi bir yaklaşım sadece üst katman mantığı bu alay kullanır) test edebilirsiniz ama değil uygulama testi oluşturur.

Basit bir örnek:

Genel depo tanımlayalım:

public interface IGenericRepository<TEntity> 
{
    IQueryable<TEntity> GetQuery();
    ...
}

Ve hadi biraz iş write yöntemi:

public IEnumerable<MyEntity> DoSomethingImportant()
{
    var data = MyEntityRepo.GetQuery().Select((e, i) => e);
    ...
}

Şimdi Eğer sahte depoyu kullanacak Etmeniz İçin Nesneleri ve sen-ecek var yeşil bir test ama eğer çalıştırdığınız uygulama ile Seri-İçin-Varlık, sen-ecek almak bir istisna çünkü seçin aşırı dizinleri desteklenmiyor L2E.

Bu örnek sorgu ve diğer yaygın hataları kullanma yöntemleri ile gerçekleşebilir basitti. Ayrıca bunu da Eklemek, Güncellemek, Silmek genellikle depo maruz gibi yöntemleri etkiler. Eğer tam olarak EF bağlamı ve tutarlılığı davranışını taklit edecek bir alay yazarsan eğer mi uygulamanızı test edecek.

Hikayenin başka bir bölümünü alay karşı da pek ünite testleri ile tespit edilebilir Tembel yükleme ile ilgili sorunlar vardır.

Bu nedenle de entegrasyon tanıtmak ya da uç uca gerçek veritabanında çalışacak olan testler gerçek EF içerik ane L2E kullanarak gerekir. Btw. uçtan uca kullanarak testleri TDD doğru kullanmak için gereklidir. Yazmak için uçtan uca testler ASP.NET MVC WatiN ve belki de SpecFlow BDD ama bu gerçekten eklemek bir sürü iş ama sen-ecek var uygulama gerçekten test. Eğer TDD hakkında daha fazla okumak istiyorsanız tavsiye ederim this book (tek dezavantajı örnekler Java olmasıdır).

Entegrasyon testleri ise genel depo kullanmasanız bile mantıklı ve IQueryable ifşa etmeyeceğim ama doğrudan veri döndüren bazı sınıf sorgular gizle.

Örnek:

public interface IMyEntityRepository
{
    MyEntity GetById(int id);
    MyEntity GetByName(string name); 
}

Şimdi sadece sorgular bu sınıfta gizli ve üst katmanları maruz değil çünkü bu depo uygulama testi entegrasyon testi yazabilirsiniz. Ama depoyu bu tür bir şekilde eski uygulama saklı yordamlarında kullanılan olarak kabul edilir. Bu uygulama ile ORM özellikleri çok şey kaybedersiniz ya da ek bir sürü iş yapmak zorunda olacak - örneğin specification pattern üst katmanda sorgu tanımlayabilir ekleyin.

ASP.NET MVC kısmen uç uca entegrasyon testleri ile test denetleyicisi düzeyinde değiştirebilirsiniz.

Yorum dayalı düzenleme:

Birim testleri, entegrasyon testleri ve baştan sona bir test olduğunu söylemek istemiyorum. Test uygulamaları yapmak çok daha fazla çaba gerektiren derim. Gerekli testleri miktarı ve türleri, başvurunun beklenen gelecek, beceri ve diğer ekip üyelerinin becerileri karmaşıklığına bağlıdır.

Küçük açık projeler oluşturulabilir olmadan testleri (Tamam, bu iyi bir fikir değil ama hepimiz başardık ve sonunda işe yaradı) ama bir kez bir proje geçer bazı eşik bulabilirsiniz bu tanıtımı yeni özellikler veya bakımı proje çok zor çünkü asla emin kayış koparsa bir şey ki zaten çalışıyordu yani regresyon denir. Regresyon karşı en iyi savunma otomatik testler iyi ayarlanmış.

  • Birim test yöntemi test etmek için yardım. Bu tür testler ideal bir yöntem tüm yürütme yollarını kapsamalıdır. Bu testler ve yazmak için çok kısa kolay olmalı - karışık bölüm bağımlılıklar (alay, faktes, koçanları) kurmak olabilir.
  • Entegrasyon testleri çok katmanlı genelinde işlevselliğini sınamak ve genellikle birden çok işlem (uygulama, veritabanı) genelinde yardımcı olur. Her şey için onlara ihtiyacınız yok, deneyimi hakkında daha fazla yararlı oldukları yerde seçin.
  • Uç uca testler kullanım doğrulama dava / kullanıcı / hikaye özelliği gibi bir şey. İhtiyacı olan tüm akışı karşılar.

Bir feture birden çok kez test etmek için gerekli değildir - eğer bu özellik baştan sona test test olduğunu biliyorsanız aynı kod için entegrasyon test yazmana gerek yok. Ayrıca eğer bu yöntem sadece entegrasyon testi ile kaplı olan tek yürütme yolunu biliyorsanız, bunun için bir birim test yazmak zorunda değilsin. Bu büyük bir test (uç uca ya da entegrasyon) ile başlayıp yaklaşım TDD ve derin birim testleri ile çok daha iyi çalışıyor.

Ama onları daha sonra uygulama olarak tanıtabilirsiniz baştan testi birden çok türleri ile başlamak zorunda değilsin, geliştirme yaklaşımına bağlı olarak daha karmaşık hale gelecektir. Bu durum bile diğer kod tek satır yazmadan önce en azından uçtan uca ve birim testlerini kullanmaya başlamalısın TDD/BDD.

Yanlış soruyu soruyorsun. Soru basit değil mi? Soru sonunda size yardımcı olacak ve karmaşıklığı uygulamanız uyuyor nedir? Eğer kolayca birim test uygulama ve iş mantığı yapmak istiyorsanız alay edilebilir bazı diğer sınıflara EF kod almanız gerekir. Ama aynı zamanda testler ve diğer tip EF kod çalıştığından emin olmak için tanıtmak gerekir.

Çevre / proje / takım / etc uyacak ne sana söyleyemem. Ama son projemden örnek açıklayabilirim:

İki meslektaşları ile birlikte yaklaşık 5-6 ay boyunca bu proje üzerinde çalıştım. Proje MVC 2 jQuery ASP.NET EFv4 dayanıyordu ve artan ve tekrarlanan bir şekilde geliştirildi. Karmaşık iş mantığı ve bir sürü karmaşık veritabanı sorguları bir sürü vardı. Ünite testleri ile genel depolar ve yüksek kod kapsama doğrulamak eşleme (ekleme, silme, güncelleme ve varlık seçmek için basit testler) entegrasyon testleri başladık. Birkaç ay sonra bizim yaklaşım işe yaramazsa bulduk. Daha sonra 1.200 birim testleri, 60% (çok iyi değil) hakkında kapsama ve regresyon sorunları bir sürü kod vardı. EF modelinde değişen bir şey birkaç hafta dokundu olmayan bölgelerinde beklenmedik sorunlar ortaya çıkarır. Entegrasyon testleri eksik veya baştan sona bir uygulama bizim mantık testleri biz bulduk. Aynı sonuca paralel bir ekip başka bir proje üzerinde çalıştı ve entegrasyon testleri kullanarak yeni projeler için öneri olarak kabul edildi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LevelUpTuts

    LevelUpTuts

    20 Ocak 2012
  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007
  • sinumatic

    sinumatic

    19 Aralık 2006