Nasıl PHP SimpleTest çerçevesini kullanarak veritabanı test kurarım

9 Cevap php

Ben SimpleTest, PHP tabanlı bir birim test framework kullanıyorum. Ben bir veritabanından web sitesi yorumlarınızı almak ve saklamak idare edecek yeni kodu test ediyorum. Ben veritabanı erişim kodu test etmek için proje yapısı için nasıl bir kayıp am.

Ben PHP uygulamasında db kodu test etmek için en iyi uygulamaları gibi herhangi bir öneri arıyorum. Örnekler gerçekten harika. Daha fazla okuma için siteler harika.

Nazikçe teşekkür ederim. :)

9 Cevap

Ben bilinen bir isim ve veritabanı kullanıcı adı / şifre ile birim test adanmış bir yerel veritabanı vardı. Ünite testleri o konuma kodlanmış ama eğer onlar istedi farklı geliştiriciler bu değişkenleri geçersiz olabilir.

Sonra her testin zaman TRUNCATE her tablo önce. Bu tablo veya veritabanı kendisini oluştururken / bırakarak daha much hızlıdır.

Not: Do not testlerden sonra kesecek! Bir test genellikle sorunu teşhis yardımcı veritabanı mevcut devlet var başarısız olursa bu şekilde.

PHP bu tablo / veritabanı geçici bir tablo / veritabanı ve test verileri oluşturmak ve tedarik için izin isteyebilirsiniz. Sonra el veritabanını sıfırlamak zorunda değilsiniz. Çoğu çerçeveler kolaylaştırmak için veritabanı manipülasyon kütüphaneleri var. Bu ön sonunda zaman alabilir ama daha sonra bir değişiklik yaptığınız zaman çok daha hızlı, daha sonra test sağlayacak.

Bu eski bir soru ama ben bu ile yaşadığınız bazı özel deneyim eklemek istiyorum düşündüm.

Diğer posterler bu entegrasyon test şeklidir ama nereden ben birim test söndürdü için MySQL çok fazla mantık orada sık sık oturup teknik olarak doğru. Eğer bizim gibi ve MySQL üzerinde büyük ölçüde bağımlı olan (ve genellikle hizmet başına birkaç tablo) büyük, karmaşık hizmetler varsa, test sorgu mantığını içeren sağlam bir test çerçeve olması gerçekten kullanışlı. Biz ünite testleri bizim bağımlılıkları iyi bir dizi taklit değil, MySQL.

Biz bu işlevselliği sağlamak için SimpleTest şal sınıfları bir dizi var. Bu gibi bir şey çalışır:

  • Her veritabanı tablo oluşturmak için talimatları tests/etc/schemas/table.sql bir dosyada saklanır. Bu testi bulmak için beklediğiniz tüm konserve veriler için şema verilerin yanı sıra ekler içeriyor.
  • Veritabanı gerektirir her test tabloları oluşturmak için işlevsellik sağlayan bir Test_DbCase sınıfını genişletir.
  • Bir önyükleme sınıf oluşturma ve yapı ve imha üzerinde veritabanını bırakarak ilgilenir.
  • Çalışma zamanında, ayar yöntemini test aramaları loadTables('foo', 'bar') foo.sql olarak sql komutları yürütmek ve bar.sql.
  • Testler konserve verilere karşı çalışır .. dinlenme açıktır.

Elimizdeki Bir diğer aracı daha kolay table.sql dosyaları oluşturmak için yapar bir bash script. Bu gerçekten kullanışlı, aksi takdirde biz elle SQL yazma olurdum çünkü - MySQL tüm verilerinizi kurmak, tablolar mevcut bir set çekmek, ve sonra temel test dosyaları oluşturmak için verebilirsiniz.

Biz bunun bir sürü kendimizi rulo zorunda sona erdi ama bu, bizim için gerçekten iyi çalışıyor.

Bir veritabanına karşı test genellikle muhtemelen test altındaki kodu kapsülleme eksikliği, kötü testleri gösterir. Eğer bir kaç, çok temel testler paçayı böylece basit bu etkileşim katmanı tutarak, mümkün olduğunca kodunuzu kalanından veritabanı ile etkileşim kod izole denemelisiniz.

Diğer bir deyişle; Sitemizde yayınlanan fırsatlar kodu, veritabanı etkileşimi ile ilgilenen aynı kod olmamalıdır. Sen olabilir - örneğin - Yorum modeli veritabanına erişmek için kullandığı, bir genel tablo modülü yazmak. Hala tablo modülü test etmek olurdu, ama bu yorum kodu izolasyon yapılmalıdır.

