เมื่อฉันเขียนโมดูลของฉันฉันพยายามจัดหาการทดสอบหน่วยสำหรับส่วนที่สำคัญที่สุดของแอปพลิเคชัน อย่างไรก็ตามในขณะนี้ (Magento 2.1.3) มีหลายวิธีในการเขียนแบบทดสอบหน่วย:
วิธีทดสอบต่าง ๆ
- รวมเข้ากับ
bin/magento dev:tests:run unit
และรันบนการตั้งค่า phpunit เริ่มต้นที่มาพร้อมกับ Magento - เขียนแยกต่างหากเรียกใช้พวกเขาด้วย
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
และเยาะเย้ยทุกอย่างที่เป็นวีโอไอพี - เขียนแยกต่างหากจำลองทุกอย่างและใช้ PHPUnit เวอร์ชันสากลของระบบ
- เขียนแยกต่างหากเรียกใช้ด้วย
vendor/bin/phpunit
แต่ยังใช้งาน\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
ได้
Magento 2 และ PHPUnit
นอกจากนั้น Magento 2 ยังมาพร้อมกับ PHPUnit 4.1.0 ซึ่งไม่รองรับ PHP7 ชาวบ้านประเภทการบอกใบ้ (ชอบstring
และ `int) และการประกาศผลตอบแทนประเภทในลายเซ็นของคุณจะทำให้เกิดข้อผิดพลาด ตัวอย่างเช่นอินเตอร์เฟส / คลาสที่มีลายเซ็นเมธอดดังนี้:
public function foo(string $bar) : bool;
... จะไม่สามารถเยาะเย้ยโดย PHPUnit 4.1.0 :-(
สถานการณ์ปัจจุบันของฉัน
เป็นเพราะเหตุนี้ตอนนี้ฉันส่วนใหญ่เขียนการทดสอบหน่วยของฉันในวิธีที่สาม (โดยการเรียกรุ่น PHPUnit ทั่วโลกระบบ)
ในการตั้งค่าของฉันฉันมี PHPUnit 5.6 ติดตั้งอยู่ทั่วโลกดังนั้นฉันจึงสามารถแก้ไขเขียนรหัส PHP7 ที่เหมาะสม แต่ฉันต้องปรับแต่งบางอย่าง ตัวอย่างเช่น:
phpunit.xml
ต้องมีลักษณะเช่นนี้ดังนั้นฉันสามารถใช้ประโยชน์จากออโต้โหลดผู้แต่ง:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... และในทุกsetUp()
วิธี - ฉันมีการตรวจสอบต่อไปนี้เพื่อให้ฉันสามารถเขียนการทดสอบของฉันกับความเข้ากันได้ไปข้างหน้า:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
ด้วยวิธีนี้เมื่อการทดสอบของฉันดำเนินการโดย PHPUnit ในตัวของ Magentos จะไม่เกิดข้อผิดพลาด
คำถามของฉัน
ดังนั้นนี่คือคำถามของฉัน: นี่คือวิธีการเขียนการทดสอบหน่วยที่ดีต่อสุขภาพหรือไม่ เพราะมันดูไม่ถูกต้องสำหรับฉันว่า Magento มาพร้อมกับเครื่องมือมากมายเพื่อช่วยในการทดสอบและฉันไม่สามารถใช้งานได้เพราะฉันใช้ PHP7 ฉันรู้ว่ามีตั๋วใน GitHub ที่แก้ไขปัญหานี้ แต่ฉันสงสัยว่าชุมชนกำลังเขียนบททดสอบอยู่หรือไม่
มีวิธีเขียนการทดสอบหน่วยใน Magento 2 หรือไม่ดังนั้นฉันไม่ต้อง 'ลดระดับ' รหัสของฉันและยังสามารถใช้ตัวช่วยในตัวของ Magentos สำหรับการเยาะเย้ยทุกอย่างที่ผู้จัดการวัตถุแตะต้อง? หรือมันเป็นวิธีปฏิบัติที่ไม่ดีที่จะใช้ตัวจัดการวัตถุแม้ในการทดสอบหน่วยของคุณ?
ฉันไม่มีคำแนะนำ / ตัวอย่างมากมายในวิธีที่เหมาะสมในการทดสอบหน่วยโมดูลที่คุณกำหนดเอง