Veritabanları ve Birim / Entegrasyon Testleri


25

Web uygulamaları ile birim / entegrasyon testi hakkında biriyle bir tartışma yaptım ve 1 temel fikir hakkında bir anlaşmazlık var. Mesele şu ki, konuştuğum kişinin birim testinin çalıştığı veritabanının önceden doldurulmuş veriye sahip olması gerektiğini ve testlerin yapılmasından önce ve sonra tamamen boş olması gerektiğini düşünüyorum.

Veritabanındaki önceden doldurulmuş verilerle ilgili endişem, verilerin iyi durumda tutulmasını sağlamanın bir yolu olmamasıdır. Testlerin kendileri veritabanında veri oluşturacak, silecek ve değiştireceklerdir, bu yüzden testleri başlatmadan önce veritabanında verilerin olması iyi bir şey değildir.

Veri tabanı işlevselliğini test etmenin en iyi yolu, aşağıdaki kurulumları yapmak gibi görünüyor:

  1. Sınama gerçekten çalıştırılmadan önceki bir "kurulum" aşamasında, önce veritabanındaki tüm tabloları kısaltırsınız.
  2. Ardından, çalıştırmak üzere olduğunuz test durumları için gerekli tüm verileri ekleyin.
  3. Ardından test durumlarını çalıştırın ve doğrulayın
  4. Sonra bir "parçalama" aşamasında, bir kez daha veritabanındaki tüm tabloları kısaltırsınız.

Karşı test ettiğiniz verilerin iyi bir test edilebilir test olmasını sağlamak için daha iyi bir yol göremiyorum.

Burada bir şey mi eksik? Bu veritabanı ile ilgili işlevselliği test etmenin en iyi yolu değil mi? Önceden doldurulmuş bir veritabanının her zaman veritabanında bulunmasının bir faydası var mı (testlere başlamadan önce veya testler yapıldıktan sonra bile)? Düşüncemi, amacımı daha iyi anlayabilmek için sürecimi farklı şekilde açıklamaya yardımcı olacak herhangi bir yardım da (eğer puanımın yararı varsa) çok iyi olurdu.


ayrıca bakınız: Yazılım Test Teknikleri
gnat

Yanıtlar:


21

Benim için birim testleri veritabanı ile ilgilenmemelidir, entegrasyon testleri veritabanı ile ilgilidir.

Uygulamada veri tabanıyla ilgili olan entegrasyon testlerinin pratikte, yırtma ve yırtma yaklaşımına sahip boş bir veritabanına sahip olması gerekir, işlem tabanlı bir yaklaşım kullanmak oldukça iyi bir yoldur (örneğin, kurulumda bir işlem oluşturma ve yırtma sırasında geri alma).

Arkadaşınızın yapmak istediği gibi ses çıkarması, “regresyon” bakış açısıyla test etmek, yani orada gerçek veriler var ve sistemin nasıl tepki verdiğini görmek, hiçbir sistem mükemmel olmadığından ve genellikle güvenli bir yerde yatarak yapılan kötü veriler olabilir. bazı etki alanı modelinizi tuhaflıklar.

En iyi uygulamalarınız gitme yoludur ve ne yapmak istediğim, kötü veriler için bir senaryo bulursam, bir kurulumla bütünleşme testi yazıp, bu kesin senaryoyu yıpratmak.


Ben sadece not sure I birim alay veri ve veritabanı kullanmalıdır entegrasyonu kullanmalıdır duymak yanında fark birim test ve entegrasyon test arasındaki farkın ne (başka bir iş parçacığı başladı am programmers.stackexchange.com/questions/101300/... farkı dışarı şekle ). Bunun dışında, söylediğiniz her şey düşündüğüm ile aynı çizgide düşüyor.
ryanzec

Sorun değil, diğer cevabınıza daha fazla bilgi ekledim
Nicholas Mayne

1
DB'yi neden test edemiyorsun? SQL'inizi saklı yordamlara koyarsanız, bunları test tanımlı verilerle test edebilirsiniz ve birdenbire her şey kolaydır. Bu kesinlikle daha fazla insanın izlemesi gereken en iyi uygulamadır, MS'in
gbjbaanb

