yoklateknik mülakat

Backend Go Testing Tooling Mülakat Soruları

75 doğrulanmış Backend Go Testing Tooling mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Go Testing ToolingZorluk 1
Bir Go kaynak dosyasının test dosyası sayılmasını, yalnızca go test çalıştırıldığında derlenmesini ve normalde go build'in dışında kalmasını sağlayan isimlendirme kuralı hangisidir?
  • aPaket adının package test olarak bildirilmesi gerekir.
  • bDosya adının _test.go ile bitmesi gerekir.
  • cDosya adının test_ ile başlaması gerekir.
  • dDosyanın .go yerine .test uzantısı kullanması gerekir.
Açıklama:go build, adı _test.go ile biten dosyaları yok sayar; go test bu dosyaları ayrı bir test binary'sinde derler. Paket adı ya da dosya adı öneki bu kuralı etkilemez.
Go Testing ToolingZorluk 2
package calc

import "testing"

func TestSum(t testing.T) {
    if Sum(2, 3) != 5 {
        t.Error("wrong sum")
    }
}

Bu dosyada go test çalıştırıldığında ne olur?
  • aDerleme hatası verir.
  • bDiğer testler gibi çalışır ve PASS/FAIL raporlar.
  • cgo test derlemeden önce imzayı otomatik düzeltir.
  • dDerlenir ama go test bunu bir test olarak hiç çalıştırmaz.
Açıklama:go test yalnızca imzası tam olarak func TestXxx(t testing.T) olan fonksiyonları çağırır. Burada t, testing.T değil değer türünde testing.T'dir. Fonksiyon yine de derlenir — Go, t.Error gibi pointer-receiver bir metodu çağırmak için adreslenebilir yerel değişkeni otomatik adresler — ama test çalıştırıcısı bu imzayı test olarak tanımaz, dolayısıyla sessizce atlanır. go vet genelde bunu bozuk test imzası olarak işaretler.
Go Testing ToolingZorluk 1
Bir test fonksiyonu içinde t.Error(...) ile t.Fatal(...) çağırmak arasındaki temel fark nedir?
  • at.Error testi başarısız işaretler ve devam eder; t.Fatal başarısız işaretler ve goroutine'i durdurur.
  • bt.Fatal testi başarısız işaretler ve devam etmesine izin verir; t.Error goroutine'i hemen durdurur.
  • ct.Fatal yalnızca TestMain içinden çağrılabilir, normal bir TestXxx fonksiyonundan çağrılamaz.
  • dİkisi aynı şekilde davranır; tek fark t.Fatal'ın ayrıca bir stack trace basmasıdır.
Açıklama:t.Error (log + başarısız işaretleme) kontrolü çağırana geri döndürür, bu yüzden sonraki ifadeler çalışmaya devam eder. t.Fatal testi başarısız işaretler ve runtime.Goexit çağırır; bu da o goroutine'in çalışmasını durdurur — aynı fonksiyonda t.Fatal'dan sonraki ifadeler asla çalışmaz, ancak kayıtlı t.Cleanup fonksiyonları yine de çalışır.
Go Testing ToolingZorluk 2
func TestAdd(t *testing.T) {
    cases := []struct {
        name       string
        a, b, want int
    }{
        {"positive", 2, 3, 5},
        {"negative", -1, -1, -2},
    }
    for _, c := range cases {
        t.Run(c.name, func(t *testing.T) {
            if Add(c.a, c.b) != c.want {
                t.Errorf("Add(%d,%d): want %d", c.a, c.b, c.want)
            }
        })
    }
}

cases üzerinde t.Run kullanmadan döngü kurmaya kıyasla, her case'i t.Run(c.name, ...) içine sarmak ne kazandırır?
  • aDöngü otomatik olarak CPU çekirdekleri arasında paralelleştirilir.
  • bBu sözdizimsel bir zorunluluktur; t.Run olmadan table-driven test derlenmez.
  • cHer case, -run ile hedeflenebilen, kendi adına sahip bir sonuç alır.
  • dCase'ler her seferinde rastgele bir sırada çalışır.
Açıklama:t.Run, kendi adına (TestAdd/positive, TestAdd/negative) ve kendi pass/fail durumuna sahip bir subtest oluşturur; bu, -v ile ayrı ayrı gösterilir ve -run TestAdd/negative ile hedeflenebilir. Kendi başına hiçbir şeyi paralelleştirmez — bunun için subtest gövdesi içinde t.Parallel() çağırmak gerekir.
Go Testing ToolingZorluk 2
TestAdd içinde t.Run("negative", ...) ile oluşturulan bir subtest varsa, yalnızca bu subtest'i çalıştıran komut hangisidir?
  • ago test -run TestAdd -sub negative
  • bgo test -run TestAdd/negative
  • cgo test -subtest negative
  • dgo test TestAdd/negative
Açıklama:-run, test ve subtest adlarının eğik çizgiyle ayrılmış yoluna karşı eşleştirilen bir düzenli ifade alır; bu yüzden TestAdd/negative yalnızca o subtest'i seçer. -sub ve -subtest gerçek go test bayrakları değildir, test adları da düz konumsal argüman olarak verilmez.
Go Testing ToolingZorluk 3
t.Run ile oluşturulan bir subtest içinde ilk satır t.Parallel()'dir. Bu çağrı gerçekte ne yapar?
  • aBu subtest'i, serial olanlar bitince paralel kardeşleriyle birlikte çalışacak şekilde işaretler.
  • bBu subtest'i normal test zamanlayıcısının dışında ayrı bir OS thread'ine gönderir.
  • cgo test'e ayrıca açık bir -parallel bayrağı verilmedikçe hiçbir işe yaramaz.
  • dO subtest için t.Error ve t.Fatal'ı devre dışı bırakır.
Açıklama:t.Parallel(), üst fonksiyon paralel olmayan (serial) subtest'lerini bitirdikten sonra bu subtest'in diğer paralel kardeşleriyle birlikte çalışabileceğini test çalıştırıcısına bildirir. t.Error/t.Fatal bir paralel subtest içinde de normal şekilde çalışmaya devam eder; go test -parallel yalnızca maksimum eşzamanlılığı kontrol eder, t.Parallel()'ın etkili olup olmayacağını değil.

3300 soruluk Backend bankasında kendini sına.

Mülakata başla