Rumah > pembangunan bahagian belakang > tutorial php > Cara Menulis Pengawal Ujian Gaya JavaScript di PHP

Cara Menulis Pengawal Ujian Gaya JavaScript di PHP

Lisa Kudrow
Lepaskan: 2025-02-09 10:58:10
asal
687 orang telah melayarinya

How to Write JavaScript-Style Test Watchers in PHP

mata teras

    Mengintegrasikan pemerhati ujian gaya JavaScript ke dalam projek PHP, mengautomasikan pra-proses penukaran fail, dan ujian unit semula apabila fail berubah, dengan itu meningkatkan kecekapan pembangunan.
  • Sediakan ujian automatik dengan alat seperti phpUnit dan perhatikan pengubahsuaian fail menggunakan phpunit-watcher untuk memastikan pengesan maklum balas dan kesilapan segera semasa pembangunan.
  • Melaksanakan skrip pra -proses dalam projek PHP, yang membolehkan penukaran sintaks yang serupa dengan Babel JavaScript, dengan itu meningkatkan keserasian dan mengurangkan usaha pengekodan manual.
  • Konfigurasikan persekitaran ujian PHP untuk membina semula fail yang telah diproses secara automatik sebelum menguji, mengekalkan liputan kod yang tepat dan memudahkan proses ujian.
  • Terokai konfigurasi lanjutan menggunakan pemerhati fail untuk secara selektif membina semula fail yang diubahsuai, dengan ketara mempercepatkan kitaran ujian sejumlah besar fail dalam projek besar.

Artikel ini dikaji semula oleh Younes Rafie. Terima kasih kepada semua pengulas rakan sebaya untuk mendapatkan kandungan SitePoint dengan sebaik -baiknya!


Saya tidak menulis ujian untuk kod saya pada mulanya. Seperti ramai orang, "ujian" saya menulis kod dan menyegarkan halaman. "Adakah ia kelihatan betul?" Sekiranya saya fikir ia betul, saya akan teruskan.

Malah, kebanyakan kerja yang saya lakukan adalah kepada syarikat -syarikat yang tidak peduli dengan bentuk ujian lain. Selepas bertahun -tahun pengalaman, dan nasihat bijak dari orang seperti Chris Hartjes, saya melihat nilai ujian. Dan saya masih belajar ujian yang baik.

How to Write JavaScript-Style Test Watchers in PHP Saya baru -baru ini mula bekerja pada beberapa projek JavaScript yang termasuk pemerhati ujian yang dibundel.

Ini adalah tutorial video maju yang indah mengenai pembangunan NodeJS yang didorong oleh ujian!

Di dunia JavaScript, ia bukan perkara biasa untuk kod sumber pra -proses. Di dunia JavaScript, pemaju menulis kod menggunakan sintaks yang tidak disokong dan kemudian menukar kod ke sintaks yang disokong secara meluas, sering menggunakan alat yang dipanggil Babel.

Untuk mengurangkan beban skrip penukaran memanggil, projek boilerplate telah mula memasukkan skrip yang secara automatik memantau perubahan fail;

Projek -projek yang saya kerjakan mengambil pendekatan yang sama dengan ujian unit rerun. Apabila saya menukar fail JavaScript, fail ditukar dan ujian unit adalah rerun. Dengan cara ini, saya dapat melihat dengan segera sama ada apa -apa yang rosak.

Kod untuk tutorial ini boleh didapati di GitHub. Saya telah mengujinya dengan Php 7.1.

Tetapan Projek

Saya telah mula menubuhkan sesuatu yang serupa untuk phpunit sejak saya mula bekerja pada projek -projek ini. Malah, projek pertama saya menubuhkan skrip PHPUNIT Observer adalah projek PHP yang juga memproses fail.

Selepas saya menambah skrip pra -proses untuk projek saya, semuanya bermula:

composer require pre/short-closures
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Skrip preprocessing khusus ini membolehkan saya menamakan semula kelas yang dimuatkan secara automatik PSR-4 (dari Path/to/file.php ⇒ Path/to/file.pre) untuk memilih ke dalam fungsi yang mereka berikan. Jadi saya menambah perkara berikut ke fail komposer.json saya:

