Petua untuk menguji kerja beratur dalam Laravel

Mary-Kate Olsen
Lepaskan: 2024-09-19 22:20:33
asal
302 orang telah melayarinya

Apabila bekerja dengan aplikasi Laravel, adalah perkara biasa untuk menghadapi senario di mana arahan perlu melaksanakan tugas yang mahal. Untuk mengelak daripada menyekat proses utama, anda mungkin memutuskan untuk memunggah tugasan ke kerja yang boleh diproses dengan baris gilir.

Mari kita lihat contoh. Bayangkan aplikasi arahan:import-users perlu membaca fail CSV yang besar dan mencipta pengguna untuk setiap entri. Begini rupa perintah itu:

/* ImportUsersCommand.php */

namespace App\Console\Commands;

/*...*/

class ImportUsersCommand extends Command
{
    protected $signature = 'app:import-users';

    public function handle()
    {
        dispatch(new ImportUsersJob());

        $this->line('Users imported successfully.');
        $this->line('There are: ' . User::count(). ' Users.');
    }
}
Salin selepas log masuk

Dalam contoh ini, arahan menghantar tugas untuk mengendalikan pembacaan fail dan penciptaan pengguna. Beginilah rupa ImportUsersJob.php:

/* ImportUsersJob.php */

namespace App\Jobs;

/*...*/

class ImportUsersJob implements ShouldQueue
{
    public function handle(FileReader $reader): void
    {   
        foreach($reader->read('users.csv') as $data) {
            User::create([
                'name' => $data['name'], 
                'email' => $data['email'],
            ]);
        }
    }
}
Salin selepas log masuk

Apabila menguji ciri ini, ujian biasa untuk arahan itu mungkin kelihatan seperti ini:

/* ImportUsersCommandTest.php */

namespace Tests\Feature;

/*...*/

class ImportUsersCommandTest extends TestCase
{
    use RefreshDatabase;

    public function test_it_processes_the_file(): void
    {
        Storage::fake('local')->put('users.csv', "...");

        $this->artisan('app:import-users')
            ->expectsOutput('Users imported successfully.')
            ->expectsOutput('There are: 10 Users.')
            ->assertSuccessful();

        $this->assertDatabaseCount('users', 10);
    }
}
Salin selepas log masuk

Pada pandangan pertama, ujian ini nampaknya berfungsi dengan sempurna. Menjalankan suite ujian menunjukkan hasil yang berjaya:

Tips for testing queued jobs in Laravel

Pelaksanaan Dunia Sebenar

Walau bagaimanapun, apabila anda menjalankan perintah app:import-users dalam persekitaran sebenar, anda mungkin mendapat hasil yang tidak dijangka:

Tips for testing queued jobs in Laravel

Seperti yang anda lihat, output arahan menunjukkan bahawa terdapat 0 pengguna dalam pangkalan data. Jadi, Mengapa ini berlaku?

Alasannya ialah tugas itu dihantar ke baris gilir, jadi ia tidak berjalan serentak dengan pelaksanaan arahan. Pengguna akan dibuat hanya apabila baris gilir memproses kerja kemudian.

Mengapa ujian itu lulus?

Suit ujian menggunakan pemacu baris gilir penyegerakan secara lalai, bermakna kerja diproses secara serentak semasa ujian. Akibatnya, kerja berjalan serta-merta, memberikan idea bahawa semuanya berfungsi seperti yang diharapkan.

Walaupun gelagat ini boleh diterima dalam persekitaran ujian, adalah penting untuk menyedari bahawa keputusan dunia sebenar bergantung pada konfigurasi QUEUE_CONNECTION dalam persekitaran pengeluaran anda. Dan memandangkan keperluan projek anda, anda mungkin tahu bahawa kerja itu akan diproses dalam baris gilir tak segerak.

Sebaik sahaja anda mengetahui perbezaan ini, anda mungkin ingin memperbaik ujian anda untuk mengelakkan "positif palsu".

Menguji kerja anda dihantar

Pertama sekali, adalah penting untuk mengesahkan bahawa arahan itu benar-benar menghantar kerja, tidak kira sama ada kerja itu diproses secara serentak atau tidak segerak. Begini cara untuk mengujinya:

/* ImportUsersCommandTest.php */

namespace Tests\Feature;

/*...*/

class ImportUsersCommandTest extends TestCase
{    
    public function test_it_dispatches_the_job(): void
    {
        Queue:fake();

        $this->artisan('app:import-users')
            ->expectsOutput('Process has been queued.')
            ->assertSuccessful();

        Queue::assertPushed(ImportUsersJob::class);
    }
}
Salin selepas log masuk

Menguji kerja anda diproses

Setelah anda mengesahkan bahawa tugas itu dihantar, anda boleh menguji kerja sebenar yang dilakukan oleh kerja itu dalam ujian berasingan. Begini cara anda boleh menstruktur ujian untuk kerja itu:

/* ImportUsersJobTest.php */

namespace Tests\Feature;

/*...*/

class ImportUsersJobTest extends TestCase
{
    use refreshDatabase;

    public function test_it_processes_the_file()
    {
        Storage::fake('local')->put('users.csv', "...");

        app()->call([new ImportUsersJob(), 'handle']);

        $this->assertDatabaseCount('users', 10);
    }
}

Salin selepas log masuk

Ini memastikan kerja melaksanakan kerja yang diperlukan, tidak kira sama ada ia diproses dengan baris gilir atau serentak.

Mengendalikan kes tepi

Seperti dalam kehidupan sebenar, kes tepi mungkin berlaku dan anda harus bersedia untuk ini.

Sistem baris gilir Laravel, mengikut konfigurasi pekerja anda, akan mencuba semula kerja apabila pengecualian berlaku dan jika percubaan semula melebihi, kerja itu akan ditandakan sebagai gagal.

Jadi, apa yang berlaku jika fail itu tidak wujud? Anda perlu mengendalikan kes kelebihan sedemikian dengan mengesahkan input dan membuang pengecualian apabila perlu.

Begini cara anda boleh mengendalikan perkara ini dalam kerja anda:

/* ImportUsersJobTest.php */

namespace App\Jobs;

/*...*/

class ImportUsersJob implements ShouldQueue
{
    use Queueable;

    public function handle(FileReader $reader): void
    {   
        if(!Storage::disk('local')->exists('users.csv')){
            throw new Exception('The users.csv file doesn\'t exist.')
        }

        foreach($reader->read('users.csv') as $data) {
            User::create([
                'name' => $data['name'], 
                'email' => $data['email'],
            ]);
        }
    }
}
Salin selepas log masuk

Begini cara anda menguji senario ini:

/* ImportUsersJobTest.php */

namespace Tests\Feature;

/*...*/

class ImportUsersJobTest extends TestCase
{
    use refreshDatabase;

    /*...*/

    public function test_it_fails_when_file_doesnt_exist(): void
    {
        Storage::fake('local');

        $this->expectException(Exception::class);
        $this->expectExceptionMessage('The users.csv file doesn\'t exist.');

        dispatch(new ImportUsersJob());
    }
}

Salin selepas log masuk

Fikiran akhir

Pendekatan ini memastikan ujian anda menggambarkan dengan lebih tepat cara kerja akan diproses di dunia nyata.
Strategi yang sama boleh digunakan apabila pengawal menghantar tugas ke baris gilir atau tempat pendengar acara dibariskan.
Seperti biasa, laraskan amalan ini agar sesuai dengan projek dan pasukan anda.

Saya suka mendengar pendapat anda!

Atas ialah kandungan terperinci Petua untuk menguji kerja beratur dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!