Skip to content

Day 19 — Bug Fixing, QA Testing & Final Polish

Fase: 2 — Mini Project Asset Management | Minggu: 4 | Hari: Kamis


🎯 Tujuan Hari Ini

Tim melakukan pengujian menyeluruh (QA), memperbaiki semua bug yang ditemukan, memastikan tidak ada celah validasi, dan mempersiapkan presentasi akhir besok.


📋 Task Wajib

1. QA Testing Full-Suite (09:00 – 12:00)

QA Tester memimpin sesi pengujian. Setiap anggota tim ikut serta — rotate dan coba tekan/break fitur satu orang lainnya!

Gunakan tabel test case berikut. Isi kolom Status dan Catatan:

🔵 Modul Category

#Test CaseInputExpectedStatusCatatan
C01Tambah kategori baruNama: "Server & Jaringan"Berhasil tersimpan
C02Tambah kategori nama duplikatNama: "Elektronik" (sudah ada)Validasi error
C03Tambah kategori nama terlalu pendekNama: "A"Validasi error (min:2)
C04Edit nama kategori sudah ada (milik sendiri)Edit "Elektronik" → "Elektronik"Tidak error (unique ignore self)
C05Hapus kategori yang punya asetPilih kategori ber-asetMuncul pesan error, tidak terhapus
C06Hapus kategori tanpa asetKategori yang baruBerhasil dihapus

🟢 Modul Asset

#Test CaseInputExpectedStatusCatatan
A01Tambah aset tanpa kategoriKosongkan dropdownValidasi error
A02Tambah aset kode duplikatCode: "EL-001" (sudah ada)Validasi error
A03Tambah aset stok negatifStock: -5Validasi error (min:0)
A04Tambah aset stok 0Stock: 0Berhasil, tapi tidak muncul di dropdown pinjaman
A05Edit aset: ganti ke kategori lainPilih kategori bedaBerhasil update
A06Hapus aset yang masih punya pinjaman aktifAset aktif dipinjamHarus muncul error (karena constrained)

🟡 Modul Peminjaman (Loan)

#Test CaseInputExpectedStatusCatatan
L01Pinjam aset dengan stok 0(Tidak ada di dropdown)Tidak bisa dipilih
L02Pinjam lebih dari stok tersediaQty: 999 untuk aset stok 2Validasi error stok
L03Tanggal kembali sebelum tanggal pinjamReturn: kemarinValidasi error
L04Pinjam quantity tepat sama dengan stokQty = StockBerhasil, stok jadi 0
L05Kembalikan asetKlik konfirmasi kembalikanStatus "Dikembalikan", stok bertambah
L06Coba kembalikan yg sudah dikembalikanAkses URL return lagiMuncul pesan error
L07Aset yang stoknya 0 → tidak muncul di form pinjam-Dropdown hanya tampilkan stok > 0

🔴 Modul Dashboard

#Test CaseExpectedStatus
D01Widget "Sedang Dipinjam" sesuai data realCount aktual sama
D02Widget "Terlambat" muncul merah jika adaWarna card merah
D03Alert terlambat muncul jika ada pinjaman lewat tanggalSection merah tampil
D04"Stok Menipis" tampil aset dengan stok ≤ 2Data akurat

2. Perbaiki Bug yang Ditemukan

Untuk setiap bug yang ditemukan, buat Git Issue di GitHub:

Title: [BUG] - Deskripsi singkat
Body:
- Steps to reproduce: ...
- Expected behavior: ...
- Actual behavior: ...
- Screenshot: [lampirkan]

Buat branch bugfix/[nama-bug] untuk setiap perbaikan, lalu PR ke main.

3. Tambahkan Fitur Kecil yang Meningkatkan UX

Implementasikan setidaknya 2 dari 4 fitur bonus berikut:

Bonus A: Flash Message Otomatis Hilang

Tambahkan di bagian bawah layouts/app.blade.php:

html
@stack('scripts')
<script>
    // Auto-hide flash messages setelah 4 detik
    setTimeout(function() {
        const alerts = document.querySelectorAll('.flash-alert');
        alerts.forEach(el => {
            el.style.transition = 'opacity 0.5s';
            el.style.opacity = '0';
            setTimeout(() => el.remove(), 500);
        });
    }, 4000);
</script>

Update partials/alert.blade.php tambahkan class flash-alert:

html
<div class="flash-alert" style="...">...</div>

Bonus B: Konfirmasi Hapus Lebih Baik

Ganti semua onsubmit="return confirm(...)" dengan modal custom atau SweetAlert2:

