


TL;DR: Hidupkan kompilasi Ahead-Of-Time (AOT) untuk ujian Angular anda untuk mendapatkan liputan kod templat yang tepat, pelaksanaan ujian yang lebih pantas, simetri pengeluaran dan kalis masa hadapan ujian.
Pilihan sudah tersedia untuk pengguna Vitest dan tidak lama lagi akan tersedia untuk pengguna Karma dan Jest (pembina eksperimen).
? Apa yang salah dengan JIT?
Sama ada anda menggunakan Karma, Jest atau Vitest, anda mungkin menggunakan kompilasi Just-In-Time (JIT) untuk ujian Sudut anda, kerana sehingga baru-baru ini, ia merupakan satu-satunya pilihan yang tersedia.
Masalahnya ialah JIT mempunyai beberapa kelemahan yang ketara:
- Liputan kod tidak tepat kerana templat tidak diambil kira.
- Ia lebih perlahan apabila ujian menyusun templat dengan cepat.
- Ia bukan masa hadapan kerana Angular telah mencapai had keserasian JIT. Mengikut reka bentuk, beberapa ciri adalah mustahil untuk dilaksanakan dengan JIT.
- Ia tidak simetri dengan persekitaran pengeluaran, tempat AOT digunakan.
⏰ Kenapa sekarang?
Sejak Sudut 8 dan pengenalan IVy, penyusun Sudut telah mula mengubah templat menjadi arahan. Di antara banyak faedah lain, ini juga bermakna alat liputan kod boleh memetakan arahan ini kepada templat dan mengira liputan kod dengan sewajarnya.
Secara teorinya, adalah mungkin untuk menghasilkan liputan kod dengan menjalankan ujian dengan AOT sejak Angular 8, tetapi pilihan itu tidak tersedia dalam Karma atau Jest. Hanya mungkin untuk mendayakan AOT untuk ujian sejak sokongan Vitest untuk Angular telah ditambahkan oleh pasukan Analog.
Sehingga November 2024:
- Vitest ialah satu-satunya pilihan yang menyokong kompilasi AOT.
- Terdapat PR terbuka untuk Karma dan Jest Experimental Builder untuk menyokong AOT.
? Faedah Lain Ujian AOT
⚡️ Perlaksanaan Ujian Lebih Pantas
Sama ada anda menggunakan JIT atau AOT, komponen akhirnya akan disusun pada satu ketika. Perbezaan utama ialah dengan AOT, kompilasi dilakukan sekali dan boleh dicache, manakala dengan JIT, setiap modul ujian mungkin akhirnya menyusun semula komponen.
Ini bermakna walaupun fasa transformasi agak perlahan dengan AOT, masa pelaksanaan ujian keseluruhan akan lebih cepat. Nombor yang saya lihat menunjukkan sekitar 20% pelaksanaan lebih pantas, tetapi ini akan sangat bergantung pada struktur ujian anda dan Sistem Dalam Ujian.
? Pengeluaran-Simetri
Kami secara amnya mahu ujian kami sesimetri mungkin dengan persekitaran pengeluaran untuk meningkatkan keyakinan. Ini selalunya mencabar kerana ia seimbang dengan sifat lain seperti kelajuan ujian, saiz Sistem Dalam Ujian atau kebolehramalan.
Aspek menarik AOT ialah ia meningkatkan simetri pengeluaran tanpa merosakkan sifat lain. Menggunakan AOT, anda akan mendapat lebih keyakinan dan mencapai tingkah laku yang lebih dekat dengan pengeluaran.
? Ujian Masa Depan
Lebih penting lagi, JIT telah mencapai hadnya dan menjadi liabiliti untuk Angular. Sebagai contoh, beberapa ciri Sudut tidak disokong dalam JIT (cth. Deferrable Views). Ciri berpotensi lain daripada peta jalan Sudut, seperti komponen tanpa pemilih, akan mungkin mustahil untuk digunakan dengan JIT.
Sebenarnya, memandangkan Input Isyarat Angular (dan API berfungsi yang serupa), JIT sudah memerlukan beberapa perubahan minimum untuk berfungsi.
Dengan bertukar kepada AOT, anda menjadikan ujian anda kalis masa hadapan, bersedia untuk mendapat manfaat daripada sebarang inovasi dan bersedia untuk apa sahaja masa depan JIT.
? Kelemahan
? Pembinaan Komponen Dinamik Perlu Dielakkan
Dengan menghidupkan AOT, beberapa teknik yang bergantung pada binaan dinamik akan rosak.
Sebagai contoh, penggunaan sedemikian tidak akan berfungsi lagi:
// ? This is broken with AOT. const fixture = render(`<app-button></app-button>`, { imports: [Button] }); function render(template, { imports }) { @Component({ template, imports, }) class TestContainer {} return TestBed.createComponent(TestContainer); }
Walau bagaimanapun, memintas kompilasi AOT masih boleh dilakukan (⚠️ buat masa ini ️⚠️):
function render(template, { imports }) { @Component({ jit: true, template, imports, }) class TestContainer {} return TestBed.createComponent(TestContainer); }
Nasihat saya ialah elakkan binaan sedemikian sebanyak mungkin dan lebih suka mencipta komponen khusus ujian apabila diperlukan, walaupun ia mungkin lebih bertele-tele. Pada masa hadapan, pasukan Angular boleh menyediakan alternatif yang serasi dengan AOT dan kurang boilerplat-y.
? Ujian Cetek Lebih Mencabar
Walaupun Ujian Cetek tidak seharusnya menjadi strategi ujian utama anda kerana ia juga kurang simetri pengeluaran, ia masih merupakan teknik yang berguna untuk ada dalam kotak alat anda.
Dengan AOT, pada masa ini mustahil untuk mengatasi import komponen menggunakan TestBed#overrideComponent.
Penyelesaian adalah untuk mengatasi kebergantungan komponen pada peringkat modul menggunakan API rangka kerja ujian dan menggantikan komponen dengan gandaan ujiannya.
Contohnya, dengan Vitest:
// app.cmp.spec.ts vi.mock('./street-map.cmp', async () => { return { StreetMap: await import('./street-map-fake.cmp').then( (m) => m.StreetMapFake ), }; }); // street-map-fake.cmp.ts @Component({ selector: 'app-street-map', template: 'Fake Street Map', }) class StreetMapFake implements StreetMap { // ... }
Walaupun penyelesaian sementara ini serasi dengan AOT, ia disertakan dengan kos:
- Ia kurang boleh dibaca dan lebih bertele-tele.
- "Mengejek" (atau menyediakan beregu ujian) pada peringkat modul kurang berbutir dan kurang boleh diramal.
- Ia sangat digabungkan dengan rangka kerja ujian yang anda gunakan.
Buat masa ini, saya akan mengesyorkan menggunakan JIT untuk Ujian Cetek sehingga TestBed#overrideComponent menyokong AOT atau sehingga pasukan Angular menyediakan alternatif yang lebih baik. Anda boleh mencapai ini dengan menggunakan konfigurasi berasingan untuk Ujian Cetek yang menggunakan JIT untuk ujian yang sepadan dengan corak tertentu seperti *.jit.spec.ts.
??? Mengambil Vitest dengan AOT untuk Berputar
1. Sediakan Vitest
- Untuk pengguna CLI Sudut, gunakan skema Analog.
- Untuk pengguna Nx, pilih pilihan vitest apabila menjana aplikasi atau pustaka (tersedia sejak Nx 20.1.0).
2. Dayakan AOT
Cari fail vite.config.js dan hidupkan AOT dengan menetapkan pilihan jit pemalam Angular kepada palsu:
// ? This is broken with AOT. const fixture = render(`<app-button></app-button>`, { imports: [Button] }); function render(template, { imports }) { @Component({ template, imports, }) class TestContainer {} return TestBed.createComponent(TestContainer); }
? Konfigurasi Liputan Kod
Kami mempunyai pilihan untuk menggunakan istanbul atau native v8 untuk liputan kod. Atas sebab tertentu, masih dalam siasatan, pemetaan semula liputan Vitest gagal apabila menggunakan v8. Penyelesaiannya adalah dengan kembali menggunakan istanbul.
1. Pasang @vitest/coverage-istanbul
Pastikan anda memasang versi Vitest Istanbul yang sepadan dengan Versi utama Vitest
function render(template, { imports }) { @Component({ jit: true, template, imports, }) class TestContainer {} return TestBed.createComponent(TestContainer); }
2. Pilih istanbul sebagai pembekal perlindungan anda
Kemas kini vite.config.mts untuk membolehkan liputan menggunakan Istanbul:
// app.cmp.spec.ts vi.mock('./street-map.cmp', async () => { return { StreetMap: await import('./street-map-fake.cmp').then( (m) => m.StreetMapFake ), }; }); // street-map-fake.cmp.ts @Component({ selector: 'app-street-map', template: 'Fake Street Map', }) class StreetMapFake implements StreetMap { // ... }
? Tonton dalam Tindakan
Anda kini boleh menjalankan ujian:
export default defineConfig({ ... plugins: [ angular({ jit: false }), ... ], ... });
kemudian klik pada ikon liputan dan kagumi liputan kod templat. ?
(anda juga akan menemui laporan liputan dalam folder liputan)
Perhatikan bahawa liputan dikira berdasarkan arahan yang dihasilkan oleh pengkompil, yang bermaksud bahawa:
Ia juga akan berfungsi untuk arahan struktur.
Sekarang, teka apa!?
Liputan juga berfungsi untuk templat sebaris! ?
☢️ Ingat Perangkap Liputan Kod
Walaupun liputan kod adalah alat yang berguna, ia harus digunakan dengan bijak. Pastikan ia sebagai penunjuk, bukan matlamat tegar.
Sebarang ketetapan statistik yang diperhatikan akan cenderung runtuh sebaik sahaja tekanan dikenakan ke atasnya untuk tujuan kawalan.
-- Charles Goodhart
Dalam erti kata lain, apabila ukuran menjadi sasaran, ia tidak lagi menjadi ukuran yang baik.
Saya akan menambah bahawa metrik yang paling mudah selalunya yang paling mengelirukan.
? Apa Seterusnya?
Pengguna Karma tidak lama lagi akan dapat mendayakan AOT dengan bendera mudah.
Pengguna jenaka mempunyai tiga pilihan:
- Disyorkan: Berhijrah ke Vitest. (? Nantikan kerana saya akan berkongsi laluan penghijrahan yang paling lancar tidak lama lagi)
- Gunakan pembina percubaan dengan AOT.
- Tunggu sokongan AOT sudut pratetap jest.
Pengguna Vitest boleh menikmati faedah AOT sekarang. ?
? Sumber Tambahan
- ? Demo Repo
- ? Dokumen Pengkompil Angular Ahead-Of-Time (AOT).
- ? Dokumen Vitest
- ? Dokumen Analog di Vitest
??? Kursus Video Ujian Sudut Pragmatik ada di sini!
Jika anda bosan dengan pepijat, atau ujian penyelenggaraan tinggi yang pecah pada setiap refactor, kursus video saya, Ujian Sudut Pragmatik, sedia membantu!
Ketahui strategi ujian praktikal dan boleh dipercayai untuk memastikan apl Angular anda stabil dan boleh diselenggara. (Kini diskaun 50% untuk masa terhad!)
Atas ialah kandungan terperinci Bahan Hilang untuk Liputan Kod Templat Sudut dan Ujian Kalis Masa Depan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