1
integration tests- ne demek istiyorsun? Bahsettiğim gibi veritabanı kullanan modüller birim testleri ile test edilebilir ve test edilmelidir . Veritabanını elle alay edebilir veya bellek içi uygulama ile değiştirebilir miyim
hellboy

6

Testleriniz veritabanına bağlıysa, önemsediğiniz verilerin veritabanı boş olması yerine testleriniz için bilinen bir durumda olması daha önemli olduğunu düşünüyorum. İyi testlerin ölçütlerinden biri, her testin bir sebepten başarısız olması ve aynı sebepten başka hiçbir testin başarısız olmamasıdır.

Bu nedenle, testiniz verinin durumu ile ilgileniyorsa, verileri bilinen duruma getirin ve testleriniz bittikten sonra verileri bu duruma geri getirin, böylece testleriniz tekrarlanabilir hale gelir.

Testlerinizi alay ederek veri durumundan ayırabilirseniz, bu da iyi bir şey olacaktır. Birim / entegrasyon testi yaptığınızdan bahsediyorsunuz, ama elbette bu iki şey ayrı olarak düşünülmelidir. Mümkünse, birim testleriniz veri tabanından çıkarılmalı ve entegrasyon testleriniz veri tabanı ile bilinen bir durumda test edilmelidir.


2

Önceden hazırlanmış bir veritabanına sahip olmanın bir faydası var: İhtiyacınız olan verileri girecek kodu yazmanız gerekmiyor, çünkü orada. Aksi halde sadece sakıncaları vardır. Belki birileri veritabanındaki test verilerini değiştirmiştir? Belki birileri verileri yenilemeye çalıştı? Ama en kötüsü, bir test senaryosunun veritabanını kötü bir şekilde karıştırması ... Tüm veritabanını manuel olarak birkaç kez yeniden yaratmanız yeterli.

Hiçbir şeyi kesmemem haricinde testlerin nasıl yazılması gerektiği konusunda haklısın:

  • kurulum aşaması: veritabanına bir bağlantı kurun ve verileri ekleyin
  • çalıştırma aşaması
  • yıkma aşaması: eklenen verileri kaldır (kes)

Şimdi, bu senaryo birim testleri için harika. Hem birim hem de entegrasyon testi için veri gerektiğinde, tüm test durumları için ortak olan büyük bir kurulum aşamasının (tüm "ekleri" tek bir statik yöntemde yeniden birleştirdik) de çok işe yarayabileceğini buldum. Fikrinizle arkadaşınızın fikri arasındaki orta yol gibi. Tek dezavantajı, mevcut test durumlarını kırmamak için bazı yeni veriler eklerken çok dikkatli olmanız gerektiğidir (ancak bizim yaptığımız gibi tablo başına iki-üç satır eklerseniz sorun olmaz)


Test için her birinin ihtiyaç duyduğu veri tabanının parçalarını, birisinin kazara bir başarısızlığa neden olacak şekilde değiştirmesini istemem mi? Bir test başarısız olduğunda verilerin doğru olduğundan emin olmak zorunda olması önlenebilecek bir şeye benziyor.
ryanzec

1
Farklı test durumlarına yararlı veriler ekleyen büyük kurulum aşaması yalnızca uygulamanın birlikte çalıştığı farklı bölümlerini kontrol etmeniz gereken entegrasyon testleri için yararlı olabilir. Bu büyük ortak "uçlar" setine sahip olmak faydalı olabilir, çünkü diğer entegrasyon testleri için bir kısmına ihtiyacınız olacak. Aksi takdirde, yalnızca saf birim testinden bahsediyorsak, kesinlikle her test durumu için bir veri seti eklemem gerekiyor.
Jalayn

1

Bence meslektaşınızla bir örneği daraltmanız ve tam olarak ne anlama geldiklerini öğrenmeniz gerekiyor. İkiniz de aynı sayfada olabilirsiniz.

Örnek: Hesap İşlem Tablosunu Kontrol Etme

  1. Bu tabloyu, işlem görmeyen bir kullanıcı / hesap için görüntülemeyi test etmek istemez misiniz?
  2. İlk kaydın eklenmesini test edin ve bir bakiye oluşturup oluşturamayacağınıza bakın.
  3. Zaten mevcut kayıtlar olduğunda kayıtlar oluşturun ve çalışan bakiyeyi ve diğer işletme kurallarını kontrol edin.
  4. Mevcut kayıtları ve diğer tüm CRUD'ları içeren tabloyu görüntüleyin.

