Contents
Pengenalan JavaScript Testing
Setelah kita mempelajari tentang dasar-dasar dalam pemrograman JavaScript, seperti menuliskan perintah dan menerapkan paradigma-paradigma yang populer maka proses selanjutnya adalah publikasi ke pengguna. Namun, sebelum sebuah program dipublikasikan, seharusnya sebuah program harus melalui tahap pengujian terlebih dahulu. Proses pengujian tersebut digunakan untuk melakukan kontrol kualitas dari kode yang kita tulis, memastikan bahwa software yang akan dipublikasikan ke pengguna minim adanya kecacatan atau bugs. Oleh sebab itu, sebagai seorang pemrogram kita harus melakukan testing saat proses pengembangan perangkat lunak.
Sebuah proses pengujian perangkat lunak dapat dilakukan secara:
-
Manual
Proses pengujian secara manual oleh seorang yang ditunjuk sebagai test, atau sebagian pengguna yang memang mendapatkan akses untuk pengujian pre-release. Proses ini biasanya berkaitan dengan usability, accessibility dari sebuah aplikasi.
-
Otomatis
Proses pengujian secara otomatis dilakukan oleh komputer dengan menuliskan script khusus, biasanya dilakukan oleh software engineer langsung ataupun oleh seorang QA Engineer. Proses ini biasanya berkaitan dengan fungsionalitas dari sebuah aplikasi.
Dari proses pengujian di atas, jenis-jenis pengujian dalam pengembangan perangkat lunak secara umum dapat dibagi menjadi 4 jenis pengujian, yaitu:
-
Static test
Memastikan tidak adanya typo (naming convention yang standar) dan memastikan tidak ada error types.
-
Unit test
Dilakukan untuk memastikan bahwa setiap unit kode yang kita tulis sudah bisa bekerja sesuai harapan. Unit sendiri berarti komponen terkecil yang dapat diuji secara terisolasi dalam perangkat lunak yang kita buat, dapat berupa fungsi bahkan kelas jika kita menggunakan paradigma OOP. Proses ini juga dapat diautomasikan.
-
Integration test
Memastikan beberapa serangkaian fungsi yang saling ketergantungan satu sama lain berjalan semestinya. Proses pengujian ini dapat dilakukan secara diautomasikan dengan menuliskan script test.
-
End-to-End test
Proses pengujian sebuah aplikasi untuk menguji flow dari awal hingga akhir, layaknya seorang user saat menggunakan aplikasi. Memastikan bahwasanya aplikasi berfungsi selayaknya. Biasanya proses ini dapat dilakukan secara otomatis maupun manual oleh tester.
Dalam modul ini, kita akan mempelajari bagaimana cara membuat sebuah pengujian secara otomatis. Proses automasi ini digunakan untuk memudahkan proses pengujian yang repetitive terhadap sebuah kasus umum. Sehingga kita tidak perlu lagi melakukan uji secara manual satu persatu pada sebuah fungsi atau perintah.
Ketika kita menulis sebuah kasus pengujian (test case), maka ada beberapa poin yang harus kita definisikan terlebih dahulu:
-
Apa yang ingin diuji?
Misalkan: Melakukan uji pada fungsi menghitung rata-rata nilai siswa, atau dapat juga melakukan pengujian pada proses registrasi akun, dan lain sebagainya.
-
Ekspektasi apa yang diharapkan?
-
Untuk kasus menghitung nilai rata-rata:
- Menghasilkan output perhitungan yang sesuai berdasarkan input yang diberikan.
- Input harus berupa angka.
-
Untuk kasus proses registrasi akun:
- Pengguna dapat melakukan registrasi secara normal.
- Pengguna dengan email sama tidak dapat melakukan registrasi.
- dan lain sebagainya.
-
Untuk kasus menghitung nilai rata-rata:
Jest
Dalam penulisan kode pengujian, kita dapat menggunakan library tambahan untuk mempermudah penulisan kode pengujian.
Jest merupakan salah satu framework testing paling populer untuk menuliskan kode pengujian pada bahasa pemrograman JavaScript. Jest dapat digunakan untuk menuliskan script testing pada aplikasi backend maupun frontend.
Kita akan mencoba untuk menuliskan sebuah kode pengujian menggunakan framework jest.
-
Membuat proyek baru dengan direktori bernama latihantesting.
-
Setelah masuk ke direktori tersebut, kita dapat melakukan init project kita.
-
Setelah proyek tersebut diinisialisasi. Selanjutnya kita dapat melakukan instalasi library framework jest.
npm install --save-dev jest
- Setelah proses instalasi selesai, buka proyek di code editor.
-
Pada file package.json, kita tambahkan script untuk test dengan cara menambahkan baris kode berikut:
{ "scripts": { "test": "jest" } }
Penambahan script tersebut digunakan agar kita bisa menjalankan script test yang nanti kita buat menggunakan runner.
Menulis Kode Pengujian
Dari proyek sebelumnya, kita akan coba untuk memulai pengenalan format sederhana saat kita akan menuliskan sebuah test. Perhatikan kode di bawah ini.
test('deskripsi dari testcase kamu', () => { expect(perintah).matcher(nilai yang diekspektasikan); }); // contoh test('dua tambah dua adalah empat', () => { expect(2+2).toBe(4); });
Dari contoh kode di atas expect(2 + 2) merupakan segmen yang berisi perintah yang menghasilkan nilai balikan, perintah tersebut dapat berupa fungsi ataupun perintah langsung.
toBe(4) disebut dengan matcher, berisi nilai yang diharapkan dari sebuah perintah yang dilakukan sebelumnya. Dalam jest sendiri terdapat berbagai matchers yang dapat digunakan, misalkan:
toBe(x) | bahwa nilai ekspektasi yang diharapkan adalah x |
toEqual(x) | bahwa nilai ekspektasi yang diharapkan sama dengan x |
toBeNull() | bahwa nilai ekspektasi yang diharapkan adalah null |
toBeTruthy() | bahwa nilai ekspektasi yang diharapkan adalah truth |
toBeFalsy() | bahwa nilai ekspektasi yang diharapkan adalah false |
Selain matchers di atas, Anda juga dapat melihat matcher lain yang dapat digunakan di sini https://jestjs.io/docs/using-matchers.
Pada framework jest, kita juga dapat menuliskan sebuah test secara grouping berdasarkan karakteristik ataupun grup yang sama menggunakan segmen describe , misalkan sebagai berikut:
describe('pengujian olah aritmatika', () => { test('#1 dua tambah dua adalah empat', () => { expect(2+2).toBe(4); }); test('#2 dua kali tiga adalah enam', () => { expect(2*3).toBe(6); }); });
Pengujian Kode
Kita telah mempelajari bentuk penulisan script test menggunakan Jest. Selanjutnya, kita akan membuat 2 buah fungsi untuk pengujian kode berdasarkan proyek yang sudah dibuat di materi sebelumnya. Perhatikan urutan langkahnya di bawah ini.
Buatlah file bernama gradeCalculations.js dalam folder latihantesting.
const averageExams = (valuesExam) => { const numberValidation = valuesExam.every(exam => typeof exam === 'number'); if (!numberValidation) throw Error('please input number'); const sumValues = valuesExam.reduce((accumulator,currentValue) => accumulator + currentValue, 0); return sumValues / valuesExam.length; }; const isStudentPassExam = (valuesExam, name) => { const minValues = 75; const average = averageExams(valuesExam); if (average > minValues) { console.log(`${name} pass the exams`); return true; } else { console.log(`${name} fail the exams`); return false; } }; module.exports = { averageExams, isStudentPassExam };
Kode di atas terdapat 2 fungsi:
- averageExams : Menghitung rata-rata nilai siswa dari sebuah inputan berupa daftar angka dalam bentuk array.
- isStudentPassExam : Melakukan kalkulasi apakah seorang siswa lulus ujian atau tidak berdasarkan nilai rata-rata yang didapatkan (bergantung pada fungsi averageExams).
Dari kedua contoh kode di atas, kita akan melakukan simulasi pengujian unit test & integration test.
Penulisan kode pengujian dapat dilakukan dengan memulai kerangka testcase yang sudah kita singgung diatas.
-
Apa yang akan diuji?
- Fungsi menghitung rata-rata.
- Fungsi untuk mengecek apakah seorang siswa lulus ujian.
-
Ekspektasi yang diharapkan?
- Menghasilkan nilai yang sesuai dari inputan.
- Inputan harus berupa angka.
- Menghasilkan hasil kelulusan iya/tidak pada siswa dengan nilai kriteria tertentu.
Setelah kita menuliskan contoh kode gradeCalculations.js, hal yang perlu dilakukan pada penulisan kode pengujian menggunakan jest adalah sebagai berikut:
- Simpan script test dalam sebuah folder bernama __tests__.
- 1 file test untuk 1 lingkup perintah dengan format namaScopeFunctions.test.js.
Dari contoh di atas maka semua testcase dari gradeCalculations ditulis di dalam gradeCalculations.test.js.
Penulisan unit test untuk kode averageExams sebagai berikut:
const { averageExams } = require('../gradeCalculations'); test('it should return exact average', () => { const listValueOfExams = [80, 100, 100, 80]; expect(averageExams(listValueOfExams)).toEqual(90); })
Untuk menjalankan kode pengujian tersebut, dapat menjalankan perintah runner yang sudah kita buat sebelumnya.
npm run test
Dari contoh di atas, kita dapat melihat bahwa test case tersebut sesuai ekspektasi. Selain itu, kita juga dapat membuat multiple case dengan membuat tes yang lain, misalnya dengan kode berikut:
test('it should handle non-number ', () => { const listValueOfExams = [80, 'a', '100', 80]; expect(() => averageExams(listValueOfExams)).toThrow(); })
Integration test dapat dijalankan ataupun ditulis bersamaan dengan unit test. Sehingga kita dapat melakukan grouping dari contoh kode diatas menjadi sebagai berikut:
const { averageExams, isStudentPassExam } = require('../gradeCalculations'); describe('grade calculations', () => { test('it should return exact average', () => { const listValueOfExams = [80, 100, 100, 80]; expect(averageExams(listValueOfExams)).toEqual(90); }); /** * Integration testing */ test('it should return exam passed status', () => { const listValueOfExams = [80, 100, 100, 80]; expect(isStudentPassExam(listValueOfExams, 'Budi')).toEqual(true); }) test('it should return exam failed status', () => { const listValueOfExams = [50, 40, 70, 80]; expect(isStudentPassExam(listValueOfExams, 'Budi')).toEqual(false); }) })
Setelah menuliskan semua test case yang ada, dengan jest kita dapat melihat laporan kode yang sudah terdapat pengujian dengan cara sebagai berikut:
npm run test -- --coverage
Setelah prosesnya selesai, jest akan secara otomatis men-generate laporan pengujian dalam folder coverage. Dalam folder tersebut terdapat:
- index.html berisi laporan test secara keseluruhan (1 proyek).
- fungsiDiTest.js.html berisi laporan test per kode pengujian.
Rangkuman Materi JavaScript Testing
Proses pengujian yang dilakukan secara automate memiliki kelebihan dan kekurangan masing-masing. Pembuatan kode pengujian akan menyita lebih banyak waktu saat proses pengembangan (di awal) perangkat lunak, dibandingkan jika kita tidak melakukan pengujian. Namun, proses pengujian yang dilakukan akan memastikan bahwasanya perangkat lunak yang kita bangun minim akan adanya kecacatan ketika perangkat lunak sudah digunakan oleh pengguna.
Kecacatan/bugs yang ditemukan setelah software dikonsumsi oleh pengguna, proses penelusuran kecacatan, sampai dengan perbaikan akan lebih memakan waktu. Selain itu, kita tidak dapat memastikan, bahwasanya perbaikan yang kita lakukan tidak menambah bugs baru ditempat yang lain.
Oleh karena itu, penulisan script kode pengujian sangat membantu, selain memastikan kualitas kode yang dibuat minim adanya kecacatan. Juga berimplikasi pada biaya waktu (time cost) pada pengembangan perangkat lunak.
Referensi
Sebelumnya : Pengenalan Node Package Manager | Selanjutnya : Belajar Membuat Front-End Web untuk Pemula |
0 Komentar