JavaScript adalah di tengah -tengah laman web moden kerana ia meningkatkan interaktiviti dan dinamik laman web. 1) Ia membolehkan untuk menukar kandungan tanpa menyegarkan halaman, 2) memanipulasi laman web melalui Domapi, 3) menyokong kesan interaktif kompleks seperti animasi dan drag-and-drop, 4) mengoptimumkan prestasi dan amalan terbaik untuk meningkatkan pengalaman pengguna.

C dan JavaScript mencapai interoperabilitas melalui webassembly. 1) Kod C disusun ke dalam modul WebAssembly dan diperkenalkan ke dalam persekitaran JavaScript untuk meningkatkan kuasa pengkomputeran. 2) Dalam pembangunan permainan, C mengendalikan enjin fizik dan rendering grafik, dan JavaScript bertanggungjawab untuk logik permainan dan antara muka pengguna.

JavaScript digunakan secara meluas di laman web, aplikasi mudah alih, aplikasi desktop dan pengaturcaraan sisi pelayan. 1) Dalam pembangunan laman web, JavaScript mengendalikan DOM bersama -sama dengan HTML dan CSS untuk mencapai kesan dinamik dan menyokong rangka kerja seperti JQuery dan React. 2) Melalui reaktnatif dan ionik, JavaScript digunakan untuk membangunkan aplikasi mudah alih rentas platform. 3) Rangka kerja elektron membolehkan JavaScript membina aplikasi desktop. 4) Node.js membolehkan JavaScript berjalan di sisi pelayan dan menyokong permintaan serentak yang tinggi.

Python lebih sesuai untuk sains data dan automasi, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python berfungsi dengan baik dalam sains data dan pembelajaran mesin, menggunakan perpustakaan seperti numpy dan panda untuk pemprosesan data dan pemodelan. 2. Python adalah ringkas dan cekap dalam automasi dan skrip. 3. JavaScript sangat diperlukan dalam pembangunan front-end dan digunakan untuk membina laman web dinamik dan aplikasi satu halaman. 4. JavaScript memainkan peranan dalam pembangunan back-end melalui Node.js dan menyokong pembangunan stack penuh.

C dan C memainkan peranan penting dalam enjin JavaScript, terutamanya digunakan untuk melaksanakan jurubahasa dan penyusun JIT. 1) C digunakan untuk menghuraikan kod sumber JavaScript dan menghasilkan pokok sintaks abstrak. 2) C bertanggungjawab untuk menjana dan melaksanakan bytecode. 3) C melaksanakan pengkompil JIT, mengoptimumkan dan menyusun kod hot-spot semasa runtime, dan dengan ketara meningkatkan kecekapan pelaksanaan JavaScript.

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.


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

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Dreamweaver Mac版
Alat pembangunan web visual

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.
