Test ve Entegrasyon
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 104 / 107.
Görev
KolayHer şeyin doğru çalıştığını doğrulayan testler yazarak Kütüphane Yönetim Sistemimizi tamamlayalım! Kitapların düzgün bir şekilde ödünç alınabildiğini ve iade edilebildiğini, ayrıca hata durumlarının doğru şekilde ele alındığını garanti eden, kütüphanenizin temel işlevlerini doğrulayan bir test dosyası oluşturacaksınız.
Kodunuzu beş dosya halinde düzenleyeceksiniz:
book.go:ID,Title,Author,ISBNveAvailablealanlarına sahipBookyapınız. Kitapları kullanılabilir (available) olarak başlatanNewBookyapıcı metodunu (constructor) ekleyin.user.go:ID,Name,EmailveBorrowedBooksalanlarına sahipUseryapınız.NewUseryapıcı metodunu ekleyin.library.go: Kitaplar ve kullanıcılar için map'ler içerenLibraryyapınız; ayrıcaNewLibrary,AddBook,AddUser,BorrowveReturnmetodlarını ekleyin.Borrowmetodu geçersiz kullanıcı, geçersiz kitap veya mevcut olmayan kitap durumlarında hata döndürmelidir.Returnmetodu ise geçersiz kullanıcı, geçersiz kitap veya ödünç alınmamış kitap durumlarında hata döndürmelidir.library_test.go: Test fonksiyonlarınızı buraya yazacaksınız! Şunları doğrulayan testler oluşturun:TestBorrowSuccess— Mevcut bir kitabın ödünç alınmasının başarılı olduğunu (hata döndürülmediğini), kitabın artık mevcut olmadığını ve kitap ID'sinin kullanıcının ödünç alınanlar listesine eklendiğini doğrulayın.TestBorrowUnavailable— Zaten ödünç alınmış bir kitabı ödünç alma girişiminin hata döndürdüğünü doğrulayın.TestBorrowInvalidUser— Var olmayan bir kullanıcı ID'si ile ödünç alma girişiminin hata döndürdüğünü doğrulayın.TestReturnSuccess— Ödünç alınan bir kitabın iade edilmesinin başarılı olduğunu, kitabın tekrar mevcut hale geldiğini ve kitap ID'sinin kullanıcının ödünç alınanlar listesinden çıkarıldığını doğrulayın.
Her test, gerekli kitaplar ve kullanıcılarla kendi kütüphanesini kurmalı, işlemi gerçekleştirmeli ve iddialar (assertions) başarısız olduğunda
t.Errorveyat.Errorfkullanarak sonuçları kontrol etmelidir.main.go: Testlerinizi manuel olarak çalıştırın ve sonuçları raporlayın. Yürütülecek test adını okuyun (borrow_success,borrow_unavailable,borrow_invalid_userveyareturn_success). Test adına bağlı olarak uygun senaryoyu kurun ve tüm iddialar geçersePASS, herhangi bir iddia başarısız olursaFAIL: [reason]yazdırın.
Aşağıdaki girdi sağlanacaktır:
- Bir test adı:
borrow_success,borrow_unavailable,borrow_invalid_userveyareturn_success
Her test için şu standart test verilerini (fixtures) kullanın:
- Kitap: ID
B001, BaşlıkGo Programming, YazarJohn Doe, ISBN123-456 - Kullanıcı: ID
U001, İsimAlice, E-postaalice@test.com
Örneğin, şu girdi verildiğinde:
borrow_successÇıktınız şöyle olmalıdır:
PASSVe şu girdi verildiğinde:
borrow_unavailableÇıktınız şöyle olmalıdır:
PASSVe şu girdi verildiğinde:
borrow_invalid_userÇıktınız şöyle olmalıdır:
PASSVe şu girdi verildiğinde:
return_successÇıktınız şöyle olmalıdır:
PASSborrow_success için: Kütüphane oluşturun, kitap ve kullanıcı ekleyin, kitabı ödünç alın, hata olmadığını doğrulayın, kitabın mevcut olmadığını doğrulayın, kullanıcının ödünç alınanlar listesinde kitabın olduğunu doğrulayın.
borrow_unavailable için: Kütüphane oluşturun, kitap ve kullanıcı ekleyin, kitabın Available değerini false yapın, ödünç almayı deneyin, bir hata döndürüldüğünü doğrulayın.
borrow_invalid_user için: Kütüphane oluşturun, sadece kitabı ekleyin (kullanıcı eklemeyin), U001 kullanıcı ID'si ile ödünç almayı deneyin, bir hata döndürüldüğünü doğrulayın.
return_success için: Kütüphane oluşturun, kitap ve kullanıcı ekleyin, önce kitabı ödünç alın, sonra iade edin, hata olmadığını doğrulayın, kitabın tekrar mevcut olduğunu doğrulayın, kullanıcının ödünç alınanlar listesinin boş olduğunu doğrulayın.
Test yazmak, kütüphane sisteminizin doğru davrandığından emin olmanızı sağlar ve mevcut işlevselliği bozmadan değişiklik yapma konusunda size güven verir!
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
testName, _ := reader.ReadString('\n')
testName = strings.TrimSpace(testName)
// Standart test fikstürleri
// Book: ID "B001", Title "Go Programming", Author "John Doe", ISBN "123-456"
// User: ID "U001", Name "Alice", Email "alice@test.com"
switch testName {
case "borrow_success":
// TODO: Mevcut bir kitabın ödünç alınmasının başarılı olduğunu test edin
// 1. Kütüphane oluşturun, kitap ve kullanıcı ekleyin
// 2. Kitabı ödünç alın
// 3. Doğrulayın: hata yok, kitap mevcut değil, kullanıcının listesinde kitap var
// Hepsi geçerse "PASS", herhangi biri başarısız olursa "FAIL: [neden]" yazdırın
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: Mevcut olmayan bir kitabın ödünç alınmasının hata döndürdüğünü test edin
// 1. Kütüphane oluşturun, kitap ve kullanıcı ekleyin
// 2. Kitabın Available değerini false olarak ayarlayın
// 3. Ödünç almayı deneyin
// 4. Bir hata döndürüldüğünü doğrulayın
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Geçersiz kullanıcıyla ödünç almanın hata döndürdüğünü test edin
// 1. Kütüphane oluşturun, sadece kitabı ekleyin (kullanıcı yok)
// 2. "U001" kullanıcı ID'si ile ödünç almayı deneyin
// 3. Bir hata döndürüldüğünü doğrulayın
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: Ödünç alınan bir kitabın iade edilmesinin başarılı olduğunu test edin
// 1. Kütüphane oluşturun, kitap ve kullanıcı ekleyin
// 2. Önce kitabı ödünç alın
// 3. Kitabı iade edin
// 4. Doğrulayın: hata yok, kitap mevcut, kullanıcının listesi boş
fmt.Println("FAIL: not implemented")
default:
fmt.Println("FAIL: unknown test")
}
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool12İleri Düzey OOP Kavramları
Functional Options DeseniGo'da Builder DeseniMetot ZincirlemeTür Takma Adları vs. TanımlamalarReflection TemelleriKod Üretimine Genel Bakış15Proje: Kütüphane Yönetimi
Projeye Genel Bakış ve YapıKitap ve Kullanıcı Struct'ları