ApiTestCase คือ PHPUnit TestCase ที่จะทำให้ชีวิตของคุณในฐานะนักพัฒนา Symfony API ง่ายขึ้นมาก มันขยาย Symfony WebTestCase พื้นฐานด้วยคุณสมบัติเจ๋งๆ
ขอบคุณ PHP-Matcher คุณสามารถ "เขียนการตอบสนอง json ที่คาดหวังได้เหมือนนักเลง" ตาม readme เราเห็นด้วยอย่างแน่นอน
นอกจากนี้ยังใช้ Alice เพื่อการโหลดอุปกรณ์ติดตั้ง Doctrine อย่างง่ายดาย
คุณสมบัติ:
สมมติว่าคุณได้ติดตั้ง Composer ทั่วโลกแล้ว:
composer require --dev lchrusciel/api-test-case
และมันก็เสร็จแล้ว! ApiTestCase ทำงานร่วมกับการกำหนดค่าเริ่มต้น
เรามีคลาสพื้นฐานสองคลาสสำหรับกรณีการทดสอบของคุณ: JsonApiTestCase และ XmlApiTestCase เลือกหนึ่งรายการตามรูปแบบของ API ที่คุณต้องการสร้าง
ขั้นตอนการทำงาน TDD พื้นฐานมีดังต่อไปนี้:
assertResponse
เพื่อตรวจสอบว่าเนื้อหาคำตอบตรงกับความคาดหวังของคุณหรือไม่ คุณต้องมีชื่อสำหรับไฟล์ตอบกลับsrc/AppBundle/Tests/Responses/Expected/hello_world.json
เป็นต้นมาดูตัวอย่างง่ายๆ กัน! เขียนแบบทดสอบต่อไปนี้:
namespace AppBundle Tests Controller HelloWorldTest ;
use ApiTestCase JsonApiTestCase ;
class HelloWorldTest extends JsonApiTestCase
{
public function testGetHelloWorldResponse ()
{
$ this -> client -> request ( ' GET ' , ' / ' );
$ response = $ this -> client -> getResponse ();
$ this -> assertResponse ( $ response , ' hello_world ' );
}
}
ตอนนี้ให้กำหนดไฟล์ตอบกลับที่คาดหวัง:
{
"message" : " Hello ApiTestCase World! "
}
ทำการทดสอบของคุณ:
vendor/bin/phpunit
การทดสอบของคุณควรล้มเหลวโดยมีข้อผิดพลาดบางประการ คุณอาจพลาดตัวควบคุมและการกำหนดเส้นทาง ดังนั้นไปข้างหน้าและกำหนดมัน! ทันทีที่คุณใช้คอนโทรลเลอร์และกำหนดค่าการกำหนดเส้นทางที่เหมาะสม คุณสามารถรันการทดสอบได้อีกครั้ง:
หากเนื้อหาการตอบกลับตรงกับความคาดหวังของเรา คอนโซลจะแสดงข้อความง่ายๆ:
OK (1 tests, 2 assertions)
มิฉะนั้นจะแสดงข้อความที่แตกต่างจากที่ได้รับ:
" Hello ApiTestCase World " does not match " Hello ApiTestCase World! " .
@@ -1,4 +1,3 @@
{
- " message " : " Hello ApiTestCase World! "
+ " message " : " Hello ApiTestCase World "
}
-
ประการแรก ฟังก์ชัน assertResponse
จะตรวจสอบโค้ดตอบกลับ (200 เป็นโค้ดตอบกลับเริ่มต้น) จากนั้นจะตรวจสอบว่าส่วนหัวของการตอบกลับมีประเภทเนื้อหา application/json
หรือไม่ ในตอนท้ายจะตรวจสอบว่าเนื้อหาการตอบกลับตรงกับที่คาดหวังหรือไม่ บางครั้งคุณไม่สามารถคาดเดาค่าบางค่าในการตอบกลับได้ เช่น วันที่หรือรหัสที่สร้างขึ้นอัตโนมัติจากฐานข้อมูล ที่นี่ไม่จำเป็นต้องใช้เวทย์มนตร์เพราะ PHP-Matcher มาพร้อมกับตัวช่วย นี่เป็นเพียงตัวอย่างเล็กๆ น้อยๆ ของรูปแบบที่มีอยู่:
@string@
@integer@
@boolean@
@array@
ตรวจสอบเพิ่มเติมเกี่ยวกับเอกสารประกอบของ PHP-Matcher
ด้วยรูปแบบเหล่านี้ การตอบสนองที่คาดหวังของคุณจะมีลักษณะดังนี้:
{
"message" : " @string@ "
}
เมื่อทำเช่นนี้ สตริงใดๆ ใต้ message
คีย์จะตรงกับรูปแบบ คำตอบที่คาดหวังที่ซับซ้อนกว่านี้อาจมีลักษณะดังนี้:
[
{
"id" : " @integer@ " ,
"name" : " Star-Wars T-shirt " ,
"sku" : " SWTS " ,
"price" : 5500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
},
{
"id" : " @integer@ " ,
"name" : " Han Solo Mug " ,
"sku" : " HSM " ,
"price" : 500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
}
]
และจะตรงกับรายการสินค้าดังต่อไปนี้:
array (
array (
' id ' => 1 ,
' name ' => ' Star-Wars T-shirt ' ,
' sku ' => ' SWTS ' ,
' price ' => 5500 ,
' sizes ' => array ( ' S ' , ' M ' , ' L ' ),
' created_at ' => new DateTime (),
),
array (
' id ' => 2 ,
' name ' => ' Han Solo Mug ' ,
' sku ' => ' HSM ' ,
' price ' => 500 ,
' sizes ' => array ( ' S ' , ' L ' ),
' created_at ' => new DateTime (),
),
)
ApiTestCase ถูกรวมเข้ากับ nelmio/alice
ต้องขอบคุณห้องสมุดที่ดีแห่งนี้ คุณสามารถโหลดอุปกรณ์ติดตั้งของคุณได้อย่างง่ายดายเมื่อคุณต้องการ คุณต้องกำหนดอุปกรณ์ติดตั้งของคุณและวางไว้ในไดเร็กทอรีที่เหมาะสม ต่อไปนี้เป็นตัวอย่างวิธีกำหนดอุปกรณ์ติดตั้งและกรณีการใช้งานของคุณ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีกำหนดอุปกรณ์ติดตั้งของคุณ โปรดดูเอกสารประกอบของ Alice
ในการใช้ Alice กับ Doctrine คุณควรเปิดใช้งานบันเดิลเพิ่มเติมสองชุด:
ซิมโฟนี 4.0+
// config/bundles.php
return [
// ...
Nelmio Alice Bridge Symfony NelmioAliceBundle::class => [ ' test ' => true ],
Fidry AliceDataFixtures Bridge Symfony FidryAliceDataFixturesBundle::class => [ ' test ' => true ],
];
ตอนนี้ สมมติว่าคุณมีเอนทิตีหลักคำสอนที่แมปชื่อหนังสือในแอปพลิเคชันของคุณ:
class Book
{
private $ id ;
private $ title ;
private $ author ;
// ...
}
หากต้องการโหลดฟิกซ์เจอร์สำหรับการทดสอบ คุณต้องกำหนดไฟล์ YAML
แบบง่ายใน src/AppBundle/Tests/DataFixtures/ORM/books.yml
:
ApiTestCaseTestEntityBook :
book1 :
title : " Lord of The Rings "
author : " J. R. R. Tolkien "
book2 :
title : " Game of Thrones "
price : " George R. R. Martin "
สุดท้าย หากต้องการใช้ฟิกซ์เจอร์เหล่านี้ในการทดสอบ เพียงเรียกวิธีการที่เหมาะสม:
public function testBooksIndexAction ()
{
// This method require subpath to locate specific fixture file in your DataFixtures/ORM directory.
$ this -> loadFixturesFromFile ( ' books.yml ' );
// There is another method that allows you to load fixtures from directory.
$ this -> loadFixturesFromDirectory ( ' big_library ' );
}
หากต้องการปรับแต่งการกำหนดค่าชุดทดสอบของคุณ คุณสามารถเพิ่มตัวเลือกเพิ่มเติมสองสามรายการให้กับ phpunit.xml:
< php >
< server name = " KERNEL_CLASS " value = " AcmeKernel " />
< server name = " EXPECTED_RESPONSE_DIR " value = " /path/to/expected/responses/ " />
< server name = " FIXTURES_DIR " value = " /path/to/DataFixtures/ORM/ " />
< server name = " OPEN_ERROR_IN_BROWSER " value = " true/false " />
< server name = " OPEN_BROWSER_COMMAND " value = " open %s " />
< server name = " IS_DOCTRINE_ORM_SUPPORTED " value = " true/false " />
< server name = " TMP_DIR " value = " /tmp/path/to/temporary/folder/ " />
< server name = " ESCAPE_JSON " value = " true/false " />
</ php >
KERNEL_CLASS
ช่วยให้คุณสามารถระบุได้อย่างชัดเจนว่าควรใช้คลาสใดเพื่อตั้งค่าเคอร์เนลERESPONSE_DIR
มีเส้นทางไปยังโฟลเดอร์ที่มีการตอบกลับที่คาดหวัง ใช้เมื่อมีการเปรียบเทียบผลลัพธ์ API กับไฟล์ json ที่มีอยู่ หากไม่ได้ตั้งค่านี้ ApiTestCase จะพยายามคาดเดาตำแหน่งของการตอบกลับ โดยค้นหาการตอบกลับในโฟลเดอร์: '../Responses' ซึ่งค่อนข้างจะอยู่ในคลาสทดสอบคอนโทรลเลอร์ของคุณFIXTURES_DIR
มีพาธไปยังโฟลเดอร์ที่มีการติดตั้งข้อมูลของคุณ ตามค่าเริ่มต้น หากไม่ได้ตั้งค่าตัวแปรนี้ มันจะค้นหา ../DataFixtures/ORM/
/ ที่ค่อนข้างอยู่ในคลาสทดสอบของคุณ ApiTestCase พ่น RunTimeException หากไม่มีโฟลเดอร์หรือไม่มีไฟล์ใด ๆ ที่จะโหลดOPEN_ERROR_IN_BROWSER
คือค่าสถานะที่เปิดการแสดงข้อผิดพลาดในหน้าต่างเบราว์เซอร์ ค่าเริ่มต้นเป็นเท็จOPEN_BROWSER_COMMAND
เป็นคำสั่งที่จะใช้ในการเปิดเบราว์เซอร์โดยมีข้อยกเว้นIS_DOCTRINE_ORM_SUPPORTED
คือแฟล็กที่เปิดการสนับสนุนหลักคำสอน รวมถึงตัวโหลดข้อมูลที่มีประโยชน์และการล้างฐานข้อมูลTMP_DIR
มีเส้นทางไปยังโฟลเดอร์ชั่วคราวซึ่งไฟล์บันทึกจะถูกจัดเก็บESCAPE_JSON
คือแฟล็กที่เปิดการ Escape (อักขระ Unicode และเครื่องหมายทับ) ของเอาต์พุต JSON ของคุณก่อนที่จะเปรียบเทียบกับข้อมูลที่คาดหวัง ค่าเริ่มต้นเป็นเท็จ การตั้งค่าสถานะนี้มีไว้เพื่อความเข้ากันได้แบบย้อนหลังกับ ApiTestCase เวอร์ชันก่อนหน้าเท่านั้น (เมื่อเปิดใช้งาน) และจะถูกลบออกในเวอร์ชันต่อๆ ไป ในไดเร็กทอรี test/
คุณสามารถค้นหาโปรเจ็กต์ Symfony ตัวอย่างที่มีการกำหนดค่าขั้นต่ำที่จำเป็นสำหรับการใช้ไลบรารีนี้
ในการรันชุดทดสอบ PHPUnit ของเรา ให้รันคำสั่งต่อไปนี้:
composer install
test/app/console doctrine:database:create
test/app/console doctrine:schema:create
vendor/bin/phpunit
หากคุณพบข้อบกพร่องหรือมีแนวคิดที่ดีในการปรับปรุง โปรดเปิดปัญหาในพื้นที่เก็บข้อมูลนี้
การเผยแพร่จะมีหมายเลขอยู่ในรูปแบบ major.minor.patch
และสร้างโดยมีแนวทางดังต่อไปนี้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ SemVer กรุณาเยี่ยมชมเว็บไซต์ semver.org
ใบอนุญาตสามารถพบได้ที่นี่
ห้องสมุดถูกสร้างขึ้นครั้งแรกโดย:
ที่บริษัท Lakion ภายใต้ https://github.com/Lakion/ApiTestCase repository
ดูรายชื่อผู้ร่วมบริจาค