يعد اختبار اللقطة طريقة للاختبار دون كتابة حالات اختبار فعلية.
يمكنك معرفة المزيد في هذا الفيديو المجاني من دورة اختبار Laravel. لا تقلق، يمكنك استخدام هذه الحزمة في مشاريع غير Laravel أيضًا.
استخدم SpatieSnapshotsMatchesSnapshots;class OrderTest {استخدم MatchesSnapshots؛ اختبار الوظيفة العامة_it_casts_to_json() {$order = new 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 = new Order(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 للقيمة الفعلية.
foo
دعونا نعيد الاختبار. سوف يرى القائم بالاختبار أن هناك بالفعل لقطة للتأكيد ويقوم بإجراء مقارنة.
> ./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->snapshotIncrementor; }
افتراضيًا، يتم تخزين اللقطات في دليل __snapshots__
المتعلق بفئة الاختبار. يمكن تغيير ذلك عن طريق تجاوز طريقة getSnapshotDirectory
.
__snapshots__
إلى snapshots
الوظيفة المحمية getSnapshotDirectory(): string{return dirname((new ReflectionClass($this))->getFileName()).DIRECTORY_SEPARATOR.'snapshots'; }
يمكن تحديد برنامج التشغيل المستخدم لتسلسل البيانات باعتباره وسيطًا ثانيًا للأسلوب assertMatchesSnapshot
، بحيث يمكنك اختيار برنامج يناسب احتياجاتك بشكل أفضل:
استخدم SpatieSnapshotsDriversJsonDriver؛استخدم SpatieSnapshotsMatchesSnapshots؛فئة OrderTest {استخدم MatchesSnapshots؛ اختبار الوظيفة العامة_snapshot_with_json_driver() {$order = new Order(1);$this->assertMatchesSnapshot($order->toJson(), new JsonDriver()); } }
تضمن برامج التشغيل إمكانية إجراء تسلسل لأنواع مختلفة من البيانات ومطابقتها بطريقتها الخاصة. برنامج التشغيل عبارة عن فئة تنفذ واجهة SpatieSnapshotsDriver
، والتي تتطلب تنفيذ ثلاث طرق: serialize
extension
match
.
دعونا نلقي نظرة سريعة على JsonDriver
.
مساحة الاسم SpatieSnapshotsDrivers;استخدام PHPUnitFrameworkAssert;استخدام SpatieSnapshotsDriver;استخدام SpatieSnapshotsExceptionsCantBeSerialized;فئة JsonDriver تنفذ برنامج التشغيل {تسلسل الوظيفة العامة($data): string{if (! is_string($data)) {throw new CantBeSerialized('يمكن إجراء تسلسل للسلاسل فقط إلى json'); }return json_encode(json_decode($data), JSON_PRETTY_PRINT).PHP_EOL; }امتداد الوظيفة العامة (): سلسلة {return 'json'؛ }تطابق الوظيفة العامة($متوقع، $فعلي) { Assert::assertJsonStringEqualsJsonString($actual, $expected); } }
تقوم طريقة serialize
بإرجاع سلسلة سيتم كتابتها في ملف اللقطة. في JsonDriver
، سنقوم بفك تشفير سلسلة json وإعادة تشفيرها لضمان طباعة اللقطة بشكل جيد.
نريد حفظ لقطات json كملفات json، لذلك سنستخدم json
كامتداد الملف الخاص بها.
عند مطابقة البيانات المتوقعة مع البيانات الفعلية، نريد استخدام تأكيدات json المضمنة في PHPUnit، لذلك سنستدعي الأسلوب المحدد لـ assertJsonStringEqualsJsonString
.
يمكن استخدام برامج التشغيل عن طريق تمريرها كوسيطة ثانية لـ assertMatchesSnapshot
.
$this->assertMatchesSnapshot($something->toYaml(), new MyYamlDriver());
عند إجراء اختباراتك في التكامل المستمر، قد ترغب في تعطيل إنشاء اللقطات.
باستخدام المعلمة --without-creating-snapshots
أو عن طريق تعيين var CREATE_SNAPSHOTS
env على false
، ستفشل PHPUnit في حالة عدم وجود اللقطات.
> ./vendor/bin/phpunit -d --without-creating-snapshots 1) exampleTest::test_it_matches_a_string اللقطة "ExampleTest__test_it_matches_a_string__1.txt" غير موجودة. يمكنك إنشاؤه تلقائيًا عن طريق إزالة `CREATE_SNAPSHOTS=false` env var، أو `-d --no-create-snapshots` من وسيطات واجهة سطر الأوامر الخاصة بـ PHPUnit.
إذا كنت تريد إجراء الاختبار بالتوازي مع أداة مثل Paratest، أو باستخدام الأمر php artisan test --parallel
الخاص بـ Laravel، فسيتعين عليك استخدام متغيرات البيئة.
> CREATE_SNAPSHOTS=اختبار حرفي php خاطئ --parallel 1) exampleTest::test_it_matches_a_string اللقطة "ExampleTest__test_it_matches_a_string__1.txt" غير موجودة. يمكنك إنشاؤه تلقائيًا عن طريق إزالة `CREATE_SNAPSHOTS=false` env var، أو `-d --no-create-snapshots` من وسيطات واجهة سطر الأوامر الخاصة بـ PHPUnit.
يجب على مستخدمي Windows تكوين نهايات الأسطر الخاصة بهم في .gitattributes
.
# اللقطات المستخدمة في الاختبارات تحتوي على بيانات متسلسلة ويجب ترك نهاية سطرها دون تغييرtests/**/__snapshots__/** ثنائي
الرجاء مراجعة سجل التغيير لمزيد من المعلومات عما تغير مؤخرًا.
اختبار الملحن
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
إذا وجدت خطأً يتعلق بالأمان، فيرجى إرسال بريد إلكتروني إلى العنوان [email protected] بدلاً من استخدام أداة تعقب المشكلات.
أنت حر في استخدام هذه الحزمة، ولكن إذا وصلت إلى بيئة الإنتاج الخاصة بك، فإننا نقدر بشدة إرسالك لنا بطاقة بريدية من مسقط رأسك، مع ذكر الحزمة (الحزم) التي تستخدمها.
عنواننا هو: سباتي، كرويكسترات 22، 2018 أنتويرب، بلجيكا.
ننشر جميع البطاقات البريدية المستلمة على موقع شركتنا.
سيباستيان دي دين
أليكس فاندربيست
جميع المساهمين
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.