ชุดรวมนี้มีคุณสมบัติที่ช่วยให้คุณเรียกใช้ชุดทดสอบของแอปที่ใช้ Symfony-framework ได้อย่างมีประสิทธิภาพมากขึ้นด้วยการทดสอบแบบแยกส่วน
มันมี StaticDriver
ที่จะรวมคลาส Driver
ที่กำหนดค่าไว้เดิมของคุณ (เช่น DBALDriverPDOMysqlDriver
) และเก็บการเชื่อมต่อฐานข้อมูลแบบคงที่ในกระบวนการ php ปัจจุบัน
ด้วยความช่วยเหลือของคลาสส่วนขยาย PHPUnit จะเริ่มธุรกรรมก่อนทุกกรณีการทดสอบ และย้อนกลับอีกครั้งหลังจากการทดสอบเสร็จสิ้นสำหรับการเชื่อมต่อ DBAL ที่กำหนดค่าไว้ทั้งหมด ซึ่งส่งผลให้ประสิทธิภาพเพิ่มขึ้น เนื่องจากไม่จำเป็นต้องสร้างสคีมาใหม่ นำเข้าดัมพ์ SQL สำรอง หรือแทรกฟิกซ์เจอร์ใหม่ก่อนทุกกรณีทดสอบ ตราบใดที่คุณหลีกเลี่ยงการออกคำสั่ง DDL ที่อาจส่งผลให้เกิดการทำธุรกรรมโดยนัย (เช่น ALTER TABLE
, DROP TABLE
ฯลฯ ดู https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis) การทดสอบของคุณจะถูกแยกออกและทั้งหมดจะเห็น สถานะฐานข้อมูลเดียวกัน
นอกจากนี้ยังมี Psr6StaticArrayCache
ที่จะได้รับการกำหนดค่าโดยอัตโนมัติเป็นข้อมูลเมตาและแคชแบบสอบถามสำหรับ EntityManager ทั้งหมด สิ่งนี้ช่วยปรับปรุงความเร็วและการใช้หน่วยความจำสำหรับชุดทดสอบของฉันได้อย่างมาก! สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณมีการทดสอบจำนวนมากที่บูตเคอร์เนล (เช่น การทดสอบคอนโทรลเลอร์หรือการทดสอบ ContainerAware) และใช้เอนทิตี Doctrine
ติดตั้งผ่านผู้แต่ง
ผู้แต่งต้องการ --dev dama/doctrine-test-bundle
หากคุณไม่ได้ใช้ Flex ให้เปิดใช้งานบันเดิลโดยการเพิ่มคลาสใน Bundles.php
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['ทดสอบ' => จริง],//...];
เริ่มต้นจากเวอร์ชัน 8 และเฉพาะเมื่อใช้ DBAL < 4 คุณต้องตรวจสอบให้แน่ใจว่าคุณได้เปิดใช้ use_savepoints
ในการกำหนดค่า DBAL หลักของคุณสำหรับการเชื่อมต่อที่เกี่ยวข้องทั้งหมด:
หลักคำสอน: dbal: การเชื่อมต่อ: ค่าเริ่มต้น: use_savepoints: จริง
เพิ่มส่วนขยายให้กับการกำหนดค่า PHPUnit XML ของคุณ
PHPUnit 8 หรือ 9:
<phpunit> - <ส่วนขยาย> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </ส่วนขยาย> </phpunit>
PHPหน่วย 10+:
<phpunit> - <ส่วนขยาย> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </ส่วนขยาย> </phpunit>
ตรวจสอบให้แน่ใจว่าคุณมี phpunit/phpunit
สำหรับการพึ่งพา dev
( เวอร์ชัน 8, 9 และ 10 ได้รับการสนับสนุนด้วยส่วนขยายในตัว ) เพื่อรันการทดสอบของคุณ นอกจากนี้ บันเดิลนี้ยังเข้ากันได้กับ symfony/phpunit-bridge
และสคริปต์ simple-phpunit
(หมายเหตุ: คุณอาจต้องตรวจสอบให้แน่ใจว่า phpunit-bridge ต้องการเวอร์ชัน PHPUnit 8+ ที่ถูกต้อง โดยใช้ตัวแปรสภาพแวดล้อม SYMFONY_PHPUNIT_VERSION
)
แค่นั้นแหละ! จากนี้ไปการเปลี่ยนแปลงใด ๆ ที่คุณทำกับฐานข้อมูลภายในแต่ละ testcase เดียว (ไม่ว่าจะเป็น WebTestCase
หรือ KernelTestCase
หรือการทดสอบที่กำหนดเองใด ๆ ) จะถูกย้อนกลับโดยอัตโนมัติสำหรับคุณ
เปิดใช้งานส่วนขยายในการกำหนดค่า Behat ของคุณ (เช่น behat.yml
)
ค่าเริ่มต้น: # ... ส่วนขยาย: DAMADoctrineTestBundleBehatServiceContainerDoctrineExtension: ~
แค่นั้นแหละ! จากนี้ไปการเปลี่ยนแปลงใดๆ ก็ตามที่คุณทำกับฐานข้อมูลภายในแต่ละสถานการณ์จะถูกย้อนกลับโดยอัตโนมัติสำหรับคุณ
โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะในกรณีที่การทดสอบดำเนินการในกระบวนการเดียวกับ Behat ซึ่งหมายความว่าจะไม่สามารถทำงานได้เมื่อใช้ เช่น Selenium เพื่อเรียกใช้แอปพลิเคชันของคุณ
บันเดิลจะแสดงการกำหนดค่าที่มีลักษณะเช่นนี้ตามค่าเริ่มต้น:
dama_doctrine_test:enable_static_connection: trueenable_static_meta_data_cache: trueenable_static_query_cache: จริง
การตั้งค่า enable_static_connection: true
หมายความว่าจะเปิดใช้งานสำหรับการเชื่อมต่อ dbal หลักที่กำหนดค่าไว้ทั้งหมด
คุณสามารถเลือกเปิดใช้งานได้สำหรับการเชื่อมต่อบางอย่างเท่านั้นหากจำเป็น:
dama_doctrine_test:enable_static_connection:connection_a: จริง
ตามค่าเริ่มต้น การเชื่อมต่อ DBAL หลักที่กำหนดค่าไว้ทั้งหมดจะมีการเชื่อมต่อไดรเวอร์ของตัวเองที่ได้รับการจัดการในกระบวนการ php ปัจจุบัน ในกรณีที่คุณต้องการปรับแต่งลักษณะการทำงานนี้ คุณสามารถเลือก "คีย์การเชื่อมต่อ" อื่นที่ใช้เพื่อเลือกการเชื่อมต่อไดรเวอร์ได้
ตัวอย่างสำหรับการเชื่อมต่อ 2 รายการที่จะใช้อินสแตนซ์การเชื่อมต่อไดรเวอร์เดียวกันอีกครั้ง:
doctrine:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# การกำหนดคีย์เดียวกันจะส่งผลให้มีการเชื่อมต่อไดรเวอร์ภายในเดียวกันที่ถูกนำมาใช้อีกครั้ง การเชื่อมต่อ DBAL ทั้งสองเริ่มต้น: custom_keyfoo: custom_key
ตั้งแต่เวอร์ชัน 8.1.0 : สำหรับการเชื่อมต่อที่มีแบบจำลองการอ่าน/เขียน บันเดิลจะใช้การเชื่อมต่อไดรเวอร์พื้นฐาน เดียวกัน ตามค่าเริ่มต้นสำหรับตัวจำลองหลักและสำหรับแบบจำลองด้วย วิธีนี้เน้นปัญหาความไม่สอดคล้องกันที่เกิดขึ้นเมื่ออ่าน/เขียนไปยังการเชื่อมต่อที่แตกต่างกัน นอกจากนี้ยังสามารถปรับแต่งได้ดังนี้:
doctrine:dbal:connections:default:url: '%database.url%'replicas:replica_one:url: '%database.url_replica%'dama_doctrine_test:connection_keys:# การกำหนดคีย์ที่แตกต่างกันจะส่งผลให้การเชื่อมต่อไดรเวอร์ภายในแยกกันถูกใช้สำหรับหลักและ Replicadefault:หลัก: custom_key_primaryreplicas:replica_one: custom_key_replica
คุณสามารถดูตัวอย่างการใช้งานภายในการทดสอบการทำงานที่รวมอยู่ในชุดนี้: https://github.com/dmaicher/doctrine-test-bundle/tree/master/tests
bootstrap ฐานข้อมูลเริ่มต้นเสร็จสิ้นโดยใช้ไฟล์ bootstrap PHPUnit: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/bootstrap.php
การทดสอบหลายอย่างที่ทำให้แน่ใจว่าการเปลี่ยนแปลงใด ๆ จากการทดสอบก่อนหน้าจะถูกย้อนกลับ: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/PhpunitTest.php
บันเดิลนี้ยังใช้กับชุดทดสอบ Symfony Demo อย่างเป็นทางการ: https://github.com/symfony/demo
บางครั้งการดีบักเนื้อหาฐานข้อมูลเมื่อการทดสอบล้มเหลวอาจเป็นประโยชน์ ตามปกติการเปลี่ยนแปลงทั้งหมดจะถูกย้อนกลับโดยอัตโนมัติ คุณสามารถทำได้ด้วยตนเอง:
ฟังก์ชั่นสาธารณะ testMyTestCaseThatINeedToDebug() {// ... สิ่งที่เปลี่ยนแปลงสถานะ DBDAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// ตอนนี้การเปลี่ยนแปลงฐานข้อมูลยังคงอยู่จริงและคุณสามารถแก้ไขข้อบกพร่องได้}
ในกรณีที่คุณกำลังเรียกใช้ (อาจโดยไม่รู้ตัว) แบบสอบถามในระหว่างการทดสอบของคุณที่กระทำธุรกรรมที่เปิดอยู่โดยปริยาย (ดู https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html ตัวอย่าง) คุณอาจเห็นข้อผิดพลาดดังนี้:
DoctrineDBALDriverPDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
ขณะนี้ยังไม่มีวิธีใดที่บันเดิลนี้จะทำงานกับการสืบค้นเหล่านั้นได้ เนื่องจากไม่สามารถย้อนกลับได้หลังจากกรณีการทดสอบเสร็จสิ้น
ดูเพิ่มเติม #58