Episode ini membahas pengujian aplikasi WebSocket: unit testing server dengan Jest, integration testing klien-server, load testing dengan Artillery dan k6, serta chaos testing untuk simulasi kegagalan jaringan.

Bug WebSocket sulit ditemukan manual: masalah muncul hanya saat banyak koneksi, saat koneksi putus di tengah jalan, atau saat pesan datang di luar urutan. Pengujian otomatis adalah satu-satunya cara memastikan semua skenario itu bekerja sebelum pengguna menemukannya.
Episode 26 membahas testing WebSocket applications dari unit hingga chaos: menguji logika server secara terisolasi, menguji interaksi klien-server, membanjiri server dengan load test, dan menyimulasikan kegagalan untuk melihat perilaku aplikasi.
Fungsi yang bisa diuji tanpa server adalah target unit test terbaik — pisahkan logika murni dari efek samping.
function bangunEnvelope(type, payload) {
return {
v: 2,
type,
id: "m_" + Date.now(),
data: payload,
};
}
module.exports = { bangunEnvelope };bangunEnvelope(type, payload) murni: input sama, output sama, tanpa IO. Fungsi seperti ini diuji cepat dan memberi kepercayaan pada bagian yang paling sering berubah — format pesan.
Untuk menguji handler yang bergantung pada objek WebSocket, gunakan mock.
test("menolak pesan tanpa tipe", () => {
const mockWs = {
send: jest.fn(),
close: jest.fn(),
};
handlerPesan(mockWs, '{"teks":"halo"}');
expect(mockWs.close).toHaveBeenCalledWith(1008, "format tidak valid");
});mockWs menggantikan objek WebSocket sungguhan. Test menegaskan perilaku: close dipanggil dengan kode 1008 saat pesan tidak punya tipe.
Integration test membuka server sungguhan di port test, lalu menghubungkan klien.
const WebSocket = require("ws");
test("klien menerima broadcast", async () => {
const server = mulaiServer(0);
const klien1 = new WebSocket("ws://localhost:" + server.port);
const klien2 = new WebSocket("ws://localhost:" + server.port);
await tungguTerbuka(klien1);
await tungguTerbuka(klien2);
klien1.send(JSON.stringify({ type: "chat", teks: "halo" }));
const terima = await tungguPesan(klien2);
expect(JSON.parse(terima).teks).toBe("halo");
server.tutup();
});mulaiServer(0) memakai port acak agar test tidak bentrok. Test ini memverifikasi skenario end-to-end: satu klien mengirim, klien lain menerima.
Uji juga fase hidup koneksi: handshake, pesan, penutupan normal, dan penutupan abnormal. Pastikan handler close, error, dan ping dipanggil sesuai skenario.
Artillery membanjiri server dengan skenario koneksi.
config:
target: ws://localhost:8080
phases:
- duration: 60
arrivalRate: 10
scenarios:
- engine: ws
flow:
- send: '{"type":"chat","teks":"halo"}'
- think: 1arrivalRate: 10 membuka 10 koneksi baru per detik selama 60 detik. Hasilnya menunjukkan berapa koneksi maksimal yang bisa ditahan server sebelum latensi memburuk.
k6 menguji WebSocket dengan skrip JavaScript.
import ws from "k6/ws";
import { check } from "k6";
export default function () {
const res = ws.connect("ws://localhost:8080", (socket) => {
socket.on("open", () => {
socket.send('{"type":"chat","teks":"test"}');
});
socket.on("message", (data) => {
check(data, { "ada balasan": (d) => d.length > 0 });
});
});
}ws.connect(...) di k6 membuka koneksi, mengirim pesan, dan memverifikasi balasan. Jalankan dengan k6 run script.js untuk melihat metrik seperti waktu koneksi dan persentil respons.
Chaos testing sengaja memutus koneksi untuk melihat apakah sistem pulih.
test("reconnect memulihkan room", async () => {
const klien = bukaKoneksi();
klien.emit("room:join", "kritikal");
// paksa koneksi terputus
klien.disconnect();
klien.connect();
await tungguKoneksi(klien);
expect(klien.rooms).toContain("kritikal");
});klien.disconnect() lalu klien.connect() menyimulasikan jaringan putus. Test memverifikasi klien kembali ke room setelah reconnect — persis perilaku yang dibahas di episode 12.
Selain putus koneksi, uji juga:
Episode 26 melengkapi kalian dengan jaring pengaman: unit test untuk logika, integration test untuk interaksi nyata, load test untuk kapasitas, dan chaos test untuk ketahanan.
Inti yang harus dibawa pulang:
Di episode 27 berikutnya kita membahas Docker & containerization: Dockerfile untuk server WebSocket, multi-stage build, docker networking, Docker Compose dengan Redis, dan health check.