การทดสอบสแนปชอตเป็นวิธีการทดสอบโดยไม่ต้องเขียนกรณีทดสอบจริง
คุณสามารถเรียนรู้เพิ่มเติมในวิดีโอฟรีนี้จากหลักสูตรการทดสอบ Laravel ของเรา ไม่ต้องกังวล คุณสามารถใช้แพ็คเกจนี้ในโปรเจ็กต์ที่ไม่ใช่ Laravel ได้เช่นกัน
ใช้ SpatieSnapshotsMatchesSnapshots;class OrderTest {ใช้ MatchesSnapshots; ฟังก์ชั่นสาธารณะ test_it_casts_to_json() {$order = คำสั่งซื้อใหม่(1);$this->assertMatchesJsonSnapshot($order->toJson()); - -
ในการวิ่งครั้งแรก ผู้ทดสอบจะสร้างภาพรวมใหม่
> ./vendor/bin/phpunit There was 1 incomplete test: 1) OrderTest::test_it_casts_to_json Snapshot created for OrderTest__test_it_casts_to_json__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
ในการรันครั้งต่อไป การทดสอบจะผ่านตราบใดที่สแนปชอตไม่เปลี่ยนแปลง
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
หากมีการถดถอยการทดสอบจะล้มเหลว!
$orderId = คำสั่งซื้อใหม่(2); //ถดถอย! คือ `1`
> ./vendor/bin/phpunit 1) OrderTest::test_it_casts_to_json Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ Failed asserting that '{"id":2}' matches JSON string "{ "id": 1 } FAILURES! Tests: 1, Assertions: 1, Failures: 1.
เราลงทุนทรัพยากรจำนวนมากเพื่อสร้างแพ็คเกจโอเพ่นซอร์สที่ดีที่สุดในระดับเดียวกัน คุณสามารถสนับสนุนเราได้โดยการซื้อหนึ่งในผลิตภัณฑ์ที่ต้องชำระเงินของเรา
เราขอขอบคุณเป็นอย่างยิ่งที่คุณส่งโปสการ์ดจากบ้านเกิดของคุณถึงเรา โดยระบุว่าคุณใช้แพ็คเกจใดของเรา คุณจะพบที่อยู่ของเราในหน้าติดต่อของเรา เราเผยแพร่โปสการ์ดที่ได้รับทั้งหมดบนวอลล์โปสการ์ดเสมือนของเรา
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
ผู้แต่งต้องการ --dev spatie/phpunit-snapshot-assertions
หากต้องการยืนยันสแน็ปช็อต ให้ใช้ลักษณะ SpatieSnapshotsMatchesSnapshots
ในคลาสกรณีทดสอบของคุณ นี่เป็นการเพิ่มชุดของวิธีการยืนยันในชั้นเรียน:
assertMatchesSnapshot($actual)
assertMatchesFileHashSnapshot($actual)
assertMatchesFileSnapshot($actual)
assertMatchesHtmlSnapshot($actual)
assertMatchesJsonSnapshot($actual)
assertMatchesObjectSnapshot($actual)
assertMatchesTextSnapshot($actual)
assertMatchesXmlSnapshot($actual)
assertMatchesYamlSnapshot($actual)
assertMatchesImageSnapshot($actual)
เรามายืนยันสแน็ปช็อตสำหรับสตริงง่ายๆ "foo" กัน
ฟังก์ชั่นสาธารณะ test_it_is_foo() {$this->assertMatchesSnapshot('foo'); -
ในครั้งแรกที่การยืนยันทำงาน จะไม่มีสแน็ปช็อตที่จะเปรียบเทียบสตริงด้วย ผู้ทดสอบจะสร้างสแน็ปช็อตใหม่และทำเครื่องหมายการทดสอบว่าไม่สมบูรณ์
> ./vendor/bin/phpunit There was 1 incomplete test: 1) ExampleTest::test_it_matches_a_string Snapshot created for ExampleTest__test_it_matches_a_string__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
รหัสสแนปชอตจะถูกสร้างขึ้นตามชื่อการทดสอบและกรณีทดสอบ สแน็ปช็อตพื้นฐานจะแสดงข้อความธรรมดาหรือการแสดง YAML ของค่าจริง
ฟู
เรามาทำการทดสอบกันใหม่ ผู้ทดสอบจะเห็นว่ามีภาพรวมสำหรับการยืนยันอยู่แล้วจึงทำการเปรียบเทียบ
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
หากเราเปลี่ยนค่าจริงเป็น "bar" การทดสอบจะล้มเหลวเนื่องจากสแน็ปช็อตยังคงส่งคืน "foo"
ฟังก์ชั่นสาธารณะ test_it_is_foo() {$this->assertMatchesSnapshot('bar'); -
> ./vendor/bin/phpunit 1) ExampleTest::test_it_matches_a_string Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' FAILURES! Tests: 1, Assertions: 1, Failures: 1.
เมื่อเราคาดว่าจะมีการเปลี่ยนแปลงค่า เราต้องแจ้งให้ผู้ทดสอบอัปเดตสแน็ปช็อตที่มีอยู่แทนที่จะทำให้การทดสอบล้มเหลว สิ่งนี้เป็นไปได้โดยการเพิ่มแฟล็ก -d --update-snapshots
ให้กับคำสั่ง phpunit
หรือตั้งค่า UPDATE_SNAPSHOTS
env var ให้เป็น true
> ./vendor/bin/phpunit -d --update-snapshots OK (1 test, 1 assertion)
ด้วยเหตุนี้ ไฟล์สแน็ปช็อตของเราจะส่งคืน "bar" แทนที่จะเป็น "foo"
บาร์
คุณลักษณะ MatchesSnapshots
มีสองวิธีในการยืนยันว่าไฟล์เหมือนกับสแน็ปช็อตที่เกิดขึ้นในครั้งแรกที่เรียกใช้การทดสอบ:
การยืนยัน assertMatchesFileHashSnapshot($filePath)
ยืนยันว่าแฮชของไฟล์ส่งผ่านไปยังฟังก์ชันและแฮชที่บันทึกไว้ในการจับคู่สแน็ปช็อต การยืนยันนี้รวดเร็วและใช้พื้นที่ดิสก์น้อยมาก ข้อเสียของการยืนยันนี้คือไม่มีวิธีง่ายๆ ในการดูว่าไฟล์ทั้งสองแตกต่างกันอย่างไรหากการทดสอบล้มเหลว
การยืนยัน assertMatchesFileSnapshot($filePath)
ทำงานเกือบจะในลักษณะเดียวกับการยืนยันแฮชไฟล์ ยกเว้นว่าจริง ๆ แล้วมันจะบันทึกไฟล์ทั้งหมดในไดเร็กทอรีสแน็ปช็อต หากการยืนยันล้มเหลว ระบบจะวางไฟล์ที่ล้มเหลวไว้ข้างไฟล์สแน็ปช็อต เพื่อให้สามารถเปรียบเทียบด้วยตนเองได้อย่างง่ายดาย ไฟล์ที่ล้มเหลวที่คงอยู่จะถูกลบโดยอัตโนมัติเมื่อผ่านการทดสอบ การยืนยันนี้มีประโยชน์มากที่สุดเมื่อทำงานกับไฟล์ไบนารีที่ควรเปรียบเทียบด้วยตนเอง เช่น รูปภาพหรือ PDF
assertImageSnapshot
จำเป็นต้องติดตั้งแพ็คเกจ spatie/pixelmatch-php
การยืนยันนี้จะผ่านหากรูปภาพที่ให้มาเกือบจะเหมือนกับสแน็ปช็อตที่ทำในครั้งแรกที่รันการทดสอบ คุณสามารถกำหนดเกณฑ์เองได้โดยส่งอาร์กิวเมนต์ที่สองไปยังการยืนยัน ค่าที่สูงกว่าจะทำให้การเปรียบเทียบมีความละเอียดอ่อนมากขึ้น เกณฑ์ควรอยู่ระหว่าง 0 ถึง 1
$this->assertMatchesImageSnapshot($imagePath, 0.1);
รหัสสแนปชอตถูกสร้างขึ้นผ่านเมธอด getSnapshotId
บนลักษณะ MatchesSnapshot
แทนที่วิธีการปรับแต่งรหัส ตามค่าเริ่มต้น จะมีรหัสสแน็ปช็อตสำหรับชื่อการทดสอบ ชื่อกรณีการทดสอบ และค่าที่เพิ่มขึ้น เช่น Test__my_test_case__1
__
ด้วย --
ฟังก์ชั่นที่ได้รับการป้องกัน getSnapshotId(): string{return (new ReflectionClass($this))->getShortName().'--'.$this->name().'--'.$this->snapshotIncreationor; -
ตามค่าเริ่มต้น สแน็ปช็อตจะถูกจัดเก็บไว้ในไดเร็กทอรี __snapshots__
ที่เกี่ยวข้องกับคลาสทดสอบ ซึ่งสามารถเปลี่ยนแปลงได้โดยการแทนที่เมธอด getSnapshotDirectory
__snapshots__
เป็น snapshots
ฟังก์ชั่นที่ได้รับการป้องกัน getSnapshotDirectory(): string{return dirname((new ReflectionClass($this))->getFileName()).DIRECTORY_SEPARATOR.'snapshots'; -
ไดรเวอร์ที่ใช้ในการทำให้ข้อมูลเป็นอนุกรมสามารถระบุเป็นอาร์กิวเมนต์ที่สองของเมธอด assertMatchesSnapshot
ได้ ดังนั้นคุณจึงสามารถเลือกไดรเวอร์ที่เหมาะกับความต้องการของคุณได้:
ใช้ SpatieSnapshotsDriversJsonDriver; ใช้ SpatieSnapshotsMatchesSnapshots; การทดสอบลำดับคลาส {ใช้ MatchesSnapshots; ฟังก์ชั่นสาธารณะ test_snapshot_with_json_driver() {$order = คำสั่งซื้อใหม่(1);$this->assertMatchesSnapshot($order->toJson(), JsonDriver ใหม่()); - -
ไดรเวอร์ช่วยให้มั่นใจได้ว่าข้อมูลประเภทต่างๆ สามารถเรียงลำดับและจับคู่ได้ในแบบของตัวเอง ไดรเวอร์คือคลาสที่ใช้อินเทอร์เฟซ SpatieSnapshotsDriver
ซึ่งต้องมีการใช้งานสามวิธี: serialize
extension
และ match
มาดู JsonDriver
กันอย่างรวดเร็ว
เนมสเปซ SpatieSnapshotsDrivers; ใช้ PHPUnitFrameworkAssert; ใช้ SpatieSnapshotsDriver; ใช้ SpatieSnapshotsExceptionsCantBeSerialized; คลาส JsonDriver ใช้ไดรเวอร์ {public function serialize($data): string{if (! is_string($data)) {throw new CantBeSerialized('เฉพาะสตริงเท่านั้นที่สามารถซีเรียลไลซ์เป็น json'); }ส่งคืน json_encode(json_decode($data), JSON_PRETTY_PRINT).PHP_EOL; } ส่วนขยายฟังก์ชันสาธารณะ (): สตริง {return 'json'; } การจับคู่ฟังก์ชันสาธารณะ($คาดหวัง, $จริง) - Assert::assertJsonStringEqualsJsonString($จริง, $คาดหวัง); - -
วิธี serialize
จะส่งกลับสตริงซึ่งจะถูกเขียนลงในไฟล์สแน็ปช็อต ใน JsonDriver
เราจะถอดรหัสและเข้ารหัสสตริง json อีกครั้งเพื่อให้แน่ใจว่าสแน็ปช็อตมีการพิมพ์ที่ค่อนข้างดี
เราต้องการบันทึกสแน็ปช็อต json เป็นไฟล์ json ดังนั้นเราจะใช้ json
เป็นนามสกุลไฟล์
เมื่อจับคู่ข้อมูลที่คาดหวังกับข้อมูลจริง เราต้องการใช้การยืนยัน json ในตัวของ PHPUnit ดังนั้นเราจะเรียกเมธอด assertJsonStringEqualsJsonString
ที่เฉพาะเจาะจง
สามารถใช้ไดรเวอร์ได้โดยส่งผ่านเป็นอาร์กิวเมนต์ที่สองของ assertMatchesSnapshot
$this->assertMatchesSnapshot($something->toYaml(), MyYamlDriver ใหม่());
เมื่อรันการทดสอบในการบูรณาการอย่างต่อเนื่อง คุณอาจต้องการปิดการใช้งานการสร้างสแน็ปช็อต
โดยใช้พารามิเตอร์ --without-creating-snapshots
หรือโดยการตั้งค่า CREATE_SNAPSHOTS
env var เป็น false
PHPUnit จะล้มเหลวหากไม่มีสแน็ปช็อต
> ./vendor/bin/phpunit -d --without-creating-snapshots 1) ตัวอย่างการทดสอบ::test_it_matches_a_string ไม่มีสแนปชอต "ExampleTest__test_it_matches_a_string__1.txt" คุณสามารถสร้างได้โดยอัตโนมัติโดยการลบ `CREATE_SNAPSHOTS=false` env var หรือ `-d --no-create-snapshots` ของอาร์กิวเมนต์ CLI ของ PHPUnit
หากคุณต้องการรันการทดสอบควบคู่ไปกับเครื่องมืออย่าง Paratest หรือด้วยคำสั่ง php artisan test --parallel
ของ Laravel คุณจะต้องใช้ตัวแปรสภาพแวดล้อม
> CREATE_SNAPSHOTS=การทดสอบช่าง PHP ที่เป็นเท็จ --ขนาน 1) ตัวอย่างการทดสอบ::test_it_matches_a_string ไม่มีสแนปชอต "ExampleTest__test_it_matches_a_string__1.txt" คุณสามารถสร้างได้โดยอัตโนมัติโดยการลบ `CREATE_SNAPSHOTS=false` env var หรือ `-d --no-create-snapshots` ของอาร์กิวเมนต์ CLI ของ PHPUnit
ผู้ใช้ Windows ควรกำหนดค่าการลงท้ายบรรทัดเป็น . .gitattributes
# สแน็ปช็อตที่ใช้ในการทดสอบจะเก็บข้อมูลต่อเนื่องและการสิ้นสุดบรรทัดควรปล่อยให้ไม่มีการเปลี่ยนแปลงtests/**/__snapshots__/** binary
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมว่ามีอะไรเปลี่ยนแปลงเมื่อเร็วๆ นี้
การทดสอบผู้แต่ง
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
หากคุณพบข้อบกพร่องเกี่ยวกับการรักษาความปลอดภัย โปรดส่งอีเมลมาที่ [email protected] แทนการใช้ตัวติดตามปัญหา
คุณใช้แพ็คเกจนี้ได้ฟรี แต่ถ้าเหมาะกับสภาพแวดล้อมการใช้งานจริงของคุณ เราขอขอบคุณอย่างยิ่งที่คุณส่งโปสการ์ดจากบ้านเกิดของคุณมาให้เรา โดยระบุแพ็คเกจที่คุณใช้อยู่
ที่อยู่ของเราคือ: Spatie, Kruikstraat 22, 2018 แอนต์เวิร์ป, เบลเยียม
เราเผยแพร่ไปรษณียบัตรที่ได้รับทั้งหมดบนเว็บไซต์ของบริษัทของเรา
เซบาสเตียน เดอ ไดน์
อเล็กซ์ แวนเดอร์บิสต์
ผู้ร่วมให้ข้อมูลทั้งหมด
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม