Ramai pembangun menghadapi cabaran semasa menguji kod mereka. Tanpa ujian yang betul, pepijat boleh tergelincir, membawa kepada pengguna yang kecewa dan pembaikan yang mahal.
Artikel ini akan menunjukkan kepada anda cara menggunakan ujian Unit, Integrasi dan End-to-End dengan berkesan menggunakan Jest, Supertest dan Puppeteer pada contoh yang sangat mudah yang dibina menggunakan Node.js dan MongoDB.
Menjelang akhir artikel ini, saya harap anda akan mempunyai pemahaman yang jelas tentang cara menggunakan jenis ujian ini dalam projek anda sendiri.
?? Sila dapatkan contoh penuh di sini dalam repo ini.
Sebelum memasang kebergantungan kami, izinkan saya memperkenalkan contoh kami terlebih dahulu. Ini adalah contoh yang sangat mudah di mana pengguna boleh membuka halaman pendaftaran, menetapkan butiran pendaftaran mereka, klik butang pendaftaran dan maklumat mereka disimpan dalam pangkalan data.
Dalam contoh ini, kami akan menggunakan pakej berikut:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Kebanyakan kebergantungan ini adalah mudah, tetapi berikut ialah penjelasan untuk beberapa daripadanya:
Baik, mari terjemahkan ini ke dalam kod.
Untuk menjalankan ujian unit anda tanpa tingkah laku yang tidak dapat diramalkan, anda harus menetapkan semula fungsi olok-olok sebelum setiap ujian. Anda boleh mencapai ini menggunakan beforeEach cangkuk:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
Dalam kes ini, kami ingin menguji fungsi validateInput:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Ia adalah fungsi yang sangat mudah yang mengesahkan jika input yang diberikan mengandungi e-mel yang sah. Inilah ujian unitnya:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
tunggu jangkaan(async () => {}).menolak: Berdasarkan dokumentasi Jest, ini adalah cara untuk mengharapkan sebab janji yang ditolak.
Mari kita uji fungsi lain yang menyemak sama ada terdapat e-mel pendua dalam pangkalan data. Sebenarnya, yang ini menarik kerana kita perlu berurusan dengan pangkalan data, dan pada masa yang sama, ujian unit tidak sepatutnya berurusan dengan sistem luaran. Jadi apa yang perlu kita lakukan? Baiklah, kita patut menggunakan Mocks.
Pertama, lihat fungsi emailShouldNotBeDuplicated yang perlu kita uji:
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
Seperti yang anda lihat, fungsi ini menghantar permintaan kepada pangkalan data untuk menyemak sama ada terdapat pengguna lain yang mempunyai e-mel yang sama. Begini cara kita boleh mengejek panggilan pangkalan data:
// __tests__/unit/register.test.js const { registerController } = require('../controllers/register.controller'); describe('RegisterController', () => { describe('validateInput', () => { it('should throw error if email is not an email', async () => { const input = { name: 'test', email: 'test', password: '12345678' }; await expect(async () => await registerController(input)).rejects.toThrow('Invalid email'); }); }); });
Kami mengejek (mengintip) kaedah findOne pangkalan data menggunakan jest.spyOn(objek, methodName) yang mencipta fungsi olok-olok dan menjejaki panggilannya. Hasilnya, kami boleh menjejaki bilangan panggilan dan parameter yang diluluskan bagi kaedah findOne intipan menggunakan toHaveBeenNthCalledWith.
Sebelum menulis ujian penyepaduan kami, kami perlu mengkonfigurasi persekitaran kami:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Kini, kami bersedia untuk menjalankan ujian integrasi kami.
Mari kita uji keseluruhan proses pendaftaran bahagian pelayan—daripada menghantar permintaan pendaftaran kepada menyimpan butiran pengguna dalam pangkalan data dan mengubah hala ke halaman kejayaan:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
Seperti yang anda lihat, fungsi registerController menyepadukan berbilang komponen (fungsi), validateInput, emailShouldNotBeDuplicated dan fungsi createUser.
Jadi, mari tulis ujian penyepaduan kami:
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
Mari kita lihat contoh kita.
Sebenarnya, dalam contoh kami, konfigurasi persekitaran untuk ujian hujung ke hujung adalah serupa dengan ujian penyepaduan.
Dalam kes ini, kita perlu betul-betul mensimulasikan tingkah laku pendaftaran pengguna sebenar, daripada membuka halaman pendaftaran, mengisi butiran mereka (nama, e-mel, kata laluan), mengklik butang "Daftar", dan akhirnya dialihkan ke halaman kejayaan . Sila lihat kod:
npm install --save jest express mongoose validator npm install --save-dev jest puppeteer jest-puppeteer mongodb-memory-server supertest npm-run-all
Mari pecahkan kod ini:
Foto oleh Nathan Dumlao di Unsplash
Pada ketika ini, anda mungkin tertanya-tanya cara menjalankan semua jenis ujian secara serentak apabila setiap jenis mempunyai konfigurasi sendiri. Contohnya:
Jadi, bagaimanakah kita boleh menjalankan semua jenis ujian pada masa yang sama sambil memastikan masing-masing mematuhi konfigurasi yang sepadan?
Untuk menangani masalah ini, ikut langkah berikut:
1. Mari buat tiga fail konfigurasi berbeza, jest.unit.config.js:
// setup.unit.js beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); });
jest.integration.config.js:
// register.controller.js const validator = require('validator'); const registerController = async (input) => { validateInput(input); ... }; const validateInput = (input) => { const { name, email, password } = input; const isValidName = !!name && validator.isLength(name, { max: 10, min: 1 }); if (!isValidName) throw new Error('Invalid name'); ... };
jest.e2e.config.js:
// __tests__/unit/register.test.js const { registerController } = require('../controllers/register.controller'); describe('RegisterController', () => { describe('validateInput', () => { it('should throw error if email is not an email', async () => { const input = { name: 'test', email: 'test', password: '12345678' }; await expect(async () => await registerController(input)).rejects.toThrow('Invalid email'); }); }); });
2. Seterusnya, kemas kini skrip npm anda dalam fail package.json seperti berikut:
// register.controller.js const { User } = require('../models/user'); const registerController = async (input) => { ... await emailShouldNotBeDuplicated(input.email); ... }; const emailShouldNotBeDuplicated = async (email) => { const anotherUser = await User.findOne({ email }); if (anotherUser) throw new Error('Duplicated email'); };
--config: Menentukan laluan ke fail konfigurasi Jest.
npm-run-all --parallel: Membenarkan menjalankan semua ujian secara selari.
3. Kemudian, buat tiga fail persediaan bernama setup.unit.js, setup.integration.js dan setup.e2e.js, yang mengandungi kod persediaan yang diperlukan yang digunakan dalam bahagian sebelumnya.
4. Akhir sekali, jalankan semua ujian dengan melaksanakan perintah npm run test ini. Perintah ini akan melaksanakan semua ujian unit, penyepaduan dan hujung ke hujung secara selari mengikut konfigurasi masing-masing.
Dalam artikel ini, kami meneroka ujian unit, penyepaduan dan hujung ke hujung (E2E), dengan menekankan kepentingannya untuk membina aplikasi yang boleh dipercayai. Kami menunjukkan cara untuk melaksanakan kaedah ujian ini menggunakan Jest, Supertest dan Puppeteer dalam contoh pendaftaran pengguna yang mudah dengan Node.js dan MongoDB.
Malah, strategi ujian yang kukuh bukan sahaja meningkatkan kualiti kod tetapi juga meningkatkan keyakinan pembangun dan meningkatkan kepuasan pengguna.
Saya harap artikel ini telah memberikan anda cerapan berguna yang boleh anda gunakan untuk projek anda sendiri. Selamat mencuba!
Jika anda mendapati artikel ini berguna, lihat artikel ini juga:
Terima kasih banyak kerana kekal bersama saya sehingga ke tahap ini. Saya harap anda seronok membaca artikel ini.
Atas ialah kandungan terperinci Unit, Integrasi dan ETesting dalam Satu Contoh Menggunakan Jest. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!