Bunu 1. ve 2. adımları uygulayarak mı yoksa zaten bu durumda bir veritabanından başlatarak mı (yedeklemeyi geri alıyor?) Önemli olduğundan emin değilim. Bana komut dosyası yazma fikriniz, ihtiyacınız olan değişiklikleri yönetmeyi kolaylaştırır (Bir yönetici hesabı oluşturmayı unutup yeni bir kullanıcı için ihtiyacınız varsa.). Komut dosyası dosyalarının kaynak denetimine alınması, bazı yedek dosyalardan daha kolaydır. Bu aynı zamanda bu uygulamayı dağıtıp dağıtmamanızdan da etkilenir.


0

Birkaç cevabın yönlerini çizmek ve 2p eklemek ...

Not: Yorumlarım özellikle veritabanı testiyle ilgili , ve UI testiyle ilgili değildir (açıkça benzer olsa da geçerlidir).

Veritabanları, ön uç uygulamaları kadar test etmeye ihtiyaç duyuyor ancak 'ön uç ile çalışıyor mu' temelinde test etme eğilimindedir. ya da 'raporlar doğru sonucu veriyor mu?', bence veritabanı geliştirme sürecinde çok geç test edilen ve çok güçlü olmayan testler.

Her zamanki UAT / performance / et al'a ek olarak veri ambarı veritabanı için birim / entegrasyon / sistem testini kullanan çok sayıda müşterimiz var. testleri. Sürekli entegrasyon ve otomatik testlerle geleneksel UAT'ye geçmeden önce birçok problemi topladıklarını, böylece UAT'de zaman kazandıklarını ve UAT'in başarı şansını arttırdıklarını tespit etmişlerdir.

Eminim çoğu, veritabanı testlerinde ön uç veya rapor testinde olduğu gibi benzer bir titizlik uygulanması gerektiği konusunda hemfikirdir.

Test etmenin kilit noktası, küçük basit varlıkları test etmek, doğruluklarını sağlamak, varlıkların karmaşık kombinasyonlarına geçmeden önce, daha geniş sisteme genişlemeden önce doğruluklarını sağlamaktır.

Bu yüzden cevabımın içeriğini vermek

Birim Testi

  • Birimin çalıştığını kanıtlamak için bir test odağına sahiptir, örneğin bir masa, görünüm, işlev, saklı yordam
  • dış bağımlılıkları kaldırmak için arayüzleri 'saplamalı'
  • kendi verilerini sağlayacaktır. Bilinen bir başlangıç ​​veri durumuna ihtiyacınız vardır, bu nedenle mevcut ön testlerden veri alma olasılığı varsa, popülasyondan önce kesikler / silmeler yapılmalıdır.
  • ideal olarak kendi yürütme bağlamında çalışacak
  • kendisinden sonra silinecek ve kullandığı verileri silecektir; bu sadece taslaklar kullanılmadığında önemlidir.

Bunu yapmanın avantajları, testteki tüm dış bağımlılıkları ortadan kaldırmanız ve doğruluğu kanıtlamak için en küçük miktarda test yapmanızdır. Açıkçası, bu testler üretim veritabanında çalıştırılamaz. Aşağıdakiler de dahil olmak üzere, ünite türüne bağlı olarak yapacağınız birkaç test türü olabilir.

  • şema kontrolü, bazıları buna 'veri sözleşmesi' testi diyebilir
  • sütun değerlerinden geçen
  • Fonksiyonlar, prosedürler, görüşler, hesaplanan sütunlar için farklı veri değerlerine sahip mantık yollarının kullanılması
  • edge case test - NULL, hatalı veri, negatif sayılar, çok büyük değerler

(Birim) Entegrasyon Testi

