Pengujian dan Integrasi
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 104 dari 107.
Tantangan
MudahMari tuntaskan Library Management System-mu dengan menulis tes yang memastikan semuanya berfungsi dengan benar! Kamu akan membuat file tes untuk memvalidasi fungsi inti library-mu: memastikan buku dapat dipinjam dan dikembalikan dengan benar, serta kondisi error ditangani dengan benar.
Kamu akan mengatur kodemu dalam lima file:
book.go: structBook-mu dengan fieldID,Title,Author,ISBN, danAvailable. Sertakan konstruktorNewBookyang menginisialisasi buku sebagai tersedia.user.go: structUser-mu dengan fieldID,Name,Email, danBorrowedBooks. Sertakan konstruktorNewUser.library.go: structLibrary-mu dengan map untuk buku dan pengguna, beserta methodNewLibrary,AddBook,AddUser,Borrow, danReturn. MethodBorrowharus mengembalikan error untuk pengguna tidak valid, buku tidak valid, atau buku yang tidak tersedia. MethodReturnharus mengembalikan error untuk pengguna tidak valid, buku tidak valid, atau buku yang belum dipinjam.library_test.go: Di sinilah kamu akan menulis fungsi tes! Buat tes untuk memverifikasi:TestBorrowSuccess: Verifikasi bahwa peminjaman buku yang tersedia berhasil (tidak ada error yang dikembalikan), buku menjadi tidak tersedia, dan ID buku ditambahkan ke list buku yang dipinjam oleh penggunaTestBorrowUnavailable: Verifikasi bahwa meminjam buku yang sudah dipinjam akan mengembalikan errorTestBorrowInvalidUser: Verifikasi bahwa peminjaman dengan ID pengguna yang tidak ada akan mengembalikan errorTestReturnSuccess: Verifikasi bahwa pengembalian buku yang dipinjam berhasil, buku kembali tersedia, dan ID buku dihapus dari list buku yang dipinjam oleh pengguna
Setiap tes harus menyiapkan library sendiri dengan buku dan pengguna yang diperlukan, melakukan operasi, lalu memeriksa hasilnya menggunakan
t.Errorataut.Errorfjika pemeriksaan gagal.main.go: Jalankan tes secara manual dan laporkan hasilnya. Baca nama tes yang akan dijalankan (borrow_success,borrow_unavailable,borrow_invalid_user, ataureturn_success). Berdasarkan nama tes, siapkan skenario yang sesuai dan cetakPASSjika semua pemeriksaan berhasil, atauFAIL: [reason]jika ada pemeriksaan yang gagal.
Input berikut akan diberikan:
- Nama tes:
borrow_success,borrow_unavailable,borrow_invalid_user, ataureturn_success
Untuk setiap tes, gunakan data tes standar berikut:
- Buku: ID
B001, JudulGo Programming, PenulisJohn Doe, ISBN123-456 - Pengguna: ID
U001, NamaAlice, Emailalice@test.com
Contohnya, jika diberikan:
borrow_successOutput-mu harus berupa:
PASSDan jika diberikan:
borrow_unavailableOutput-mu harus berupa:
PASSDan jika diberikan:
borrow_invalid_userOutput-mu harus berupa:
PASSDan jika diberikan:
return_successOutput-mu harus berupa:
PASSUntuk borrow_success: Buat library, tambahkan buku dan pengguna, pinjam buku, verifikasi tidak ada error, verifikasi buku tidak tersedia, lalu verifikasi pengguna memiliki buku tersebut di list buku yang dipinjam.
Untuk borrow_unavailable: Buat library, tambahkan buku dan pengguna, atur Available buku menjadi false, coba pinjam buku, lalu verifikasi error dikembalikan.
Untuk borrow_invalid_user: Buat library, tambahkan buku saja (tanpa pengguna), coba pinjam menggunakan ID pengguna U001, lalu verifikasi error dikembalikan.
Untuk return_success: Buat library, tambahkan buku dan pengguna, pinjam buku terlebih dahulu, lalu kembalikan buku, verifikasi tidak ada error, verifikasi buku kembali tersedia, lalu verifikasi list buku yang dipinjam oleh pengguna kosong.
Menulis tes memastikan sistem library-mu berfungsi dengan benar dan memberimu keyakinan untuk membuat perubahan tanpa merusak fungsi yang sudah ada!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
testName, _ := reader.ReadString('\n')
testName = strings.TrimSpace(testName)
// Data uji standar
// Buku: ID "B001", Judul "Go Programming", Penulis "John Doe", ISBN "123-456"
// Pengguna: ID "U001", Nama "Alice", Email "alice@test.com"
switch testName {
case "borrow_success":
// TODO: Uji bahwa peminjaman buku yang tersedia berhasil
// 1. Buat library, tambahkan buku dan pengguna
// 2. Pinjam buku tersebut
// 3. Pastikan: tidak ada error, buku tidak tersedia, buku ada dalam list pengguna
// Cetak "PASS" jika semua berhasil, atau "FAIL: [reason]" jika ada yang gagal
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: Uji bahwa peminjaman buku yang tidak tersedia menghasilkan error
// 1. Buat library, tambahkan buku dan pengguna
// 2. Atur Available pada buku menjadi false
// 3. Coba pinjam buku tersebut
// 4. Pastikan error dihasilkan
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Uji bahwa meminjam dengan user yang tidak valid menghasilkan error
// 1. Buat library, tambahkan hanya buku (tanpa user)
// 2. Coba pinjam dengan ID user "U001"
// 3. Pastikan error dikembalikan
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: Uji bahwa mengembalikan buku yang dipinjam berhasil
// 1. Buat library, tambahkan buku dan pengguna
// 2. Pinjam bukunya terlebih dahulu
// 3. Kembalikan bukunya
// 4. Pastikan: tidak ada error, buku tersedia, list milik user kosong
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker Pool12Konsep OOP Lanjutan
Pola Opsi FungsionalPola Builder di GoMethod ChainingAlias Tipe vs DefinisiDasar-Dasar ReflectionGambaran Umum Pembuatan Kode15Proyek: Manajemen Library
Ikhtisar dan Struktur ProyekStruct Buku dan PenggunaLatihan sendiri: Compiler Go online