"autoload": {
    "psr-4": {
        "App\": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "App\Tests\": "tests"
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

ini dari composer.json

Kemudian saya menambah kelas untuk menghasilkan fungsi yang mengandungi butiran sesi pengguna semasa:

namespace App;

use Closure;

class Session
{
    private $user;

    public function __construct(array $user)
    {
        $this->user = $user;
    }

    public function closureWithUser(Closure $closure)
    {
        return () => {
            $closure($this->user);
        };
    }
}
Salin selepas log masuk
Salin selepas log masuk

Ini berasal dari src/session.pre

Untuk memeriksa sama ada ini berfungsi, saya menyediakan skrip sampel kecil:

require_once __DIR__ . "/vendor/autoload.php";

$session = new App\Session(["id" => 1]);

$closure = ($user) => {
    print "user: " . $user["id"] . PHP_EOL;
};

$closureWithUser = $session->closureWithUser($closure);
$closureWithUser();
Salin selepas log masuk
Salin selepas log masuk

ini berasal dari contoh.pre

... dan kerana saya ingin menggunakan penutupan pendek dalam kelas bukan PSR-4, saya juga perlu menyediakan loader:

require_once __DIR__ . "/vendor/autoload.php";

Pre\Plugin\process(__DIR__ . "/example.pre");
Salin selepas log masuk
Salin selepas log masuk

ini berasal dari loader.php

Bahagian kod ini banyak untuk menggambarkan titik kecil. Kelas Sesi mempunyai kaedah ClosureWithuser yang menerima satu penutupan dan mengembalikan yang lain. Apabila dipanggil, penutupan baru ini akan memanggil penutupan asal, menyediakan array sesi pengguna sebagai parameter.

untuk menjalankan semua ini, taipkan terminal:

php loader.php
Salin selepas log masuk
Salin selepas log masuk

Sebagai nota sampingan, preprocessors ini menghasilkan sintaks PHP yang berkesan yang cantik. Nampaknya ini:

$closure = function ($user) {
   print "user: " . $user["id"] . PHP_EOL;
};
Salin selepas log masuk
Salin selepas log masuk

... dan

public function closureWithUser(Closure $closure)
{
   return [$closure = $closure ?? null, "fn" => function () use (&$closure) {
       $closure($this->user);
   }]["fn"];
}
Salin selepas log masuk
Salin selepas log masuk

Anda mungkin tidak mahu mengemukakan kedua -dua PHP dan pra fail ke repositori. Untuk melakukan ini, saya telah menambah apl/**/*. Php dan contoh.php ke .gitignore.

Menetapkan ujian

Jadi bagaimana kita menguji ini? Mari mulakan dengan memasang phpunit:

composer require --dev phpunit/phpunit
Salin selepas log masuk
Salin selepas log masuk

Kemudian, kita harus membuat fail konfigurasi:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    backupGlobals="false"
    backupStaticAttributes="false"
    bootstrap="vendor/autoload.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="false"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
>
    <testsuites>
        <testsuite>
            <directory suffix="Test.php">tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
</phpunit>
Salin selepas log masuk

ini dari phpunit.xml

Jika kita menjalankan vendor/bin/phpunit, ia akan berfungsi. Tetapi kami belum menguji apa -apa lagi. Mari buat satu:

namespace App\Tests;

use App\Session;
use PHPUnit\Framework\TestCase;

class SessionTest extends TestCase
{
    public function testClosureIsDecorated()
    {
        $user = ["id" => 1];
        $session = new Session($user);

        $expected = null;

        $closure = function($user) use (&$expected) {
            $expected = "user: " . $user["id"];
        };

        $closureWithUser = $session
            ->closureWithUser($closure);

        $closureWithUser();

        $this->assertEquals("user: 1", $expected);
    }
}
Salin selepas log masuk

Ini berasal dari ujian/sessiontest.php

Apabila kita menjalankan vendor/bin/phpunit, satu ujian berlalu. Ya!

Apa yang kita hilang?

Setakat ini, semuanya berjalan lancar. Kami menulis sekeping kecil kod dan ujian kod ini. Kami tidak perlu bimbang tentang bagaimana kerja pra -proses (langkah ke atas projek JavaScript).

Masalahnya bermula apabila kita cuba menyemak liputan kod:

vendor/bin/phpunit --coverage-html coverage
Salin selepas log masuk

Semasa kami menguji sesi, liputan akan dilaporkan. Ia adalah kelas yang mudah, jadi kami telah mencapai liputan 100% di atasnya. Tetapi jika kita menambah kelas lain:

namespace App;

class BlackBox
{
    public function get($key)
    {
        return $GLOBALS[$key];
    }
}
Salin selepas log masuk

Ini berasal dari src/blackbox.pre

Apa yang berlaku apabila kita memeriksa liputan? Masih 100%.

Ini berlaku kerana kita tidak mempunyai sebarang ujian yang memuatkan Blackbox.pre, yang bermaksud ia tidak pernah disusun. Oleh itu, apabila PHPUnit mencari fail PHP yang ditimpa, ia tidak dapat melihat fail pra -proses ini.

Bina semua fail sebelum ujian

mari buat skrip baru untuk membina semua fail pra sebelum cuba menjalankan ujian:

composer require pre/short-closures
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini berasal dari ujian/bootstrap.php

di sini, kami membuat 3 fungsi;

kita perlu menggantikan fail bootstrap semasa dalam phpunit.xml:

"autoload": {
    "psr-4": {
        "App\": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "App\Tests\": "tests"
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

ini dari phpunit.xml

Sekarang, setiap kali kita menjalankan ujian, skrip ini akan terlebih dahulu membersihkan dan membina semula semua fail pra ke fail PHP. Liputan dilaporkan dengan betul dan kami dapat meneruskan perjalanan gembira kami ...

selain ini ...

Pangkalan kod kami adalah kecil, tetapi ia tidak perlu kecil. Kita boleh mencuba ini dalam aplikasi sebenar dan segera menyesal untuk membina semula fail setiap kali kita mahu mengujinya.

Dalam projek ini yang saya nyatakan, saya mempunyai 101 fail pra. Hanya untuk menjalankan suite ujian unit saya (mudah -mudahan cepat), ini memerlukan banyak pra -proses. Kami memerlukan cara untuk memantau perubahan dan membina semula bahagian penting sahaja. Pertama, mari pasang pemerhati fail:

namespace App;

use Closure;

class Session
{
    private $user;

    public function __construct(array $user)
    {
        $this->user = $user;
    }

    public function closureWithUser(Closure $closure)
    {
        return () => {
            $closure($this->user);
        };
    }
}
Salin selepas log masuk
Salin selepas log masuk
Kemudian, mari buat skrip ujian:

require_once __DIR__ . "/vendor/autoload.php";

$session = new App\Session(["id" => 1]);

$closure = ($user) => {
    print "user: " . $user["id"] . PHP_EOL;
};

$closureWithUser = $session->closureWithUser($closure);
$closureWithUser();
Salin selepas log masuk
Salin selepas log masuk
ini berasal dari skrip/test-test

Skrip ini mencipta pencari Symfony (digunakan untuk mengimbas folder SRC dan ujian kami). Kami menentukan fail perubahan sementara, tetapi ini tidak diperlukan untuk apa yang kami lakukan. Kami seterusnya menggunakan gelung tak terhingga. ResourceWatcher mempunyai kaedah yang boleh kita gunakan untuk melihat sama ada fail dibuat, diubahsuai, atau dipadam.

baru, mari kita cari fail mana yang telah diubah dan membina semula mereka:

require_once __DIR__ . "/vendor/autoload.php";

Pre\Plugin\process(__DIR__ . "/example.pre");
Salin selepas log masuk
Salin selepas log masuk
ini berasal dari skrip/test-test

Kod ini sama dengan apa yang kita lakukan dalam fail bootstrap, tetapi ia hanya terpakai kepada fail yang diubah. Kita juga harus membuat semula ujian apabila fail berubah:

php loader.php
Salin selepas log masuk
Salin selepas log masuk
ini berasal dari skrip/test-test

Kami memperkenalkan beberapa pembolehubah persekitaran. Anda boleh menguruskan pembolehubah ini mengikut keinginan anda, tetapi saya lebih suka menambahkannya ke skrip komposer:

$closure = function ($user) {
   print "user: " . $user["id"] . PHP_EOL;
};
Salin selepas log masuk
Salin selepas log masuk
ini dari composer.json

app_cover tidak begitu penting. Ia hanya memberitahu pemerhati sama ada skrip mengandungi liputan kod. APP_REBUILD memainkan peranan yang lebih penting: ia mengawal sama ada fail pra dibina semula apabila fail ujian/bootstrap.php dimuatkan. Kita perlu mengubah suai fail supaya fail itu dibina semula hanya apabila diminta:

public function closureWithUser(Closure $closure)
{
   return [$closure = $closure ?? null, "fn" => function () use (&$closure) {
       $closure($this->user);
   }]["fn"];
}
Salin selepas log masuk
Salin selepas log masuk
Ini berasal dari ujian/bootstrap.php

kita juga perlu mengubah suai skrip Observer untuk menetapkan pembolehubah persekitaran ini sebelum memasukkan kod bootstrap. Seluruh skrip pemerhati kelihatan seperti ini:

composer require --dev phpunit/phpunit
Salin selepas log masuk
Salin selepas log masuk
ini berasal dari skrip/test-test

Sekarang kita harus dapat memulakannya dan menjalankan ujian kita setiap kali perubahan fail pra -diproses ...

How to Write JavaScript-Style Test Watchers in PHP

Beberapa perkara yang perlu diingat (RAWR). Pertama, anda memerlukan skrip chmod x/* untuk menjalankan skrip pemerhati. Kedua, anda perlu menetapkan Config: {Process-Timeout: 0} (dalam Composer.json), jika tidak, pemerhati akan mati selepas 300 saat.

Pusingan ganjaran!

Pengamat ujian ini juga membolehkan kesan sampingan yang sejuk: keupayaan untuk menggunakan preprocessor/penukaran dalam ujian phpunit kami. Jika kita menambah beberapa kod ke ujian/bootstrap.php:

composer require pre/short-closures
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Ini berasal dari ujian/bootstrap.php

... dan kami membolehkan pra -proses dalam fail ujian (untuk pra, itu bermakna menamakannya ke .pre). Kemudian kita boleh mula menggunakan preprocessor yang sama dalam fail ujian kami:

"autoload": {
    "psr-4": {
        "App\": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "App\Tests\": "tests"
    }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Ini berasal dari ujian/sessiontest.pre

Kesimpulan

Saya tidak percaya saya telah melakukan begitu banyak kerja preprocessor sebelum cuba membuat pemerhati ujian sedemikian. Ini membuktikan apa yang boleh kita pelajari dari bahasa dan kerangka lain. Jika saya tidak terlibat dalam projek -projek JavaScript, saya boleh terus membina semula fail saya sebelum setiap ujian dijalankan. Mual!

Adakah kaedah ini berkesan untuk anda? Ia boleh menyesuaikan diri dengan pelayan HTTP yang tidak segerak atau proses jangka panjang yang lain. Tolong beritahu kami apa yang anda fikirkan dalam komen.

FAQ untuk pemerhati ujian gaya JavaScript dalam PHP (FAQ)

Bagaimana untuk menyediakan pemerhati ujian gaya JavaScript di PHP?

Menyediakan pemerhati ujian gaya JavaScript dalam PHP melibatkan pelbagai langkah. Pertama, anda perlu memasang phpunit dan phpunit-watcher. PHPUnit adalah rangka kerja ujian untuk PHP yang menyediakan cara untuk menulis ujian untuk kod. PHPUnit-Watcher adalah alat yang memantau kod anda dan menjalankan ujian PHPUNIT apabila menyimpan fail. Selepas memasang alat ini, anda boleh mengkonfigurasi phpunit-watcher untuk memantau kod anda dan secara automatik menjalankan ujian anda. Tetapan ini membolehkan anda mendapatkan maklum balas mengenai perubahan kod dengan serta -merta, yang dapat membantu anda menemui dan memperbaiki kesilapan dengan lebih cepat.

Apakah faedah menggunakan pemerhati ujian dalam PHP?

Terdapat banyak manfaat untuk menggunakan pemerhati ujian dalam PHP. Ia memberikan maklum balas segera mengenai perubahan kod, yang dapat membantu anda menemui dan memperbaiki kesilapan dengan lebih cepat. Ia juga menjimatkan masa anda kerana anda tidak perlu menjalankan ujian secara manual selepas setiap perubahan kod. Di samping itu, ia menggalakkan anda menulis ujian untuk kod anda, yang dapat meningkatkan kualiti kod anda dan memudahkannya.

Bolehkah saya menggunakan kod PHP di dalam fungsi JavaScript?

Ya, anda boleh menggunakan kod PHP di dalam fungsi JavaScript, tetapi ini tidak disyorkan. PHP adalah bahasa sisi pelayan, manakala JavaScript adalah bahasa sisi klien. Ini bermakna bahawa kod PHP dilaksanakan pada pelayan sebelum halaman dihantar kepada klien, manakala kod JavaScript dilaksanakan pada klien selepas halaman diterima. Oleh itu, jika anda cuba menggunakan kod PHP di dalam fungsi JavaScript, kod PHP akan dilaksanakan sebelum fungsi JavaScript, yang mungkin membawa kepada hasil yang tidak dijangka.

Bagaimana menggunakan codeception untuk menguji kod PHP saya?

Codeception adalah rangka kerja ujian untuk PHP yang menyokong ujian unit, ujian fungsional, dan ujian penerimaan. Untuk menguji kod PHP anda dengan codeception, anda perlu memasang codeception dan mengkonfigurasinya untuk projek anda. Anda kemudian boleh menulis ujian untuk kod anda menggunakan sintaks codeception dan menjalankan ujian anda menggunakan alat baris arahan codeception.

bagaimana menulis kod php dalam javascript?

Secara teknikal anda boleh menulis kod PHP dalam JavaScript, ini tidak disyorkan. PHP adalah bahasa sisi pelayan, manakala JavaScript adalah bahasa sisi klien. Ini bermakna bahawa kod PHP dilaksanakan pada pelayan sebelum halaman dihantar kepada klien, manakala kod JavaScript dilaksanakan pada klien selepas halaman diterima. Oleh itu, jika anda cuba menulis kod PHP dalam JavaScript, kod PHP akan dilaksanakan sebelum kod JavaScript, yang boleh membawa kepada hasil yang tidak dijangka. Sebaliknya, lebih baik menggunakan AJAX untuk menghantar data dari klien ke pelayan dan sebaliknya.

Atas ialah kandungan terperinci Cara Menulis Pengawal Ujian Gaya JavaScript di PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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