Bu SE postasını çeşitli test türlerinden bahsetmek konusunda faydalı buldum .

  • birimlerin bir araya geldiğini kanıtlamak için test odağına sahiptir
  • birkaç birimde birlikte gerçekleştirilir
  • dış bağımlılıkları kaldırmak için arayüzleri 'saplamalı'
  • Dış veri etkilerinin etkilerini ortadan kaldırmak için kendi verilerini sağlayacak
  • ideal olarak kendi yürütme bağlamında çalışacak
  • kendiliğinden sonra silinecek ve oluşturulan verileri silecektir; bu sadece taslaklar kullanılmadığında önemlidir.

Ünite testlerinden bu entegrasyon testlerine geçerken, daha geniş bir yelpazedeki test durumlarını test etmek için genellikle biraz daha fazla veri olacaktır. Açıkçası, bu testler üretim veritabanında çalıştırılamaz.

Bu daha sonra artan veri hacimleri ve artan kapsamla birlikte Sistem Testi , Sistem Entegrasyon Testi (aka 2-uç testi) ile devam eder. Tüm bu testler bir regresyon testi çerçevesinin parçası haline gelmelidir. Bu testlerin bazıları UAT'nin bir parçası olarak yapılacak kullanıcılar tarafından seçilebilir, ancak UAT, BT tarafından tanımlandığı gibi değil , kullanıcılar tarafından tanımlanan testlerdir - ortak bir sorun!

Bu yüzden şimdi bazı soruları cevaplamak için bir bağlam verdim .

  • Birim ve entegrasyon testi için verilerin önceden doldurulması sahte test hatalarına neden olabilir ve bundan kaçınılmalıdır.
  • Tutarlı testler sağlamanın tek yolu, kaynak veriler hakkında varsayımlarda bulunmamak ve titizlikle kontrol etmektir.
  • Bir test cihazının, aynı testleri farklı bir kaynak kontrollü veritabanı kodu dalında gerçekleştiren bir test cihazıyla çakışmadığından emin olmak için ayrı bir test uygulama bağlamı önemlidir.

-3

Açıkçası, mevcut üretim veritabanıyla aynı büyüklükte bir veritabanı olmadan birim testini yaparsanız, testleri geçecek ve performans için üretimde başarısız olan birçok şeye sahip olacaksınız. Tabii ki bu nedenle de küçük bir yerel veri tabanı üzerine insanların gelişmesine karşıyım.

Eğer kod verilere özgüyse, verisiz olarak nasıl test edebilirsiniz? Sorguların doğru sonuçları döndürüp döndürmediğini görmeyi özleyeceksiniz. Neden boş bir veritabanına karşı test yapmayı düşünmek isteyesiniz ki, tüm bunlar size sözdiziminin doğru olup olmadığını, sorgunun doğru olup olmadığını söyler. Bu bana kısa görüşlü görünüyor. Kategorik olarak yanlış olan testleri yapan ve geçen testleri çok fazla gördüm. Bunu birim testinde bulmak istemiyor musun? Ben yaparım.


Boş bir veritabanına karşı çalışan önerim yok, adım 2'yi görürseniz "Çalıştırmak üzere olduğunuz sınama durumları için gereken tüm verileri eklerim" var. Performans sorunu hakkında, birim testinin ne demek olduğunu, bunun daha fazla yük testi olduğunu düşünmüyorum. Birim bana kodunda mantıklı olduğundan emin olmak için test ediyor. eğer mantıksal işe yararsa, aynı temel verinin 1 kaydı veya 100.000.000.000 kaydı için işe yarayacak (daha yavaş olacağını düşündüm).
ryanzec

Veri tabanı sorguları sadece mantıklı değil ve ne kadar erken olursa o kadar iyi sonuç vermeyecektir. 1 kayıt için işe yarar genellikle prod zaman aşımına uğrar ve birim test shoudl bunu en kısa sürede gösterir.
HLGEM

Birim ve entegrasyon testleri işlevsellik içindir ve performans değildir, bu nedenle az miktarda veriyle test edebilirsiniz
user151019

Ünite testi asla bir veritabanı kullanmamalıdır - entegrasyon testleri veritabanları kullanır.
Nicholas Mayne

1
Aslında bahsettiğiniz şey yük testi. Bir dizi Kabul testi yaptırdıysanız ve bunları bir yük testi aracına bağladıysanız, istenen efekti elde edersiniz.
Nicholas Mayne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.