Bir veritabanı ile çalışırken OO ve Test edilebilir kalma


16

Bir veritabanıyla çalışmak, ancak birimlerin test edilebilirliğini sağlamak için bazı OOP stratejileri nelerdir? Bir Kullanıcı sınıfım olduğunu ve üretim ortamımın MySQL ile çalıştığını varsayalım. Burada PHP kullanarak gösterilen birkaç olası yaklaşımlar görüyorum:

  1. Arka uç veri kaynağını soyutlamak için load()ve arayüzlerine sahip bir $ data_source iletin save(). Test yaparken farklı bir veri deposu geçirin.

    $ user = yeni Kullanıcı ($ mysql_data_source);
    $ user-> load ('bob');
    $ user-> setNickname ('Robby');
    $ Kullanıcı-> save ();
    
  2. Veritabanına erişen ve sonuç satırını Kullanıcının yapıcısına geçiren bir fabrika kullanın. Test ederken, $ row parametresini el ile oluşturun veya nesneyi UserFactory :: $ data_source içinde alay edin. (Kayıttaki değişiklikleri nasıl kaydedebilirim?)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

Yanımda Tasarım Desenleri ve Temiz Kod var, ancak uygulanabilir kavramları bulmakta zorlanıyorum.


Yanıtlar:


11

Almak istediğiniz şey Martin Fowlers'ın Kurumsal Uygulama Mimarisi Desenleri (Ayrıca web sitesinde bir katalog da sunuyor ).

İçinde veri erişimini soyutlamak için çeşitli modeller açıklar. Açıkladığınız ilk yaklaşım Aktif Kayıttır . İkinci yaklaşımınız Tablo Veri Ağ Geçidine benzer .

Daha iyi bir yaklaşım, veri erişim kodunu elle yazma ihtiyacını ortadan kaldırmak için bir O / RM kullanmaktır. Y2K için endişelendiğimiz için PHP kullanmadım, ancak wikipedia'nın sizin için bir seçenek listesi var . Yine de iyi olup olmadıklarını bilmiyorum. Ancak bir O / RM aramak için bazı şeyler söyleyebiliriz:

  • Kalıcı Cehalet : O / RM, veri erişim stratejisine katılmak için iş nesnelerinizi belirli bir arayüzden / sınıftan türetmeye zorlamamalıdır.
  • İlişki Eşleme : Nesneleriniz arasındaki ilişkileri eşleştirebilmeniz gerekir (müşterinin siparişleri, siparişlerin satır öğeleri, satır öğelerinin bir ürünü vardır, vb.)
  • Hiyerarşik Haritalama : Sınıf hiyerarşilerini veritabanına eşleyebilmelisiniz.
  • Sorgu Sözdizimi / Ölçütleri Desteği : Veritabanında değil, Nesneleriniz için çalışma zamanında bir sorgu oluşturabilmeniz ve O / RM'nin sorguyu veritabanında çevirip çalıştırması gerekir. Sorgu bir dize yerine kuvvetle yazılan bir zincirse ekstra noktalar.

Dikkate alınması gereken başka faktörler de var, ancak bunlar en önemlilerinden bazıları. Bu yardımcı olur umarım.


6

IMHO, ne test etmek istediğinize bağlıdır, iş mantığınızı birim test etmek istiyorsanız, veri erişiminizi saplamalısınız ( Martin Fowler ), böylece ilk öneriniz iyi bir başlangıç ​​olacaktır. Bu stackoverflow soru güzel bir C # örneği verir (bazı PHP örnekleri bulmaya çalıştım ama bulamadım).

Veri erişimini kendi içinde test etmek istiyorsanız buna artık birim testi değil, entegrasyon testi denir. Bazı genel rehberlik için burayı okuyun , bu yığın akışı sorusunun bazı ilginç bağlantıları da vardır.

Veritabanınızdaki saklı yordam mantığını sınamak istiyorsanız xUnit TestPattern'e bakın

Bu yardımcı olur umarım


2

Bu mutlaka hemen yararlı bir cevap değildir, ancak veritabanı test edilebilirliği konusunda gerçekten endişeleriniz varsa, Ruby on Rails'te nasıl yapıldığına bakmalısınız. Bildiğim kadarıyla hiç kimse konuyu daha iyi veya daha sezgisel olarak ele almadı.


2
Ruby on Rails varsayılan olarak Aktif Kayıt modelini uygular. Bir bağlantı da sağlayabilir: en.wikipedia.org/wiki/Active_record_pattern
Spoike

0

Bu tür bir soruna Symfony Framework çözümünü kontrol etmenizi tavsiye ettim. Symfony fonksiyonel testleri ile bir php OO çerçevesi.

İşte bir bağlantı , sizin düşündüğünüz gibi bir şey kullandılar.

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.