Pengujian ialah aspek kritikal pembangunan perisian yang memastikan aplikasi anda berfungsi seperti yang dimaksudkan. Laravel menyediakan suite ujian yang teguh di luar kotak dengan PHPUnit, rangka kerja ujian popular untuk PHP. Panduan ini akan membimbing anda melalui penyediaan dan menjalankan ujian dalam Laravel, menerangkan perbezaan antara ujian unit dan ciri serta menyediakan contoh untuk pelbagai senario ujian.
Dalam Laravel, ujian biasanya disusun ke dalam dua direktori utama: Unit dan Ciri.
Ujian Unit: Ujian ini direka bentuk untuk menguji bahagian kecil dan terpencil aplikasi anda, seperti kaedah atau kelas individu. Mereka biasanya terletak dalam direktori ujian/Unit. Setiap fungsi ujian hendaklah bermula dengan ujian perkataan.
Contoh:
public function testExampleFunction() { $this->assertTrue(true); }
Ujian Ciri: Ujian ini mengendalikan interaksi yang lebih kompleks dan biasanya menguji beberapa komponen yang berfungsi bersama. Ia terletak dalam direktori ujian/Ciri. Ujian ciri selalunya melibatkan membuat permintaan HTTP dan menyemak respons.
Untuk menjalankan semua ujian dalam aplikasi Laravel anda, gunakan arahan berikut:
./vendor/bin/phpunit
Sebelum menjalankan ujian, adalah penting untuk mengkonfigurasi persekitaran ujian anda. Ubah suai fail phpunit.xml anda untuk menetapkan pembolehubah persekitaran untuk ujian. Contohnya, untuk menggunakan pangkalan data dalam memori SQLite untuk ujian yang lebih pantas:
<php> <env name="APP_ENV" value="testing"></env> <env name="APP_MAINTENANCE_DRIVER" value="file"></env> <env name="BCRYPT_ROUNDS" value="4"></env> <env name="CACHE_STORE" value="array"></env> <env name="DB_CONNECTION" value="sqlite"></env> <env name="DB_DATABASE" value=":memory:"></env> <env name="MAIL_MAILER" value="array"></env> <env name="PULSE_ENABLED" value="false"></env> <env name="QUEUE_CONNECTION" value="sync"></env> <env name="SESSION_DRIVER" value="array"></env> <env name="TELESCOPE_ENABLED" value="false"></env> </php>
Selepas mendayakan SQLite sebagai persekitaran ujian anda, kosongkan cache konfigurasi:
php artisan config:clear
*Contoh: Menguji jika Laluan Profil Wujud dan Berfungsi Dengan Betul
*
Buat ujian untuk laluan profil:
php artisan make:test ProfileTest
Tambah kaedah ujian untuk menyemak sama ada halaman profil memaparkan teks tertentu:
public function testProfilePage(){ $response = $this->get('/profile'); $response->assertSeeText('Your Profile'); }
Menyediakan Pangkalan Data Pengujian
Sebelum menguji interaksi pangkalan data, buat konfigurasi pangkalan data ujian dalam config/database.php:
'mysqltesting' => [ 'driver' => 'mysql', 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => 'laravel_testing', 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
Menjalankan Ujian Pangkalan Data
Jalankan arahan PHPUnit untuk memastikan pangkalan data ujian dibuat dan berfungsi:
./vendor/bin/phpunit
Buat ujian untuk pendaftaran pengguna:
php artisan make:test UserTest
Tambah kaedah ujian untuk mengesahkan pengguna boleh dibuat dan disimpan ke pangkalan data:
public function test_registration(): void { $user = new User(); $user->name = 'Test User'; $user->email = 'email@example.com'; $user->password = bcrypt('password'); $user->save(); $this->assertDatabaseHas('users', ['email' => 'email@example.com']); }
Buat ujian untuk tindakan kedai dalam kelas PostTest:
public function testPostStoreValid() { $data = [ 'title'=> 'Test Post', 'slug' => 'test-post', 'content' => 'Content of the post', 'active' => true, ]; $this->post('/posts', $data) ->assertStatus(302) ->assertSessionHas('status'); $this->assertEquals(session('status'), 'Post was created!'); }
Tambah kaedah ujian untuk menyemak ralat pengesahan:
public function testPostFail() { $data = [ 'title'=> '', 'content' => '', ]; $this->post('/posts', $data) ->assertStatus(302) ->assertSessionHas('errors'); $messages = session('errors')->getMessages(); $this->assertEquals($messages['title'][0], 'The title must be at least 4 characters.'); $this->assertEquals($messages['title'][1], 'The title field is required.'); $this->assertEquals($messages['content'][0], 'The content field is required.'); }
*Tindakan Kemas Kini Pengujian
*
Tambah kaedah ujian untuk mengemas kini siaran:
public function testPostUpdate() { $post = new Post(); $post->title = "Initial Title"; $post->slug = Str::slug($post->title, '-'); $post->content = "Initial content"; $post->active = true; $post->save(); $this->assertDatabaseHas('posts', $post->toArray()); $data = [ 'title' => 'Updated Title', 'slug' => 'updated-title', 'content' => 'Updated content', 'active' => false, ]; $this->put("/posts/{$post->id}", $data) ->assertStatus(302) ->assertSessionHas('status'); $this->assertDatabaseHas('posts', ['title' => $data['title']]); $this->assertDatabaseMissing('posts', ['title' => $post->title]); }
Menguji Tindakan Padam
Tambah kaedah ujian untuk memadamkan siaran:
public function testPostDelete() { $post = new Post(); $post->title = "Title to delete"; $post->slug = Str::slug($post->title, '-'); $post->content = "Content to delete"; $post->active = true; $post->save(); $this->assertDatabaseHas('posts', $post->toArray()); $this->delete("/posts/{$post->id}") ->assertStatus(302) ->assertSessionHas('status'); $this->assertDatabaseMissing('posts', $post->toArray()); }
**
**
Untuk menjalankan kaedah atau kelas ujian tertentu, gunakan pilihan --filter dengan PHPUnit. Berikut ialah beberapa contoh:
Jalankan Kaedah Ujian Khusus
./vendor/bin/phpunit --filter PostTest::testPostDelete
Jalankan Semua Ujian dalam Kelas Tertentu
./vendor/bin/phpunit --filter PostTest
Jalankan Ujian dalam Fail Tertentu
./vendor/bin/phpunit tests/Feature/PostTest.php
Output Verbose
Untuk keluaran yang lebih terperinci, tambahkan pilihan -v:
./vendor/bin/phpunit --filter PostTest::testPostDelete -v
Atas ialah kandungan terperinci Panduan Komprehensif untuk Menguji dalam Laravel dengan PHPUnit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!