Pengujian snapshot adalah cara menguji tanpa menulis kasus pengujian yang sebenarnya.
Anda dapat mempelajari lebih lanjut dalam video gratis ini dari kursus Pengujian Laravel kami. Jangan khawatir, Anda juga dapat menggunakan paket ini di proyek non-Laravel.
gunakan SpatieSnapshotsMatchesSnapshots;kelas OrderTest {gunakan MatchesSnapshots; fungsi publik test_it_casts_to_json() {$pesanan = Pesanan baru(1);$ini->assertMatchesJsonSnapshot($pesanan->toJson()); } }
Saat pertama kali dijalankan, test runner akan membuat snapshot baru.
> ./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.
Pada proses selanjutnya, pengujian akan lulus selama snapshot tidak berubah.
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
Jika terjadi regresi, pengujian akan gagal!
$orderId = Pesanan baru(2); // Regresi! Adalah `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.
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Anda dapat menginstal paket melalui composer:
komposer memerlukan --dev spatie/phpunit-snapshot-assertions
Untuk membuat pernyataan snapshot, gunakan sifat SpatieSnapshotsMatchesSnapshots
di kelas kasus pengujian Anda. Ini menambahkan satu set metode pernyataan ke kelas:
assertMatchesSnapshot($actual)
assertMatchesFileHashSnapshot($actual)
assertMatchesFileSnapshot($actual)
assertMatchesHtmlSnapshot($actual)
assertMatchesJsonSnapshot($actual)
assertMatchesObjectSnapshot($actual)
assertMatchesTextSnapshot($actual)
assertMatchesXmlSnapshot($actual)
assertMatchesYamlSnapshot($actual)
assertMatchesImageSnapshot($actual)
Mari kita lakukan pernyataan snapshot untuk string sederhana, "foo".
fungsi publik test_it_is_foo() {$this->assertMatchesSnapshot('foo'); }
Saat pertama kali pernyataan dijalankan, pernyataan tersebut tidak memiliki snapshot untuk membandingkan string. Pelari pengujian menghasilkan snapshot baru dan menandai pengujian sebagai tidak lengkap.
> ./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.
Id snapshot dihasilkan berdasarkan nama pengujian dan kasus pengujian. Snapshot dasar mengembalikan representasi teks biasa atau YAML dari nilai sebenarnya.
foo
Mari kita jalankan kembali tesnya. Pelari pengujian akan melihat bahwa sudah ada cuplikan untuk pernyataan tersebut dan melakukan perbandingan.
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
Jika kita mengubah nilai sebenarnya menjadi "bar", pengujian akan gagal karena snapshot masih mengembalikan "foo".
fungsi publik 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.
Saat kita mengharapkan nilai yang berubah, kita perlu memberi tahu pelari pengujian untuk memperbarui snapshot yang ada alih-alih gagal dalam pengujian. Hal ini dimungkinkan dengan menambahkan tanda -d --update-snapshots
ke perintah phpunit
, atau mengatur UPDATE_SNAPSHOTS
env var ke true
.
> ./vendor/bin/phpunit -d --update-snapshots OK (1 test, 1 assertion)
Hasilnya, file snapshot kami mengembalikan "bar" dan bukan "foo".
batang
Sifat MatchesSnapshots
menawarkan dua cara untuk menyatakan bahwa file identik dengan snapshot yang dibuat saat pertama kali pengujian dijalankan:
Pernyataan assertMatchesFileHashSnapshot($filePath)
menegaskan bahwa hash file diteruskan ke fungsi dan hash yang disimpan dalam snapshot cocok. Pernyataan ini cepat dan menggunakan sedikit ruang disk. Kelemahan dari pernyataan ini adalah tidak ada cara mudah untuk melihat perbedaan kedua file jika pengujian gagal.
Pernyataan assertMatchesFileSnapshot($filePath)
bekerja dengan cara yang hampir sama dengan pernyataan hash file, hanya saja pernyataan ini sebenarnya menyimpan seluruh file dalam direktori snapshots. Jika pernyataan gagal, maka file yang gagal akan ditempatkan di sebelah file snapshot sehingga dapat dengan mudah dibandingkan secara manual. File gagal yang masih ada secara otomatis dihapus ketika pengujian berhasil. Pernyataan ini paling berguna ketika bekerja dengan file biner yang harus dibandingkan secara manual seperti gambar atau pdf.
assertImageSnapshot
memerlukan paket spatie/pixelmatch-php untuk diinstal.
Pernyataan ini akan lolos jika gambar yang diberikan hampir sama dengan snapshot yang dibuat saat pertama kali pengujian dijalankan. Anda dapat menyesuaikan ambang batas dengan meneruskan argumen kedua ke pernyataan tersebut. Nilai yang lebih tinggi akan membuat perbandingan menjadi lebih sensitif. Ambang batasnya harus antara 0 dan 1.
$ini->assertMatchesImageSnapshot($imagePath, 0,1);
Id snapshot dihasilkan melalui metode getSnapshotId
pada sifat MatchesSnapshot
. Ganti metode untuk menyesuaikan id. Secara default, ada id snapshot dari nama pengujian, nama kasus pengujian, dan nilai yang bertambah, misalnya Test__my_test_case__1
.
__
Dengan --
fungsi yang dilindungi getSnapshotId(): string{return (new ReflectionClass($this))->getShortName().'--'.$this->name().'--'.$this->snapshotIncrementor; }
Secara default, snapshot disimpan dalam direktori __snapshots__
yang berhubungan dengan kelas pengujian. Hal ini dapat diubah dengan mengganti metode getSnapshotDirectory
.
__snapshots__
menjadi snapshots
fungsi yang dilindungi getSnapshotDirectory(): string{return dirname((new ReflectionClass($this))->getFileName()).DIRECTORY_SEPARATOR.'snapshots'; }
Driver yang digunakan untuk membuat serial data dapat dispesialisasikan sebagai argumen kedua dari metode assertMatchesSnapshot
, sehingga Anda dapat memilih salah satu yang lebih sesuai dengan kebutuhan Anda:
gunakan SpatieSnapshotsDriversJsonDriver; gunakan SpatieSnapshotsMatchesSnapshots;class OrderTest {gunakan MatchesSnapshots; fungsi publik test_snapshot_with_json_driver() {$pesanan = Pesanan baru(1);$ini->assertMatchesSnapshot($pesanan->toJson(), JsonDriver()); } }
Driver memastikan bahwa berbagai jenis data dapat diserialkan dan dicocokkan dengan caranya sendiri. Driver adalah kelas yang mengimplementasikan antarmuka SpatieSnapshotsDriver
, yang memerlukan tiga implementasi metode: serialize
, extension
dan match
.
Mari kita lihat sekilas JsonDriver
.
namespace SpatieSnapshotsDrivers; gunakan PHPUnitFrameworkAssert; gunakan SpatieSnapshotsDriver; gunakan SpatieSnapshotsExceptionsCantBeSerialized; kelas JsonDriver mengimplementasikan Driver {fungsi publik serialisasi($data): string{if (! is_string($data)) {throw new CantBeSerialized('Hanya string yang dapat diserialkan ke json'); }kembalikan json_encode(json_decode($data), JSON_PRETTY_PRINT).PHP_EOL; }ekstensi fungsi publik(): string{return 'json'; } fungsi publik cocok($diharapkan, $aktual) { Tegaskan::assertJsonStringEqualsJsonString($aktual, $diharapkan); } }
Metode serialize
mengembalikan string yang akan ditulis ke file snapshot. Di JsonDriver
, kami akan mendekode dan mengkodekan ulang string json untuk memastikan snapshot memiliki cetakan yang bagus.
Kami ingin menyimpan snapshot json sebagai file json, jadi kami akan menggunakan json
sebagai ekstensi filenya.
Saat mencocokkan data yang diharapkan dengan data aktual, kami ingin menggunakan pernyataan json bawaan PHPUnit, jadi kami akan memanggil metode assertJsonStringEqualsJsonString
tertentu.
Driver dapat digunakan dengan meneruskannya sebagai argumen kedua assertMatchesSnapshot
.
$this->assertMatchesSnapshot($sesuatu->toYaml(), new MyYamlDriver());
Saat menjalankan pengujian dalam Integrasi Berkelanjutan, Anda mungkin ingin menonaktifkan pembuatan snapshot.
Dengan menggunakan parameter --without-creating-snapshots
atau dengan menyetel CREATE_SNAPSHOTS
env var ke false
, PHPUnit akan gagal jika snapshot tidak ada.
> ./vendor/bin/phpunit -d --tanpa-membuat-snapshots 1) ContohTes::test_it_matches_a_string Cuplikan "ExampleTest__test_it_matches_a_string__1.txt" tidak ada. Anda dapat membuatnya secara otomatis dengan menghapus `CREATE_SNAPSHOTS=false` env var, atau `-d --no-create-snapshots` dari argumen CLI PHPUnit.
Jika Anda ingin menjalankan pengujian secara paralel dengan alat seperti Paratest, atau dengan perintah php artisan test --parallel
dari Laravel, Anda harus menggunakan variabel lingkungan.
> CREATE_SNAPSHOTS=tes tukang php palsu --parallel 1) ContohTes::test_it_matches_a_string Cuplikan "ExampleTest__test_it_matches_a_string__1.txt" tidak ada. Anda dapat membuatnya secara otomatis dengan menghapus `CREATE_SNAPSHOTS=false` env var, atau `-d --no-create-snapshots` dari argumen CLI PHPUnit.
Pengguna Windows harus mengonfigurasi akhiran baris mereka di .gitattributes
.
# Snapshot yang digunakan dalam pengujian menyimpan data berseri dan akhir barisnya tidak boleh diubahtests/**/__snapshots__/** biner
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
tes komposer
Silakan lihat KONTRIBUSI untuk rinciannya.
Jika Anda menemukan bug terkait keamanan, silakan kirim email ke [email protected] alih-alih menggunakan pelacak masalah.
Anda bebas menggunakan paket ini, namun jika paket ini masuk ke lingkungan produksi Anda, kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan.
Alamat kami adalah: Spatie, Kruikstraat 22, 2018 Antwerp, Belgia.
Kami mempublikasikan semua kartu pos yang diterima di situs web perusahaan kami.
Sebastian De Deyne
Alex Vanderbist
Semua Kontributor
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.