Magento 1.9'da birim testleri için en iyi uygulama


11

Birkaç özel modül içeren bir Magento 1.9 sitesi tutuyorum. İşlevlerin bir kısmı iş açısından kritik öneme sahiptir ve bazı birim testlerin korkunç gereksinimine sahiptir. Bir birim fiyat hesaplayıcısı.

Ben genellikle Symfony geliştirmek ve gerçekten bir şekilde mümkünse PHPUnit (w / Composer) kullanmayı tercih ederim.

Bazı işlevsellik birkaç özel veritabanı tablolarına alınan verilere dayanmaktadır, bu yüzden bir şekilde fikstürleri yüklemeyi tercih ederim.

Bu yüzden bazı birim testleri yazmak için en iyi uygulama yaklaşımını arıyorum. Glady öğreticiler veya benzer bir şey kabul edeceğim. Herhangi bir yardım takdir.

Yanıtlar:


10

Bir süre önce aynı problemle karşılaştım.

Ecomdev PHPUnit modülünü kullanmayı düşündüm ama kullanımı zor ve kötü belgelenmiş buluyorum (ama yine de Ivan'ın ne yaptığını ve Magento ekosistemine yaptığı büyük katkıyı seviyorum).

Böylece, Vinai'nin yardımıyla, aşağıdaki test çerçevesi modülünü geliştirdim: https://github.com/digitalpianism/testframework

Orijinal amaç entegrasyon testleri içindi ama bunu birim testleri için de kullanıyorum. Burada çalışırken görebilirsiniz: https://github.com/digitalpianism/easytoplinks/blob/master/app/code/community/DigitalPianism/EasyToplinks/Test/Unit/Block/Page/Template/LinksTest.php

Fikstür ile ilgili olarak, veritabanında örnek veri oluşturmaktan kaçınmak için işlem geri almalarını kullanıyorum.


Bu gerçekten umut verici görünüyor. Ben bunu deneyeceğim. Teşekkürler.
frigg

13

Kurulum

Magento 1, besteciyi kutudan çıkardığı için , phpunit'i composer kullanarak kurarsanız veya sadece phar sürümünü indirirseniz büyük bir fark yarattığını düşünmüyorum .
Sitenizdeki diğer üçüncü taraf modüllerini veya kitaplıklarını yönetmek için zaten besteci kullanıyorsanız, besteci muhtemelen en mantıklıdır. PHP7 kullanmadığınız sürece phpunit'in eski bir sürümü ile sınırlı olacaksınız (bu yüzden yukarıdaki 4.8 sürümüne bağlandım).

Entegrasyon Testleri / ve / veya Birim Testleri

Magento 1 bu kadar ağır bir uygulama olduğundan, phpunit bootstrap'ı entegrasyon için bir tane ve birim testleri için bir tane olarak ayırmak mantıklıdır.
Birim sınama önyüklemesinin yalnızca otomatik yükleyiciyi başlatması gerekirken, tümleştirme sınama önyüklemesinin yapılandırma yüklemesi ve db bağlantısı da dahil olmak üzere tüm uygulama ortamını başlatması gerekir.
Bu nedenle Magento'daki entegrasyon testleri, birim testlerden çok daha yavaş çalışma eğilimindedir (diğer uygulamalardan daha da fazla).

Phpunit içine Magento Bootstrapping

  • Magento'nun otomatik yükleyicisi PSR-0 uyumlu değildir, çünkü bir sınıfın bulunduğu dosyayı bulamazsa bir istisna atar. Bu class_existsphpunit içinde bazı kullanımlarını kırar . Birkaç olası (hacky ise) geçici çözüm vardır:

    • Magento otomatik yükleyicinin kaydını kaldırın, \Varien_Autoload::autoload()içine atılan istisnaları yoksayarak bir dekoratöre sarın ve ambalajı yeni bir otomatik yükleyici olarak kaydedin. Bunun, otomatik yükleyicileri kaydeden ve belirli bir otomatik yükleyici sırasına bağlı olan üçüncü taraf kitaplıklarıyla çakışma olasılığı düşüktür.
    • Magento 1'de yerleşik olanı saran özel bir hata işleyici kullanın. Özel hata işleyicileri, Magento otomatik yükleyici tarafından tetiklenen hataları yutar. Raphael'in test çerçevesinin kullandığı çözüm budur . Bu, diğer üçüncü taraf uzantılarıyla en uyumlu gibi görünüyor.
    • \Varien_Autoload::autoload()Dosya yoksa hatayı atmamak için geçersiz kılmak için dahil etme yolunu kullanın . Ancak bu, aynı sınıfı geçersiz kılan birkaç modülle çakışıyor. Bu yaklaşımı kendim kullanmıyorum.
  • Oturum sırasında hata oluşmasını önlemek için testler sırasında $_SESSON = []önyüklemede ayarlamanız yeterlidir .

  • Mage::app()->setResponse($testResponse)Gerçek olanı genişleten, ancak çıktı veya üstbilgi göndermeyen özel bir yanıt nesnesi ayarlayın .

  • Magento'yu çalışma zamanı durumunu tamamen değiştiren entegrasyon testleri arasında yeniden başlatmak için kullanın Mage::reset(); Mage::app(). Bundan sonra hata işleyicinin yeniden dekore edilmesi gerektiğini unutmayın.

Fikstür

DB fikstürleri için, örneğin fikstür oluşturmak için fikstür yöntemlerinde normal modelleri kullanma eğilimindeyim createSimpleProduct($sku). Raphael'in dediği gibi, testi testten sonra geri alınan bir işlemde (örneğin ) sarmak için setUp()ve tearDown()tuşlarını kullanın Mage::getSingleton('core/resource')->getConnection('default_setup')->beginTransaction().

Mağaza yapılandırma armatürleri için, yalnızca bellek içi armatürleri kullanarak ayarlama eğilimindeyim Mage::app()->getStore()->setConfig($path, $value).

EcomDev_PHPUnitBu uzantı yaml dosyalarını kullanarak DB armatürleri oluşturmak için seçenek sunar, fakat kendim için ben bu sert modeli sınıfları kullanılarak oluşturulmuş armatürleri ile karşılaştırıldığında korumak için bulabilirsiniz. YMMV.

Test Çiftleri

Kayıt defteri Mage::getSingleton(), Mage::getResourceSingleton()ve aracılığıyla oluşturulan nesneler için test çiftlerini enjekte etmek için kullanılabilir Mage::helper().
Diğer bazı merkezi nesneler ayarlanabilir Mage::app()(örneğin istek). Test çiftleri
aracılığıyla Mage::getModel()veya Mage::getResourceModel()test çiftleriyle oluşturulan sınıfları değiştirmek için özel bir yapılandırma nesnesi sarmalayıcısı kullanılmalıdır. Bkz bu örneği olduğunu nasıl gerçekleştirilebileceği Raphael'in testi çerçevesinde.

özet

Magento önyüklendiğinde, hemen hemen her şey oldukça güzel bir şekilde test edilebilir. Çekirdek kod zincirleme yönteminin büyük miktarda nedeniyle derin alaylar oluşturmak için hazırlıklı olsa da kullanır.
Kurulum hacky olmasına rağmen, iyi çalışıyor ve testlerin bana bir çok güven ve değer verdiğini, bir Symphony uygulaması için bir test paketiyle karşılaştırılabilir olduğunu düşünüyorum.


Hiç denemedim ama neden Magento Test Framework kullanmıyorsunuz? ( docs.magento.com/m1/ce/user_guide/magento/… )
Fra

3
Evet denedim, ancak fonksiyonel test (birim veya entegrasyon değil), yavaş, karmaşık ve testler pul pul ve kırılgan olma eğilimindedir. Sonuçta onunla geçirdiğim zamanı bir atık olarak düşündüm.
Vinai

@Vinai Geç olduğunu biliyorum, ama genellikle bir kontrolörde model ve koleksiyonlara çağrılar var, test ederken ihtiyacımız olmayacak. Test çerçevenizi (DigitalPianism) kullanıyorum ve burada TestDouble modelleri yapabiliriz, ancak bir model kullanan bir denetleyici eylemi için bir istekte bulunurken, bu model / toplama çağrısını nasıl alay edebilirim?
arqam
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.