Veritabanı kodu test ederken, her zaman başlangıç ​​noktası olarak aynı veritabanı olması iyi. Eğer birim sınama (Ben burada durumda varsayalım) yapmak, özellikle eğer. Yollarından biri Jason olarak önerilen tüm tabloları kesecek, ama bunu bazı başlangıç ​​verilerinin olmasını tercih. Bilirsin, her zaman her veritabanında mevcut bazı 'default' veri olması gerekir.

Ayrıca, bazı testler yalnızca tam veritabanı ile mantıklı. Yani, bu testler için veritabanının özel bir örneğini oluşturun. Ben plug-in (sadece dosyaları kopyalamak) bazı testler çalıştırmadan önce yaklaşık 3 veya 4 farklı veritabanları var. Aynı başlangıç ​​noktasına sahip her zaman yinelenebilmesini sağlar.

Yani, sadece iyi 'başlangıç ​​noktası' bir kaç veritabanı durumlarını hazırlamak ve onları yedekleyebilirsiniz. Testlerin her set çalıştırmadan önce, uygun bir veritabanı geri yükleme, ve daha sonra çalıştırın.

I not SimpleTest kullanarak veritabanına erişim kodu test etmek denemek için teşvik ediyorum.

Bunun yerine, kullanarak app için fonksiyonel bir test oluşturmak, örneğin, Selenyum: Eğer bir veritabanı bilinen bir devlet başladığınızda bir test durumu kaydetmek; daha sonra bir yorum eklemek ve içerik gerçekten var olduğunu (Selenyum adlı iddia kullanarak) kontrol edin.

This way it is: - easier to set up and maintain - you verify not just the DB layer, but the presentation layer, too

Eğer DB prosedürleri saklanan varsa söyledi, do SimpleTest kullanın - Ben başarılı kendim yaptım. Temelde, saklı yordam çalıştırmak sonra, birkaç insert / update gerçekleştirin sonra, bilinen DB devletten başlamak SimpleTests oluşturmak ve DB devlet ne beklediğiniz olduğundan emin olun.

Eğer gerçekten bir veritabanına karşı test etmek istiyorsanız, her sınavdan önce tablo oluşturmak / veri almak için tavsiye ederim. Bu şekilde, veritabanı her test bilinen bir durumdan başlar. Bu oldukça performanslı pahalı olduğundan, setUp in (senin rdms bunu desteklemesi şartıyla) bir hareketi başlatmak ve tearDown rollback olabilir. (Muhtemelen kullandığınız RDBMS) MySQL, iç içe geçmiş işlemleri desteklemiyor, bu yüzden test altında kod işlemleri kullanıyorsa, başın içine çalıştırabilirsiniz. Sen savepoints kullanarak bu sorunun üstesinden gelebilirsiniz. Testten sonra kayıt noktasına bir test etmeden önce kayıt noktası ve geri alma kurmak.

Ben hala bu kadar ihtiyacınız varsa, size testler size bir şey anlatmaya çalışıyoruz olasılığını düşünmelisiniz korumak olacak ..

Bu bir süre geri sorulan bir soruya benzer:

How to Test Web Code,

ve ben bazı iyi cevaplar var.

Ben bir ORM kullanmak gerektiğini düşünüyorum ve bunun için bir kaç entegrasyon testleri yazmak. Entegrasyon testleri bu gerçek ortamda mükemmel çalışıyor olduğunu göstermek, o zaman (vs .. veritabanı, php versiyonu, platform,) sizin ortamı değiştirmek sadece tekrar test etmek için var. Bundan sonra ORM nesneyi kadar alay edebilir ve veritabanına bağlanmak gerekmez.

Yani bu en iyi yol olduğunu düşünüyorum, ama bir ORM kullanmak istemiyorsanız, o zaman bir test veritabanı oluşturmak ve veritabanı bağlantısı (PDO) nesneyi kadar alay edebilir. Bu durumda oluşturabilir ve testcases Kurulum ve tearDown bölümlerde test tabloları bırakın. Bu entegrasyon testleri değil, ünite testleri olması önemlidir, bu nedenle bir şey PHP ve SQL server beetween değişti sadece, her zaman onları çalıştırmak gerekmez. Eğer entegrasyon testleri ile veri erişim nesneleri test sonra, ünite testleri onları alay var.