Birim-Test Veritabanları

oy
32

Geçtiğimiz yaz bir temel ASP.NET/SQL Sunucu CRUD uygulama geliştirme, ve birim test şartlardan biriydi. Ben veritabanına karşı test çalıştığında bazı belaya girdi. Benim anlayış için, birim testleri olmalıdır:

  • vatansız
  • birbirinden bağımsız olarak
  • aynı sonuçlarla tekrarlanabilir hiçbir ısrarlı değişiklikleri yani

Bu gereksinimler, bir veritabanı için geliştirirken birbirleri ile oran olduğu görülüyor. Örneğin, ben böylece ben () ilk Sil çağırmanız gerekir, eklenecek satırlar henüz emin orada değil yapmadan Ekle () test edemez. Ama onlar değil zaten orada isen? Sonra ilk Var () işlevini çağırmak gerekir.

Benim nihai çözümün ilk çalıştırın ve kurulum sorunsuz koştu delalet ederdi çok büyük kurulum fonksiyonları (iğrenç!) Ve boş bir test durumu içeriyordu. Onların vatansızlığa korurken Bu testlerin bağımsızlık ödün edilir.

Bulduğum diğer çözüm fonksiyonu kolayca gibi geri alınmasını, bir işlemde çağırır sarılmasıdır Roy Osherove en XtUnit . Bu iş, ama başka bir kütüphane, bir başka bağımlılık içerir ve eldeki sorunun çözümü biraz çok ağır görünüyor.

Bu durumla karşı karşıya gidince ne SO toplum yaptı?


tgmdbm söyledi:

Genellikle bazı insanlar karışık neden olan, entegrasyon testleri yapmak için favori otomatik birim test çerçevesi kullanımı, ancak aynı kurallara uymaz. Sen (bunlar been çünkü birim test) Sınıflarınızdan çoğunun beton uygulanmasını içeren izin verilir. Sen test ediyoruz somut sınıflar birbirleriyle ve veritabanı ile nasıl etkileşimde .

Ben doğru bu okursanız Yani, gerçekten bir yolu yoktur için etkili bir birim test veri erişim katmanı. Ya da, bir veri erişim katmanı bir birim test veritabanı ile gerçek etkileşim bağımsız, diyelim ki, SQL / komutları sınıflar tarafından oluşturulan test, yer alacağı?

Oluştur 22/08/2008 saat 00:35
kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
25

Birim testi tablolar, mevcut beklenen sütunları içeren ve uygun kısıtlamaları iddia dışında bir veritabanı için gerçek yolu yok. Ama bu genellikle yaptığını gerçekten değmez.

Genellikle yok ünite veritabanını test edin. Genellikle de veritabanını içeren entegrasyon testlerinin.

Genellikle bazı insanlar karışık neden olan, entegrasyon testleri yapmak için favori otomatik birim test çerçevesi kullanımı, ancak aynı kurallara uymaz. Sen (bunlar been çünkü birim test) Sınıflarınızdan çoğunun beton uygulanmasını içeren izin verilir. Eğer somut sınıflar birbirleriyle ve veritabanı ile nasıl etkileşimde test ediyoruz.

Cevap 22/08/2008 saat 00:43
kaynak kullanıcı

oy
11

DbUnit

Belirli bir zamanda bir veritabanı durumunu aktarmak için bu aracı kullanabilirsiniz ve birim testi olduğunuzda sonra, otomatik olarak testlerin başında geri önceki durumuna alınmasını. Çalıştığım yerde oldukça sık kullanırız.

Cevap 22/08/2008 saat 00:44
kaynak kullanıcı

oy
5

demek ki, sen test edildiği karşı gerçek olanları davranışını taklit kütüphaneleri - birim testlerinde dış bağımlılıkları olağan çözüm sahte nesneleri kullanmaktır. Bu her zaman kolay değildir ve bazen bazı marifet gerektiriyor, ancak "Kendi rulo" istemiyorsanız eğer birkaç iyi (ücretsiz) sahte kütüphaneler Net için orada bulunmaktadır. İki hemen akla gelen:

Rhino Mocks oldukça iyi bir üne sahiptir biridir.

NMock başka bir şeydir.

Ticari sahte kütüphanelerinin bol da mevcut. İyi birim testleri yazma kısmı aslında onlar için kodunuzu tasarımlarını edilir -, mantıklı arayüzlerini kullanarak, örneğin, böylece yapabilirsiniz "sahte" yine de bir davranır onun arayüzünün bir "sahte" versiyonunu implmenting bir bağımlı nesne test amacıyla tahmin edilebilir bir şekilde,.

Veritabanı mocks, bu başa senin birim testler için tablo, satır veya veri kümesi nesneleri yapılan dönüş nesnelerle kendi DB erişim katmanı "alay" anlamına gelir.

Çalıştığım yerde biz genellikle sıfırdan kendi sahte kütüphanelerini yapmak, ama bu size anlamına gelmez.

