น้ำท่วมการทดสอบที่เด่นชัด... ฉันเดาว่าคุณสามารถละทิ้งส่วน -db- ได้ถ้าคุณต้องการคำที่สั้นลงเล็กน้อยและรู้สึกโน้มเอียงมาก
Test-DB-Acle เป็นไลบรารี PHP ที่อำนวยความสะดวกในการเขียนการทดสอบที่ง่ายและกระชับสำหรับเลเยอร์ฐานข้อมูล
ฉันเชื่อว่าการทดสอบการเขียนควรง่ายที่สุดสำหรับนักพัฒนา และควรอ่านได้ง่ายที่สุดเพื่อให้นักพัฒนารายอื่นเข้าใจ
ซึ่งหมายความว่าข้อมูลการทดสอบใดๆ ในการทดสอบควรเกี่ยวข้องกับสถานการณ์การทดสอบเท่านั้น อย่างไรก็ตาม ตารางฐานข้อมูลส่วนใหญ่มีคอลัมน์ที่ไม่เป็นค่าว่าง ซึ่งคุณต้องป้อนข้อมูลจำลองที่เป็นเพียงการนำสัญญาณรบกวนทางปัญญามาสู่การทดสอบ
Test-Db-Acle มีเป้าหมายที่จะขจัดภาระนี้ออกไปจากนักพัฒนา กรอบงานการทดสอบไม่ได้ตั้งสมมติฐานใดๆ เกี่ยวกับวิธีการทำงานของคลาสเลเยอร์ฐานข้อมูลของคุณ หากใช้ ORM เช่น Doctrine, Stored Procedure หรือ SQL แบบตรง หลักการจะเหมือนกันเสมอ ในบางจุดโค้ดจะโต้ตอบกับข้อมูลในตาราง DB และเราจำเป็นต้องทดสอบสิ่งนี้
การติดตั้งผ่านผู้แต่ง
ปิดการใช้งานการตรวจสอบคีย์ต่างประเทศในฐานข้อมูล
จัดการกับคอลัมน์ที่ไม่ใช่ค่าว่างโดยอัตโนมัติ
ตัดคอลัมน์วันที่/เวลาใน mysql โดยอัตโนมัติเมื่อยืนยันค่าในตาราง db - มีประโยชน์สำหรับการประทับเวลาที่แทรก (ใน Sqlite ต้องระบุคอลัมน์เหล่านี้)
ส่วนประกอบทั้งหมดสามารถแลกเปลี่ยนและแทนที่ด้วยพันธุ์แบบกำหนดเองได้
รองรับ Mysql และ Sqlite ในปัจจุบัน
เฟรมเวิร์กไม่เชื่อเรื่องพระเจ้า จึงไม่สันนิษฐานว่าจะใช้ ORM เป็นตัวอย่างหรือไม่ และควรนำไปปรับใช้กับเฟรมเวิร์กการทดสอบหน่วยอื่นๆ ได้อย่างง่ายดาย
ฐานข้อมูลที่รองรับในปัจจุบันคือ MySql (และตามส่วนขยาย MariaDB) และ Sqlite
สถาปัตยกรรมควรอนุญาตให้เพิ่มฐานข้อมูลเพิ่มเติมได้
ไลบรารีนี้สามารถใช้งานได้ทันทีกับ PHPUnit มันควรจะค่อนข้างง่ายที่จะใช้กับกรอบการทดสอบอื่น ๆ โดยใช้คุณสมบัติที่ให้มาและการมอบหมายวิธี 'assertEquals' ให้กับวิธีที่เทียบเท่ากัน (เช่น ฉันจำได้ว่ามันเป็น 'assertEqual' ใน SimpleTest)
ฉันได้จัดเตรียม TestDbAclePhpUnitAbstractTestCase แบบง่าย ๆ เช่นเดียวกับ TestDbAclePhpUnitTraitsDatabaseHelperTrait หากคุณใช้ PHP 5.4 และไม่สนใจการใช้คุณลักษณะ
ตกลง ถ้าพูดตามตรงแล้ว การทดสอบเลเยอร์ฐานข้อมูลนั้นมีราคาแพงและทำให้การทดสอบช้าลง และหากเป็นไปได้ การขึ้นต่อกันในฐานข้อมูลก็ควรถูกล้อเลียน แต่บางครั้งเราก็ต้องทำเช่นนี้ หวังว่าในแอปพลิเคชันที่มีโครงสร้างดี จะสามารถรักษาสิ่งนี้ให้น้อยที่สุดได้
มีเครื่องมือและแนวทางมากมาย (เช่น DBUnit หรือการใช้วิธีการจากโรงงานในการทดสอบหน่วยของคุณ) เพื่อช่วยในการทดสอบฐานข้อมูล ซึ่งแต่ละวิธีก็มีจุดแข็งของตัวเอง แนวทางนี้เหมาะกับฉันเพราะ:
ฉันไม่ต้องกังวลกับคอลัมน์ว่างหรือข้อจำกัดของคีย์ต่างประเทศ
ฉันจัดเตรียมชุดข้อมูลขั้นต่ำสำหรับการทดสอบของฉัน
ฉันสามารถดูข้อมูลการทดสอบในรูปแบบคล้ายตารางด้านบนการทดสอบและอีกครั้งเมื่อยืนยันข้อมูลในฐานข้อมูล
ดังนั้นฉันจึงตั้งค่าโซลูชันของตัวเอง
###แล้วมันทำงานยังไงและมีหน้าตาเป็นยังไง? แสดงตัวอย่างให้ฉันดู!###
แนวคิดคือการใช้สตริงข้อความ "ค่าที่แยกจากไปป์" ลองเรียกมันว่า PSV - เช่นเดียวกับใน CSV แต่เมื่อใช้ไปป์ - เพื่อตั้งค่าฟิกซ์เจอร์ทดสอบเช่นนี้:
(รูปแบบของ PSV นั้นคล้ายคลึงกับรูปแบบที่ใช้โดยเฟรมเวิร์ก Behat BDD ที่ยอดเยี่ยมมาก (https://github.com/Behat/Behat))
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//ใช้สิ่งนี้หากคุณไม่ต้องการ ใช้คุณลักษณะที่ให้มาหรือกรณีทดสอบเชิงนามธรรม$testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//ใช้สิ่งนี้หากคุณขยายกรณีทดสอบของคุณจาก TestDbAclePhpUnitAbstractTestCase หรือใช้ TestDbAclePhpUnitTraitsDatabaseHelperTrait:$this->setupTables($dbTablesToSetup);
กรอบงานเองรู้ว่าคอลัมน์ใดที่ไม่สามารถเป็น NULL ในตารางและแทรกค่าเริ่มต้น... อันที่จริง สมมติว่าตาราง table_name มี 30 คอลัมน์ซึ่งทั้งหมดไม่เป็นค่าว่าง....
นอกจากนี้ อาจมีข้อจำกัดคีย์ต่างประเทศต่างๆ เกิดขึ้นเบื้องหลัง Test-Db-Acle ปิดใช้งานการตรวจสอบคีย์ต่างประเทศชั่วคราว ดังนั้นเราจึงไม่ต้องกังวลเกี่ยวกับเรื่องนี้ หรือเราจะแทรกข้อมูลทดสอบตามลำดับใด
###แล้วการทดสอบจริงล่ะ.....?### ก่อนอื่น หากคุณใช้ PHP5.4 คุณสามารถใช้เวอร์ชันคุณลักษณะได้:
คลาส ExampleTest ขยาย PHPUnit_Framework_TestCase ใช้งาน TestDbAclePhpUnitAbstractTestCaseInterface {ใช้ TestDbAclePhpUnitTraitsDatabaseHelperTrait; /** * จำเป็นต้องใช้วิธีนี้ โดยควรส่งคืนวัตถุ PDO ที่จะใช้ในการติดตั้งฐานข้อมูล * * @return Pdo */public function ProvidePdo() {คืน Pdo ใหม่ ("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * ตัวอย่างการทดสอบ */ฟังก์ชันสาธารณะ test_AddressService() {$this->setupTables(" [ที่อยู่] address_id |บริษัท 1 |ฉัน 3 |คุณ [ผู้ใช้] user_id |ชื่อ 10 |จอห์น 20 |Mary "); $this->setAutoIncrease('ที่อยู่', 100); $this->addressService->addEntry("พวกเขา");$this->assertTableStateContains(" [ที่อยู่] address_id |บริษัท 1 |ฉัน 3 |คุณ 100 |พวกเขา [ผู้ใช้] user_id |ชื่อ 10 |จอห์น 20 |Mary ", array(), "งานต่างๆ"); - -
หากคุณไม่ใช้คุณลักษณะ คุณสามารถใช้ AbstractTestCase
ได้ อย่างไรก็ตาม คุณจะไม่สามารถใช้คลาสการทดสอบพื้นฐานของคุณเองในกรณีนั้นได้
คลาส ExampleTest ขยาย TestDbAclePhpUnitAbstractTestCase { ป้องกัน $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * จำเป็นต้องใช้วิธีนี้ โดยควรส่งคืนวัตถุ PDO ที่จะใช้ในการติดตั้งฐานข้อมูล * * @return Pdo */public function ProvidePdo() {คืน Pdo ใหม่ ("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }ฟังก์ชัน test_AddressService() {$this->setupTables(" [ที่อยู่] address_id |บริษัท 1 |ฉัน 3 |คุณ [ผู้ใช้] user_id |ชื่อ 10 |จอห์น 20 |Mary "); $this->setAutoIncrease('ที่อยู่', 100); $this->addressService->addEntry("พวกเขา");$this->assertTableStateContains(" [ที่อยู่] address_id |บริษัท 1 |ฉัน 3 |คุณ 100 |พวกเขา [ผู้ใช้] user_id |ชื่อ 10 |จอห์น 20 |Mary ", array(), "งานต่างๆ"); - -
ตกลง เห็นได้ชัดว่า ServicesAddressService ไม่มีอยู่ที่นี่ (เฮ้ มันคือการทดสอบก่อนใช่ไหม) และตัวอย่างก็ค่อนข้างง่าย
ในชีวิตจริง ฉันจะใส่เมธอด getPdo ไว้ในคลาสการทดสอบพื้นฐานทั่วไปสำหรับโปรเจ็กต์ และอาจได้รับแตกต่างจากที่นี่ค่อนข้างมาก แต่นี่ คือ ตัวอย่าง
อย่างที่คุณเห็น setupTables สามารถตั้งค่าหลายตารางพร้อมกันได้ และ assertTableStateContains สามารถตรวจสอบสถานะของตารางต่างๆ ในเวลาเดียวกันได้เช่นกัน
เช่นเดียวกับวิธีที่ setupTables สามารถตั้งค่าตารางที่มีคอลัมน์มากกว่าที่ระบุไว้ assertTableStateContains จะเปรียบเทียบและยืนยันค่าของคอลัมน์ที่ระบุเท่านั้น
วิธีที่ง่ายที่สุดในการติดตั้ง Test-Db-Acle คือการใช้ผู้แต่ง ( อ่านเพิ่มเติมที่นี่: http://packagist.org ) และฉันขอแนะนำอย่างยิ่งให้ใช้วิธีนี้ แม้ว่าคุณจะสามารถแตกไฟล์แพ็คเกจลงในโฟลเดอร์และเปิดใช้งานการโหลดอัตโนมัติได้ ด้วยตนเองในรูปแบบใดก็ตามที่คุณต้องการ (ใช้แบบแผนการตั้งชื่อ psr-0)
หากต้องการใช้กับผู้แต่ง ให้เพิ่มสิ่งนี้ลงในไฟล์ composer.json ของคุณ:
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
คุณยังสามารถใช้https://packagist.org/packages/test-db-acle/test-db-acle ได้หากต้องการ
การมีส่วนร่วม (และการวิพากษ์วิจารณ์) เป็นเรื่องที่น่ายินดี...!
###วิธีรันการทดสอบ Test-Db-Acle### หากต้องการรันการทดสอบ คุณจะต้องสร้างฐานข้อมูลว่างบนเซิร์ฟเวอร์ MySql ที่คุณเลือก จากนั้นคัดลอก test/Functional/config.php.dist ไปยัง tests/ Functional/config.php และเติมรายละเอียดฐานข้อมูลของคุณ หวังว่าการทดสอบทั้งหมดจะดำเนินการ (จริงๆ แล้วฐานข้อมูลจำเป็นสำหรับการทดสอบควันเชิงฟังก์ชันเท่านั้น)
ไวยากรณ์พีเอสวี
บทคัดย่อTestCase
การขยายและปรับแต่ง TestDbAcle
บันทึกการเปลี่ยนแปลง