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! Kütüphanenizin temel işlevlerini doğrulayan bir test dosyası oluşturacaksınız: kitapların düzgün şekilde ödünç alınabilmesini ve iade edilebilmesini, ayrıca hata durumlarının doğru şekilde ele alınmasını sağlayacaksınız.
Kodunuzu beş dosya boyunca düzenleyeceksiniz:
book.go:ID,Title,Author,ISBNveAvailablealanlarına sahipBookyapınız. Kitapları kullanılabilir olarak başlatanNewBookoluşturucusunu ekleyin.user.go:ID,Name,EmailveBorrowedBooksalanlarına sahipUseryapınız.NewUseroluşturucusunu ekleyin.library.go: Kitaplar ve kullanıcılar için eşlemelere sahipLibraryyapınız; ayrıcaNewLibrary,AddBook,AddUser,BorrowveReturnyöntemlerini ekleyin.Borrowyöntemi geçersiz kullanıcı, geçersiz kitap veya kullanılabilir olmayan kitap durumlarında hata döndürmelidir.Returnyöntemi geçersiz kullanıcı, geçersiz kitap veya ödünç alınmamış kitap durumlarında hata döndürmelidir.library_test.go: Test işlevlerinizi burada yazacaksınız! Şunları doğrulayan testler oluşturun:TestBorrowSuccess: Kullanılabilir bir kitabın ödünç alınmasının başarılı olduğunu (hata döndürülmediğini), kitabın kullanılabilir olmadığını ve kitap kimliğinin kullanıcının ödünç aldığı kitaplar listesine eklendiğini doğrulayınTestBorrowUnavailable: Daha önce ödünç alınmış bir kitabı ödünç almanın hata döndürdüğünü doğrulayınTestBorrowInvalidUser: Var olmayan bir kullanıcı kimliğiyle ödünç alma işleminin hata döndürdüğünü doğrulayınTestReturnSuccess: Ödünç alınmış bir kitabın iade edilmesinin başarılı olduğunu, kitabın yeniden kullanılabilir hâle geldiğini ve kitap kimliğinin kullanıcının ödünç aldığı kitaplar listesinden kaldırıldığını doğrulayın
Her test, gerekli kitap ve kullanıcılarla kendi kütüphanesini oluşturmalı, işlemi gerçekleştirmeli ve doğrulamalar başarısız olduğunda sonuçları
t.Errorveyat.Errorfkullanarak kontrol etmelidir.main.go: Testlerinizi manuel olarak çalıştırın ve sonuçları bildirin. Çalıştırılacak test adını okuyun (borrow_success,borrow_unavailable,borrow_invalid_userveyareturn_success). Test adına göre uygun senaryoyu oluşturun ve tüm doğrulamalar başarılı olursaPASS, herhangi bir doğrulama 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 kullanın:
- Kitap: Kimlik
B001, BaşlıkGo Programming, YazarJohn Doe, ISBN123-456 - Kullanıcı: Kimlik
U001, AdAlice, E-postaalice@test.com
Örneğin, şu girdi verildiğinde:
borrow_successÇıktınız şu olmalıdır:
PASSVe şu girdi verildiğinde:
borrow_unavailableÇıktınız şu olmalıdır:
PASSVe şu girdi verildiğinde:
borrow_invalid_userÇıktınız şu olmalıdır:
PASSVe şu girdi verildiğinde:
return_successÇıktınız şu olmalıdır:
PASSborrow_success için: Kütüphaneyi oluşturun, kitap ve kullanıcı ekleyin, kitabı ödünç alın, hata olmadığını doğrulayın, kitabın kullanılabilir olmadığını doğrulayın ve kullanıcının ödünç aldığı kitaplar listesinde kitabın bulunduğunu doğrulayın.
borrow_unavailable için: Kütüphaneyi oluşturun, kitap ve kullanıcı ekleyin, kitabın Available değerini false olarak ayarlayın, ödünç almaya çalışın ve bir hata döndürüldüğünü doğrulayın.
borrow_invalid_user için: Kütüphaneyi oluşturun, yalnızca kitabı ekleyin (kullanıcı eklemeyin), U001 kullanıcı kimliğiyle ödünç almaya çalışın ve bir hata döndürüldüğünü doğrulayın.
return_success için: Kütüphaneyi oluşturun, kitap ve kullanıcı ekleyin, önce kitabı ödünç alın, ardından iade edin, hata olmadığını doğrulayın, kitabın yeniden kullanılabilir olduğunu doğrulayın ve kullanıcının ödünç aldığı kitaplar listesinin boş olduğunu doğrulayın.
Test yazmak, kütüphane sisteminizin doğru davranmasını sağlar ve mevcut işlevselliği bozmadan değişiklikler yapabileceğiniz 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
// Kitap: ID "B001", Başlık "Go Programming", Yazar "John Doe", ISBN "123-456"
// Kullanıcı: ID "U001", Ad "Alice", E-posta "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 et
// 1. Kütüphane oluştur, kitap ve kullanıcı ekle
// 2. Kitabı ödünç al
// 3. Doğrula: hata yok, kitap müsait değil, kullanıcının listesinde kitap var
// Tümü geçerse "PASS" yazdır, herhangi biri başarısız olursa "FAIL: [reason]" yazdır
fmt.Println("FAIL: not implemented")
case "borrow_unavailable":
// TODO: Müsait olmayan kitabın ödünç alınmasının hata döndürdüğünü test et
// 1. Kütüphane oluştur, kitap ve kullanıcı ekle
// 2. Kitabın Available değerini false yap
// 3. Ödünç almayı dene
// 4. Bir hata döndürüldüğünü doğrula
fmt.Println("FAIL: not implemented")
case "borrow_invalid_user":
// TODO: Geçersiz kullanıcı ile ödünç almanın hata döndürdüğünü test et
// 1. Kütüphane oluştur, yalnızca kitabı ekle (kullanıcı yok)
// 2. Kullanıcı ID'si "U001" ile ödünç almayı dene
// 3. Bir hata döndürüldüğünü doğrula
fmt.Println("FAIL: not implemented")
case "return_success":
// TODO: Ödünç alınmış bir kitabın iadesinin başarılı olduğunu test et
// 1. Kütüphane oluştur, kitap ve kullanıcı ekle
// 2. Önce kitabı ödünç al
// 3. Kitabı iade et
// 4. Doğrula: hata yok, kitap müsait, 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ıKendi başına pratik yap: Online Go derleyicisi