การติดตั้ง
เนื่องจาก Magento 1 ไม่ได้ใช้นักแต่งเพลงนอกกรอบฉันไม่คิดว่ามันจะสร้างความแตกต่างอย่างมากหากคุณติดตั้ง phpunit โดยใช้นักแต่งเพลงหรือเพียงแค่ดาวน์โหลดเวอร์ชั่นphar
หากคุณใช้นักแต่งเพลงเพื่อจัดการโมดูลหรือไลบรารีบุคคลที่สามอื่น ๆ ในไซต์ของคุณอยู่แล้วผู้เรียบเรียงอาจเหมาะสมที่สุด ยกเว้นว่าคุณใช้ PHP7 คุณจะถูก จำกัด phpunit เวอร์ชันเก่า (นั่นคือเหตุผลที่ฉันเชื่อมโยงกับเวอร์ชั่น 4.8 ด้านบน)
การทดสอบการรวมกับ / / และ / หรือการทดสอบหน่วย
เนื่องจาก Magento 1 นั้นเป็นแอพพลิเคชั่นที่มีน้ำหนักมากมันจึงเป็นเรื่องเหมาะสมที่จะแยก phpunit bootstrap ให้เป็นหนึ่งสำหรับการรวมเข้าด้วยกันและอีกอันสำหรับการทดสอบหน่วย
bootstrap ทดสอบหน่วยจะต้องเริ่มต้น autoloader เท่านั้นในขณะที่ bootstrap ทดสอบรวมจะต้องเริ่มต้นสภาพแวดล้อมของแอปพลิเคชันทั้งหมดรวมถึงการโหลดการกำหนดค่าและการเชื่อมต่อ db
เนื่องจากการทดสอบการรวมใน Magento มีแนวโน้มที่จะทำงานช้าลงมากจากนั้นทำการทดสอบหน่วย (ยิ่งไปกว่านั้นในการใช้งานอื่น ๆ )
Bootstrapping Magento สู่ phpunit
Autoloader ของ Magento ไม่เข้ากันได้กับ PSR-0 เนื่องจากมันมีข้อยกเว้นหากไม่สามารถหาไฟล์ที่มี class อยู่ในนั้นสิ่งนี้จะเป็นการแบ่งประเพณีของclass_exists
phpunit มีวิธีแก้ปัญหาที่เป็นไปได้หลายอย่าง (ถ้าแฮ็ก):
- ยกเลิกการลงทะเบียนตัวโหลดอัตโนมัติของวีโอไอพีโดยห่อ
\Varien_Autoload::autoload()
ในมัณฑนากรโดยไม่สนใจข้อยกเว้นที่อยู่ภายในและลงทะเบียนตัวห่อหุ้มเป็นออโต้โหลดใหม่ สิ่งนี้มีโอกาสน้อยที่จะเกิดข้อขัดแย้งกับห้องสมุดบุคคลที่สามซึ่งลงทะเบียนออโต้โหลดและขึ้นอยู่กับคำสั่งออโต้โหลดที่เฉพาะเจาะจง
- ใช้ตัวจัดการข้อผิดพลาดที่กำหนดเองซึ่งรวมอยู่ใน Magento 1 ตัวจัดการข้อผิดพลาดที่กำหนดเองจะกลืนข้อผิดพลาดที่เกิดจากระบบอัตโนมัติของ Magento นี่คือวิธีการแก้ปัญหาว่าราฟาเอลของการใช้กรอบทดสอบ ดูเหมือนว่าจะเข้ากันได้กับส่วนขยายอื่น ๆ ของบุคคลที่สามมากที่สุด
- ใช้การรวมเส้นทางแฮ็กเพื่อแทนที่
\Varien_Autoload::autoload()
เพื่อไม่ให้เกิดข้อผิดพลาดหากไฟล์ไม่มีอยู่ อย่างไรก็ตามสิ่งนี้ขัดแย้งกับหลายโมดูลที่แทนที่คลาสเดียวกัน ฉันไม่ได้ใช้วิธีการนี้ด้วยตนเอง
เพื่อหลีกเลี่ยงข้อผิดพลาดจากเซสชันที่กำลังเริ่มต้นในระหว่างการทดสอบเพียงแค่ตั้งค่า$_SESSON = []
ใน bootstrap
ตั้งค่าวัตถุการตอบสนองที่กำหนดเองผ่านทางMage::app()->setResponse($testResponse)
ที่ขยายจริง แต่ไม่ส่งออกหรือส่วนหัว
Mage::reset(); Mage::app()
เพื่อเตรียมใช้งานใหม่วีโอไอพีระหว่างการทดสอบการรวมที่สมบูรณ์เปลี่ยนสถานะรันไทม์ใช้ โปรดทราบว่าหลังจากนั้นตัวจัดการข้อผิดพลาดจะต้องได้รับการตกแต่งใหม่
การแข่งขัน
สำหรับการติดตั้ง DB createSimpleProduct($sku)
ฉันมักจะใช้รูปแบบปกติในวิธีการติดตั้งเพื่อสร้างการแข่งขันเช่น เช่นเดียวกับ Raphael ที่กล่าวว่าใช้setUp()
และtearDown()
ห่อการทดสอบในธุรกรรมที่ย้อนกลับหลังการทดสอบ (ตัวอย่างMage::getSingleton('core/resource')->getConnection('default_setup')->beginTransaction()
)
สำหรับการกำหนดค่าการติดตั้งร้านค้าฉันมักจะตั้งค่าการติดตั้งในหน่วยความจำโดยใช้Mage::app()->getStore()->setConfig($path, $value)
เท่านั้น
EcomDev_PHPUnit
นามสกุลยังมีตัวเลือกในการสร้างการติดตั้ง DB ใช้ไฟล์ yaml แต่สำหรับตัวเองผมพบว่าผู้ที่ยากที่จะรักษาเมื่อเทียบกับการแข่งขันที่สร้างขึ้นโดยใช้รูปแบบการเรียน YMMV
ทดสอบสองเท่า
สตรีที่สามารถใช้ในการฉีดคู่ทดสอบสำหรับวัตถุที่สร้างขึ้นผ่านทางMage::getSingleton()
, และMage::getResourceSingleton()
สามารถตั้งค่าวัตถุกลางอื่น ๆ ได้(เช่นคำขอ)
ในการแทนที่คลาสที่สร้างผ่านหรือด้วยการทดสอบเป็นสองเท่าจะต้องใช้wrapperการกำหนดค่าวัตถุแบบกำหนดเอง ดูตัวอย่างนี้ในกรอบการทดสอบของราฟาเอลว่าทำได้อย่างไร Mage::helper()
Mage::app()
Mage::getModel()
Mage::getResourceModel()
สรุป
เมื่อวีโอไอพีทำการบู๊ตแล้วทุกอย่างก็สามารถทำการทดสอบได้ค่อนข้างดี ได้เตรียมที่จะสร้าง mocks ลึกเพราะจำนวนมากของวิธีการผูกมัดรหัสหลักที่ใช้แม้ว่า
แม้ว่าการตั้งค่าจะแฮ็ก แต่ก็ใช้งานได้ดีและฉันพบว่าการทดสอบให้ความมั่นใจและความคุ้มค่าเป็นอย่างมากเทียบได้กับชุดทดสอบสำหรับแอป Symphony