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.
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
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" } }
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); }; } }
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();
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");
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
Sebagai nota sampingan, preprocessors ini menghasilkan sintaks PHP yang berkesan yang cantik. Nampaknya ini:
$closure = function ($user) { print "user: " . $user["id"] . PHP_EOL; };
... dan
public function closureWithUser(Closure $closure) { return [$closure = $closure ?? null, "fn" => function () use (&$closure) { $closure($this->user); }]["fn"]; }
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
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>
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); } }
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
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]; } }
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
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" } }
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); }; } }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();
ini berasal dari skrip/test-testSkrip 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");
ini berasal dari skrip/test-testKod 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
ini berasal dari skrip/test-testKami 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; };
ini dari composer.jsonapp_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"]; }
Ini berasal dari ujian/bootstrap.phpkita 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
ini berasal dari skrip/test-test
Sekarang kita harus dapat memulakannya dan menjalankan ujian kita setiap kali perubahan fail pra -diproses ...
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
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" } }
Ini berasal dari ujian/sessiontest.preKesimpulan
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!

Timeout sesi mutlak bermula pada masa penciptaan sesi, sementara waktu tamat sesi terbiar bermula pada masa operasi pengguna. Tamat masa sesi mutlak sesuai untuk senario di mana kawalan ketat kitaran hayat sesi diperlukan, seperti aplikasi kewangan; Timeout sesi terbiar sesuai untuk aplikasi yang mahu pengguna menyimpan sesi mereka aktif untuk masa yang lama, seperti media sosial.

Kegagalan sesi pelayan boleh diselesaikan dengan mengikuti langkah -langkah: 1. Semak konfigurasi pelayan untuk memastikan sesi ditetapkan dengan betul. 2. Sahkan kuki klien, sahkan bahawa penyemak imbas menyokongnya dan hantar dengan betul. 3. Periksa perkhidmatan penyimpanan sesi, seperti Redis, untuk memastikan bahawa mereka beroperasi secara normal. 4. Semak kod aplikasi untuk memastikan logik sesi yang betul. Melalui langkah -langkah ini, masalah perbualan dapat didiagnosis dengan berkesan dan diperbaiki dan pengalaman pengguna dapat diperbaiki.

session_start () iscrucialinphpformanaginguserSessions.1) itinitiatesanewsessionifnoneexists, 2) resumeSanexistingsession, dan3) setSasessionCookieforcontinuityAcrossrequests, enableingApplicationeUseUshenticationandPersonalConizedConizedContentContentContentContentContentContentContentContentContentContentContentC.

Menetapkan bendera httponly adalah penting untuk cookies sesi kerana ia dapat mencegah serangan XSS dengan berkesan dan melindungi maklumat sesi pengguna. Khususnya, 1) bendera httponly menghalang JavaScript daripada mengakses kuki, 2) bendera boleh ditetapkan melalui setcookies dan make_response dalam php dan flask, 3) walaupun ia tidak dapat dicegah dari semua serangan, ia harus menjadi sebahagian daripada dasar keselamatan keseluruhan.

PhpsSesionssolveThublemofMainTainStateAsmultipHttprequestsByStoringDataontheserverArverArsociatingWithauniquesession.1) merekaSTOREdataServer-sisi, biasanya

Phpsessionscanstorestrings, nombor, tatasusunan, andobjects.1.strings: textdatalikeusernames.2.numbers: integersorfloatsforcounters.3.Arrays: ListsLikeshoppingCarts.4.Objects: complextructureSturesthatareserialized.

Tostartaphpsession, usesession_start () atthescript'sbeginning.1) placeitbeforeanyoutputtosetthesessioncookie.2) usesessionsforusererdatalikeloginstatusorshoppingcarts.3)

Penjanaan semula sesi merujuk kepada menjana ID sesi baru dan membatalkan ID lama apabila pengguna melakukan operasi sensitif dalam kes serangan tetap sesi. Langkah-langkah pelaksanaan termasuk: 1. Mengesan Operasi Sensitif, 2. Menjana ID Sesi Baru, 3. Memusnahkan ID Sesi Lama, 4. Kemas kini maklumat sesi pengguna.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

mPDF
mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).