html
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
document.querySelectorAll('.btn-hapus').forEach(btn => {
    btn.addEventListener('click', function(e) {
        e.preventDefault();
        const form = this.closest('form');
        Swal.fire({
            title: 'Yakin hapus?',
            text: 'Tindakan ini tidak bisa dibatalkan!',
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#dc3545',
            cancelButtonText: 'Batal',
            confirmButtonText: 'Ya, hapus!'
        }).then((result) => {
            if (result.isConfirmed) form.submit();
        });
    });
});
</script>

Bonus C: Fitur Pencarian di Halaman Asset

Tambahkan form pencarian di assets/index.blade.php:

html
<form method="GET" action="{{ route('assets.index') }}" style="margin-bottom:20px; display:flex; gap:10px;">
    <input type="text" name="search" value="{{ request('search') }}"
           placeholder="Cari nama atau kode aset..."
           style="flex:1; padding:10px; border:1px solid #ddd; border-radius:6px;">
    <button type="submit" style="padding:10px 20px; background:#1a1a2e; color:white; border:none; border-radius:6px; cursor:pointer;">
        🔍 Cari
    </button>
    @if(request('search'))
    <a href="{{ route('assets.index') }}" style="padding:10px; border:1px solid #ddd; border-radius:6px; text-decoration:none; color:#666;">✕ Reset</a>
    @endif
</form>

Update AssetController@index:

php
$assets = Asset::with('category')
               ->when(request('search'), function ($q) {
                   $q->where('name', 'like', '%' . request('search') . '%')
                     ->orWhere('code', 'like', '%' . request('search') . '%');
               })
               ->orderBy('name')
               ->paginate(10)->withQueryString();

Bonus D: Halaman Not Found (404) Custom

Buat resources/views/errors/404.blade.php:

html
@extends('layouts.app')
@section('title', 'Halaman Tidak Ditemukan')

@section('content')
<div style="text-align:center; padding:80px 20px;">
    <span style="font-size:80px;">🔍</span>
    <h1 style="font-size:48px; color:#1a1a2e; margin:20px 0;">404</h1>
    <p style="font-size:18px; color:#666; margin-bottom:30px;">Halaman yang kamu cari tidak ditemukan.</p>
    <a href="/" style="background:#1a1a2e; color:white; padding:14px 30px; border-radius:8px; text-decoration:none; font-size:15px;">
        🏠 Kembali ke Dashboard
    </a>
</div>
@endsection

4. Persiapan Presentasi Akhir

Setiap anggota tim menyiapkan:

  • [ ] Slide presentasi (Google Slides / PowerPoint, max 10 slide)
  • [ ] Pastikan aplikasi berjalan tanpa error di laptop masing-masing
  • [ ] Siapkan data demo (kategori, aset, dan pinjaman yang realistis)

Struktur slide yang disarankan:

  1. Cover: Nama aplikasi, nama tim, tanggal
  2. Latar belakang & tujuan aplikasi
  3. Fitur-fitur yang sudah dibangun (screenshot)
  4. Demo live (tidak perlu slide)
  5. Tantangan teknis yang dihadapi & cara mengatasinya
  6. Rencana pengembangan ke depan (jika diteruskan)
  7. Terima kasih / Q&A

📝 Laporan ke Mentor

📌 LAPORAN HARIAN — Day 19
Nama     : [Nama Lengkap]
Role     : [Role Kamu]

✅ Yang saya kerjakan hari ini:
- [ ] Menjalankan seluruh test case (min. yang sesuai role)
- [ ] Mendokumentasikan semua bug di GitHub Issues
- [ ] Semua bug kritikal sudah diperbaiki
- [ ] Minimal 2 fitur bonus diimplementasikan
- [ ] Slide presentasi sudah disiapkan (minimal draft)

📊 Hasil QA:
| Modul | Total Test | PASS | FAIL | Notes |
|-------|-----------|------|------|-------|
| Category | 6 | | | |
| Asset | 6 | | | |
| Loan | 7 | | | |
| Dashboard | 4 | | | |
| **Total** | **23** | | | |

🐛 Bug yang Ditemukan & Status:
1. [nama bug] → [status: fixed/open]
2. [nama bug] → [status: fixed/open]

🎯 Kesiapan Presentasi (1-10): ___

❓ Ada hal yang masih perlu diklarifikasi mentor sebelum besok?
[Tulis pertanyaan terakhirmu]

Catatan Mentor

Hari ini adalah "stress test" aplikasi. Dorong peserta untuk mencoba hal-hal ekstrim:

  • Apa yang terjadi jika stok mencapai 0 setelah dipinjam semua?
  • Apa yang terjadi jika ada dua orang meminjam aset yang sama secara hampir bersamaan?
  • Apa yang terjadi jika user menghapus URL manua untuk mengakses ID yang tidak ada?

Setiap kasus ini adalah pembelajaran berharga tentang edge case handling di dunia nyata.

Program Magang SMK RPL — Rekayasa Perangkat Lunak