Pengujian, meskipun dapat memakan waktu, merupakan langkah penting dalam siklus pengembangan aplikasi apa pun. Ini memastikan Anda menangkap bug dan masalah sejak awal sebelum Anda mendorong kode ke produksi.
Anda dapat menggunakan Jest untuk menguji Express Rest API. Setelah Anda membuat CRUD API sederhana, temukan cara menulis tes untuk setiap titik akhir.
Apa Itu Jest?
Ada banyak library pengujian JavaScript yang dapat Anda pilih, tetapi Bersenda gurau adalah yang paling mudah untuk memulai. Ini adalah perpustakaan pengujian yang dikembangkan oleh Facebook, sebagian besar digunakan untuk menguji proyek React. Namun, Anda juga dapat menggunakannya untuk menguji Node dan proyek berbasis JavaScript lainnya. Ini dikembangkan di atas Jasmine, alat pengujian lain, dan dibundel dengan pustaka pernyataannya sendiri.
Meskipun Anda tidak memerlukan pustaka pernyataan untuk menulis tes di Jest, Anda perlu menggunakan alat untuk membuat permintaan HTTP. Artikel ini menggunakan SuperTest.
Apa itu SuperTest?
Tes Super adalah pustaka pengujian Node untuk panggilan HTTP. Ini memperluas perpustakaan pengujian superagent dan memungkinkan Anda membuat permintaan seperti GET, POST, PUT, dan DELETE.
SuperTest menyediakan objek permintaan yang dapat Anda gunakan untuk membuat permintaan HTTP.
konstan permintaan = memerlukan("supertest")
meminta("https://icanhazdadjoke.com")
.Dapatkan('/slack')
.akhir(fungsi(salah, res) {
jika (berbuat salah) melemparkan berbuat salah;
menghibur.catatan(res.tubuh.attachment);
});
Di sini, Anda meneruskan URL dasar API ke objek permintaan dan kemudian mengaitkan metode HTTP dengan URL lainnya. Itu akhir() metode memanggil server API dan fungsi panggilan balik menangani responsnya.
Setelah Anda mendapatkan respons dari API, Anda dapat menggunakan Jest untuk memvalidasinya.
Buat API Ekspres
Untuk menguji titik akhir API Anda sendiri, Anda perlu membuat API REST pertama. API yang akan Anda buat cukup sederhana. Ini menyisipkan, mengambil, memperbarui, dan menghapus item dari array.
Mulailah dengan membuat direktori baru bernama node-jest dan menginisialisasi npm.
mkdir node-jest
npm init -y
Selanjutnya, buat file baru bernama index.js dan buat server Ekspres.
konstan ekspres = memerlukan("cepat")
konstan aplikasi = ekspres()
app.listen (3000, () => konsol.log("Mendengarkan di port 3000"))
Uji Titik Akhir GET /todos
Titik akhir pertama yang akan Anda buat adalah titik akhir GET /todos. Ini mengembalikan semua item dalam array. Di index.js, tambahkan berikut ini.
konstan todo = [
];
// Dapatkan semua todos
aplikasi.get("/todos", (permintaan, res) => {
kembalires.status(200).json({
data: todos,
kesalahan: batal,
});
});
Perhatikan bahwa respons memiliki kode status 200 dan objek JSON yang berisi item yang harus dilakukan dalam larik yang disebut data dan pesan kesalahan. Inilah yang akan Anda uji menggunakan Jest.
Sekarang, instal Jest dan SuperTest:
npm Install supertest bercanda
Kemudian, tambahkan skrip pengujian di package.json sebagai berikut:
{
"skrip": {
"uji": "bersenda gurau"
}
}
Sebelum Anda mulai menulis tes Anda sendiri, Anda harus memahami cara menulis tes dasar di Jest.
Perhatikan fungsi berikut:
fungsijumlah(a, b) {
kembali a + b;
}
modul.ekspor = jumlah;
Dalam file pengujian, Anda perlu:
- Impor fungsi.
- Jelaskan apa yang harus dilakukan tes.
- Panggil fungsi.
- Tegaskan respons yang diharapkan dengan respons aktual dari fungsi.
konstan { jumlah } = memerlukan("./jumlah")
menggambarkan("Jumlah dua item", asinkron() => {
uji("Itu harus kembali 4", () => {
mengharapkan(jumlah(2,2)).menjadi(4)
})
})
Itu menggambarkan kata kunci menentukan grup tes dan uji pernyataan menentukan tes tertentu. Jika nilai yang dikembalikan dari fungsi cocok dengan nilai yang diteruskan ke menjadi, tes lulus.
Saat menguji titik akhir API, Anda tidak akan memanggil fungsi tetapi mengirim permintaan menggunakan SuperTest atau pustaka klien HTTP lainnya.
Kembali ke titik akhir GET, buat file baru bernama api.test.js. Di sinilah Anda akan menulis semua tes titik akhir. Memberi nama file tes dengan a .uji infix memastikan bahwa Jest mengenalinya sebagai file uji.
Di api.test.js, impor supertest dan atur URL dasar seperti ini:
konstan permintaan = memerlukan("supertest")
konstan baseURL = "http://host lokal: 3000"
Selanjutnya, buat tes pertama di blok deskripsikan:
menggambarkan("DAPATKAN /todos", () => {
konstan baruTodo = {
Indo: kripto.randomUUID(),
barang: "Minum air",
lengkap: Salah,
}
sebelum semua(tidak sinkron () => {
// mengatur todo
menunggu permintaan (baseURL).post("/todo").kirim (baruTodo);
})
Lagipula(tidak sinkron () => {
menunggu permintaan (baseURL).hapus(`/harus/${newTodo.id}`)
})
dia("harus kembali 200", asinkron () => {
konstan tanggapan = menunggu permintaan (baseURL).get("/todos");
mengharapkan(tanggapan.Kode status).menjadi(200);
mengharapkan(tanggapan.tubuh.kesalahan).menjadi(batal);
});
dia("harus kembali todos", asinkron () => {
konstan tanggapan = menunggu permintaan (baseURL).get("/todos");
harapkan (response.body.data.length >= 1).menjadi(BENAR);
});
});
Sebelum menjalankan tes, Anda perlu menentukan fungsi setup dan teardown. Fungsi-fungsi ini akan mengisi array todo dengan item sebelum pengujian dan menghapus data dummy setelah setiap pengujian.
Kode yang berjalan sebelum semua pengujian ada di fungsi beforeAll(). Kode yang berjalan setelah semua tes ada di fungsi afterAll().
Dalam contoh ini, Anda cukup menekan titik akhir POST dan DELETE untuk masing-masing. Dalam aplikasi nyata, Anda mungkin akan terhubung ke database tiruan yang berisi data uji.
Dalam pengujian ini, Anda terlebih dahulu membuat permintaan ke titik akhir GET /todos dan membandingkan respons yang dikirim kembali dengan hasil yang diharapkan. Test suite ini akan lulus jika respon memiliki Kode status HTTP dari 200, data tidak kosong, dan pesan kesalahannya nol.
Uji Titik Akhir POST / todo
Di index.js, buat titik akhir POST /todo:
aplikasi.post("/todo", (permintaan, res) => {
mencoba {
konstan { id, item, selesai } = req.body;
konstan baruTodo = {
Indo,
barang,
lengkap,
};
todos.dorongan(baruTodo);
kembalires.status(201).json({
data: todos,
kesalahan: batal,
});
} menangkap (kesalahan) {
kembalires.status(500).json({
data: batal,
kesalahan: kesalahan,
});
}
});
Dalam pengujian ini, Anda perlu mengirim detail todo di badan permintaan menggunakan metode send().
permintaan (baseURL).posting("/todo").kirim (baruTodo)
Permintaan POST /todo harus mengembalikan kode status 201 dan larik todos dengan item baru ditambahkan di akhir. Inilah yang mungkin terlihat seperti tes:
menggambarkan("POSTING / todo", () => {
konstan baruTodo = {
// melakukan
}
Lagipula(tidak sinkron () => {
menunggu permintaan (baseURL).hapus(`/harus/${newTodo.id}`)
})
dia("harus menambahkan item ke array todos", asinkron () => {
konstan tanggapan = menunggu permintaan (baseURL).post("/todo").send(newTodo);
konstan lastItem = response.body.data[response.body.data.length-1]
mengharapkan(tanggapan.Kode status).menjadi(201);
mengharapkan(item terakhir.barang).menjadi(baruTodo["barang"]);
mengharapkan(item terakhir.lengkap).menjadi(baruTodo["lengkap"]);
});
});
Di sini, Anda meneruskan data todo ke metode send() sebagai argumen. Respons harus memiliki kode status 201 dan juga berisi semua item todo dalam objek data. Untuk menguji apakah todo benar-benar dibuat, periksa apakah entri terakhir di todos yang dikembalikan cocok dengan yang Anda kirim dalam permintaan.
Titik akhir PUT /todos/:id harus mengembalikan item yang diperbarui:
aplikasi.put("/todos/:id", (permintaan, res) => {
mencoba {
konstan id = req.params.id
konstan todo = todos.find((todo) => todo.id == id);
jika(!harus) {
melemparkanbaruKesalahan("Tidak ditemukan")
}
todo.completed = req.body.completed;
kembalires.status(201).json({
data: lakukan,
kesalahan: batal,
});
} menangkap (kesalahan) {
kembalires.status(500).json({
data: batal,
kesalahan: kesalahan,
});
}
});
Uji respons sebagai berikut:
menggambarkan("Perbarui satu tugas", () => {
konstan baruTodo = {
// melakukan
}
sebelum semua(tidak sinkron () => {
menunggu permintaan (baseURL).post("/todo").kirim (baruTodo);
})
Lagipula(tidak sinkron () => {
menunggu permintaan (baseURL).hapus(`/harus/${newTodo.id}`)
})
dia("harus memperbarui item jika ada", asinkron () => {
konstan tanggapan = menunggu permintaan (baseURL).put(`/berusaha/${newTodo.id}`).Kirim({
lengkap: BENAR,
});
mengharapkan(tanggapan.Kode status).menjadi(201);
mengharapkan(tanggapan.tubuh.data.lengkap).menjadi(BENAR);
});
});
Nilai lengkap di badan respons harus benar. Ingatlah untuk menyertakan id item yang ingin Anda perbarui di URL.
Uji Titik Akhir DELETE /todos/:id
Di index.js, buat titik akhir DELETE. Itu harus mengembalikan data todo tanpa item yang dihapus.
hapus aplikasi("/todos/:id", (permintaan, res) => {
mencoba {
konstan id = req.params.id
konstan todo = todo[0]
jika (melakukan) {
todos.sambatan(Indo, 1)
}
kembalires.status(200).json({
data: todos,
kesalahan: batal,
});
} menangkap (kesalahan) {
kembalires.status(500).json({
data: batal,
kesalahan: kesalahan,
});
}
});
Untuk menguji titik akhir, Anda dapat memeriksa apakah item yang dihapus masih ada dalam data yang dikembalikan:
menggambarkan("Hapus satu tugas", () => {
konstan baruTodo = {
// melakukan
}
sebelum semua(tidak sinkron () => {
menunggu permintaan (baseURL).post("/todo").kirim (baruTodo);
})
dia("harus menghapus satu item", asinkron () => {
konstan tanggapan = menunggu permintaan (baseURL).hapus(`/berusaha/${newTodo.id}`);
konstan todos = respon.body.data
konstan ada = todos.find (todo => {
newTodo.id == todoId
})
mengharapkan (ada).Menjadi(tidak terdefinisi)
});
});
Data yang dikembalikan dari titik akhir DELETE tidak boleh berisi item yang dihapus. Karena item yang dikembalikan berada dalam array, Anda dapat menggunakan Array[id] untuk memeriksa apakah API menghapus item dengan benar. Hasilnya harus salah.
Membuat REST API
Dalam artikel ini, Anda mempelajari cara menguji Express Rest API menggunakan Jest API. Anda menulis tes untuk permintaan HTTP GET, PUT, POST, dan DELETE dan melihat cara mengirim data ke titik akhir di URL dan permintaan. Anda harus dapat menerapkan pengetahuan ini saat menguji Rest API Anda sendiri.