Cevap 22/08/2008 saat 00:46
kaynak kullanıcı

oy
1

Yapman gereken bir komut dosyasından oluşturmak veritabanının boş bir kopyasından testlerinizi çalıştırılır. Eğer testler ve daha sonra tam olarak testler ne çalıştırmak gerektiği sonra sahip olduğundan emin olmak için verileri analiz edebilirsiniz. Bir kullan at beri Sonra sadece, veritabanını silin. Bu, tüm otomatik hale getirilebilir ve bir atomik işlem olarak kabul edilebilir.

Cevap 22/08/2008 saat 00:46
kaynak kullanıcı

oy
4

Evet, Repositories ve veritabanına erişim Hizmetleri erişmek için kodu yeniden düzenlemelisiniz ve daha sonra alay veya test edilen nesne asla veritabanını değecek şekilde bu nesneleri saplama olabilir. Bu veritabanının durumunu saklamak ve her testten sonra sıfırlayarak çok daha hızlıdır!

Ben çok tavsiye Moq sizin alaycı çerçeve olarak. Ben Rhino dalga geçer ve NMock kullandım. Moq kadar basit olduğunu ve diğer çerçeveler ile olduğum tüm sorunlar çözüldü.

Cevap 22/08/2008 saat 00:52
kaynak kullanıcı

oy
0

Eğer ORM LINQ to SQL kullanıyorsanız o zaman on-the-fly (Eğer birim testi için kullanılan hesaptan yeterli erişime sahip olması koşuluyla) veritabanı oluşturabilir. Bkz http://www.aaron-powell.com/blog.aspx?id=1125

Cevap 16/12/2008 saat 10:04
kaynak kullanıcı

oy
2

Ben aynı soruyu yaşadım ve burada diğer answerers ile aynı temel yargılara varmış: gerçek db iletişim katmanını test birimi rahatsız etmeyin, ancak bunun için Model fonksiyonları (sınamak üniteye olmak istiyorlarsa çekiyoruz sağlamak için verilerin düzgün, vs.) düzgün biçimlendirme ve veri alındığını doğrulamak için kukla veri kaynağı ve kurulum testlerinin çeşit kullanın.

Ben web geliştirme faaliyetlerinin bir sürü için kötü bir uyum gibi birim test çıplak kemikleri tanımını bulmak da. Ama bu sayfayı biraz daha 'ileri' birim test modellerini açıklar ve çeşitli durumlarda birim testi uygulamak için bazı fikirler ilham vermeye yardımcı olabilir:

Birim Test Desenler

Cevap 04/02/2009 saat 15:36
kaynak kullanıcı

oy
2

Ben bu çok durum için kullanıyoruz bir teknik açıklanmıştır burada .

ve her test tamamlandığında, veritabanı temiz yani (hayır önemsiz / test verilerini) geri alma - Sonuçlarınızı iddia - temel fikir sizin DAL her yöntemi kullanmak demek.

Eğer "büyük" bulmak olmayabilir tek sorun ben genelde bütün bir CRUD testi (birim test perspektifinden saf değil) ama bu entegrasyon testi eylemde REZİL + haritalama kodunu görmek için izin verir yapmak olmasıdır. Eğer uygulama kadar yangın önce bilecek bozulursa Bu şekilde (ben hızlı gitmek istediğimde bana bir ton iş kaydeder)

Cevap 04/02/2009 saat 15:46
kaynak kullanıcı

oy
1

Veri katmanını test ve veritabanı birlikte daha sonra projede için birkaç sürpriz bırakır. Ama veritabanına karşı test sorunlarını, birçok testlerle paylaşılan devlete karşı test ediyoruz ana bir varlık vardır. Bir testte veritabanına bir satır eklerseniz, sonraki test de o çizgiyi görebilirsiniz.
Ne gerek veritabanına yaptığınız değişiklikleri geri almak için bir yoldur. TransactionScope test aramaları altında kod kendi yerel işlem üzerinde taahhüt ettiği sınıf çok karmaşık işlemlerin yanı sıra iç içe geçmiş işlem kaldıracak kadar akıllı. İşte sizin testlere geri alma yeteneği eklemenin ne kadar kolay gösterir basit bir kod parçası:

    [TestFixture]
    public class TrannsactionScopeTests
    {
        private TransactionScope trans = null;

        [SetUp]
        public void SetUp()
        {
            trans = new TransactionScope(TransactionScopeOption.Required);
        }

        [TearDown]
        public void TearDown()
        {
            trans.Dispose();
        }

        [Test]
        public void TestServicedSameTransaction()
        {
            MySimpleClass c = new MySimpleClass();
            long id = c.InsertCategoryStandard("whatever");
            long id2 = c.InsertCategoryStandard("whatever");
            Console.WriteLine("Got id of " + id);
            Console.WriteLine("Got id of " + id2);
            Assert.AreNotEqual(id, id2);
        }
    }
Cevap 25/04/2014 saat 14:24
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more