{"id":39181,"date":"2026-02-16T03:40:51","date_gmt":"2026-02-16T00:40:51","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39181"},"modified":"2026-02-16T03:40:51","modified_gmt":"2026-02-16T00:40:51","slug":"goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/","title":{"rendered":"Go&#8217;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Go&#8217;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00fcretilen kodun kalitesi, g\u00fcvenilirli\u011fi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi kritik \u00f6neme sahiptir. Hatal\u0131 \u00e7al\u0131\u015fan, beklenmedik davran\u0131\u015flar sergileyen veya kolayca bozulan bir yaz\u0131l\u0131m, kullan\u0131c\u0131 deneyimini olumsuz etkilemekle kalmaz, ayn\u0131 zamanda bak\u0131m maliyetlerini de \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu sorunlar\u0131n \u00f6n\u00fcne ge\u00e7mek i\u00e7in geli\u015ftiriciler, yaz\u0131l\u0131mlar\u0131n\u0131 \u00e7e\u015fitli test y\u00f6ntemleriyle do\u011frularlar. Bu y\u00f6ntemler aras\u0131nda belki de en temel ve yayg\u0131n olan\u0131 birim testleridir.<\/p>\n<p>Birim testi, bir yaz\u0131l\u0131m\u0131n en k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z ve test edilebilir par\u00e7as\u0131n\u0131n (bir fonksiyon, bir metot, bir mod\u00fcl) do\u011fru \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in yaz\u0131lan otomatik testlerdir. Go (Golang), bu test s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in yerle\u015fik ve olduk\u00e7a g\u00fc\u00e7l\u00fc bir test \u00e7er\u00e7evesi sunar: <code>testing<\/code> paketi. Bu makale, Go&#8217;da etkili birim testleri yazman\u0131n temellerinden ileri seviye tekniklerine kadar geni\u015f bir yelpazeyi kapsayacakt\u0131r. Amac\u0131m\u0131z, Go geli\u015ftiricilerinin g\u00fcvenilir, bak\u0131m\u0131 kolay ve y\u00fcksek kaliteli yaz\u0131l\u0131mlar \u00fcretmelerine yard\u0131mc\u0131 olacak pratik bilgiler sunmakt\u0131r.<\/p>\n<h2>Neden Birim Testi Yazmal\u0131y\u0131z?<\/h2>\n<p>Birim testleri yazmak, ba\u015flang\u0131\u00e7ta ekstra bir \u00e7aba gibi g\u00f6r\u00fcnse de, uzun vadede projenin sa\u011fl\u0131\u011f\u0131 ve geli\u015ftirme h\u0131z\u0131na \u00f6nemli katk\u0131lar sa\u011flar. \u0130\u015fte birim testlerinin sundu\u011fu ba\u015fl\u0131ca avantajlar:<\/p>\n<p>*   <strong>Hata Yakalama ve D\u00fczeltme Maliyetini Azaltma:<\/strong> Hatalar ne kadar erken tespit edilirse, d\u00fczeltme maliyetleri o kadar d\u00fc\u015f\u00fck olur. Birim testleri, hatalar\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fcn en erken a\u015famalar\u0131nda, yani kod daha entegre edilmeden \u00f6nce yakalar.<br \/>\n*   <strong>Kod Kalitesini Art\u0131rma:<\/strong> Test edilebilir kod yazmak, do\u011fal olarak daha mod\u00fcler, daha okunabilir ve daha iyi tasarlanm\u0131\u015f kod yazmay\u0131 te\u015fvik eder. Fonksiyonlar\u0131 k\u00fc\u00e7\u00fck, tek bir sorumlulu\u011fa sahip olacak \u015fekilde tasarlamak, hem test yazmay\u0131 kolayla\u015ft\u0131r\u0131r hem de kodun genel kalitesini y\u00fckseltir.<br \/>\n*   <strong>Refactoring G\u00fcvenli\u011fi:<\/strong> Mevcut kodu yeniden d\u00fczenlerken (refactoring), bir \u015feyleri bozma endi\u015fesi yayg\u0131nd\u0131r. Kapsaml\u0131 birim testleri, refactoring sonras\u0131 kodun hala do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayan bir g\u00fcvenlik a\u011f\u0131 g\u00f6revi g\u00f6r\u00fcr. Bu, geli\u015ftiricilere daha cesurca de\u011fi\u015fiklik yapma \u00f6zg\u00fcrl\u00fc\u011f\u00fc tan\u0131r.<br \/>\n*   <strong>Dok\u00fcmantasyon G\u00f6revi:<\/strong> \u0130yi yaz\u0131lm\u0131\u015f birim testleri, bir fonksiyonun veya metodun beklenen davran\u0131\u015f\u0131n\u0131 g\u00f6steren canl\u0131 bir dok\u00fcmantasyon g\u00f6revi g\u00f6r\u00fcr. Yeni bir geli\u015ftirici, kodun nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 ve hangi senaryolarda nas\u0131l tepki verdi\u011fini testlere bakarak anlayabilir.<br \/>\n*   <strong>Geli\u015ftirme S\u00fcrecini H\u0131zland\u0131rma:<\/strong> \u0130lk ba\u015fta yava\u015flat\u0131c\u0131 gibi g\u00f6r\u00fcnse de, birim testleri asl\u0131nda uzun vadede geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r. Manuel test d\u00f6ng\u00fclerini azalt\u0131r, hatalar\u0131n erken tespitiyle hata ay\u0131klama s\u00fcresini k\u0131salt\u0131r ve geli\u015ftiricilere yeni \u00f6zellikler eklerken veya mevcut kodu de\u011fi\u015ftirirken g\u00fcven verir.<\/p>\n<h2>Go&#8217;nun Yerle\u015fik Test \u00c7er\u00e7evesi: <code>testing<\/code> Paketi<\/h2>\n<p>Go, birim testleri i\u00e7in herhangi bir \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneye ihtiya\u00e7 duymadan, standart k\u00fct\u00fcphanesinde yer alan <code>testing<\/code> paketi ile g\u00fc\u00e7l\u00fc bir destek sunar. Bu, Go&#8217;nun &#8220;batteries included&#8221; (piller dahil) felsefesinin g\u00fczel bir \u00f6rne\u011fidir.<\/p>\n<h3><code>go test<\/code> Komutu ve Kullan\u0131m\u0131<\/h3>\n<p>Go testleri, projenizin k\u00f6k dizininde veya test dosyalar\u0131n\u0131 i\u00e7eren herhangi bir dizinde <code>go test<\/code> komutu ile \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu komut, belirtilen paketteki t\u00fcm test dosyalar\u0131n\u0131 bulur ve \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-go\">\/\/ mypackage\/math_test.go\npackage mypackage\n\nimport \"testing\"\n\nfunc Add(a, b int) int {\n    return a + b\n}\n\nfunc TestAdd(t *testing.T) {\n    result := Add(2, 3)\n    expected := 5\n    if result != expected {\n        t.Errorf(\"Add(2, 3) = %d; beklenen %d\", result, expected)\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki <code>math_test.go<\/code> dosyas\u0131n\u0131 i\u00e7eren <code>mypackage<\/code> dizininde <code>go test<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>TestAdd<\/code> fonksiyonu otomatik olarak bulunacak ve \u00e7al\u0131\u015ft\u0131r\u0131lacakt\u0131r.<\/p>\n<h3>Test Dosyalar\u0131n\u0131n Adland\u0131rma Kurallar\u0131<\/h3>\n<p>Go, test dosyalar\u0131n\u0131 otomatik olarak alg\u0131lamak i\u00e7in belirli adland\u0131rma kurallar\u0131 kullan\u0131r:<br \/>\n*   Test dosyalar\u0131 <code>_test.go<\/code> ile bitmelidir (\u00f6rn: <code>mymodule_test.go<\/code>).<br \/>\n*   Bu dosyalar, test etti\u011fi paketin i\u00e7inde yer almal\u0131d\u0131r. Genellikle ayn\u0131 dizinde bulunurlar.<br \/>\n*   Test dosyalar\u0131 ayn\u0131 paketin par\u00e7as\u0131 olabilir (<code>package mypackage<\/code>) veya ayr\u0131 bir test paketi olarak tan\u0131mlanabilir (<code>package mypackage_test<\/code>). Ayr\u0131 bir test paketi kullanmak, testlerin sadece d\u0131\u015far\u0131ya a\u00e7\u0131k (exported) fonksiyonlar\u0131 test etmesini sa\u011flar ve ger\u00e7ek kod ile test kodunu daha net ay\u0131r\u0131r.<\/p>\n<h3>Test Fonksiyonlar\u0131n\u0131n \u0130mzas\u0131<\/h3>\n<p>Bir test fonksiyonu a\u015fa\u011f\u0131daki imzaya sahip olmal\u0131d\u0131r:<br \/>\n<code>func TestXxx(t *testing.T)<\/code><br \/>\n*   Fonksiyon ad\u0131 <code>Test<\/code> ile ba\u015flamal\u0131d\u0131r.<br \/>\n*   <code>Xxx<\/code> k\u0131sm\u0131 b\u00fcy\u00fck harfle ba\u015flamal\u0131 ve test edilen fonksiyon veya senaryoyu tan\u0131mlamal\u0131d\u0131r (\u00f6rn: <code>TestAdd<\/code>, <code>TestCalculateSum<\/code>).<br \/>\n<em>   Tek parametre olarak <code><\/em>testing.T<\/code> tipinde bir i\u015faret\u00e7i almal\u0131d\u0131r. Bu nesne, test durumu hakk\u0131nda bilgi sa\u011flar ve testin ba\u015far\u0131s\u0131z oldu\u011funu bildirmek gibi i\u015flemleri yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h3><code>*testing.T<\/code> Objeleri ve Metotlar\u0131<\/h3>\n<p><code>*testing.T<\/code> nesnesi, testin durumuyla etkile\u015fim kurmak i\u00e7in \u00e7e\u015fitli metotlar sunar:<br \/>\n*   <code>t.Error()<\/code> \/ <code>t.Errorf()<\/code>: Testi ba\u015far\u0131s\u0131z olarak i\u015faretler ancak testin \u00e7al\u0131\u015fmaya devam etmesini sa\u011flar. <code>Errorf<\/code> formatl\u0131 \u00e7\u0131kt\u0131 sa\u011flar.<br \/>\n*   <code>t.Fatal()<\/code> \/ <code>t.Fatalf()<\/code>: Testi ba\u015far\u0131s\u0131z olarak i\u015faretler ve testin y\u00fcr\u00fct\u00fclmesini hemen durdurur. <code>Fatalf<\/code> formatl\u0131 \u00e7\u0131kt\u0131 sa\u011flar. Genellikle kritik bir hata olu\u015ftu\u011funda kullan\u0131l\u0131r.<br \/>\n*   <code>t.Log()<\/code> \/ <code>t.Logf()<\/code>: Test \u00e7\u0131kt\u0131s\u0131na bilgi mesajlar\u0131 yazar. Test ba\u015far\u0131s\u0131z oldu\u011funda veya <code>-v<\/code> (verbose) bayra\u011f\u0131 kullan\u0131ld\u0131\u011f\u0131nda g\u00f6r\u00fcn\u00fcr.<br \/>\n*   <code>t.Skip()<\/code> \/ <code>t.Skipf()<\/code>: Testi atlar ve test raporunda &#8220;SKIPPED&#8221; olarak i\u015faretler. Belirli bir ortamda veya ko\u015fulda \u00e7al\u0131\u015fmamas\u0131 gereken testler i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   <code>t.Parallel()<\/code>: Bu testi di\u011fer paralel testlerle birlikte \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 i\u00e7in i\u015faretler. Performans\u0131 art\u0131rmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n<em>   <code>t.Run(name string, f func(t <\/em>testing.T))<\/code>: Alt testler (subtests) tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. Bu, tek bir test fonksiyonu i\u00e7inde birden fazla senaryoyu daha d\u00fczenli bir \u015fekilde test etmenizi sa\u011flar.<\/p>\n<h3>Kurulum (Setup) ve Y\u0131k\u0131m (Teardown) \u0130\u015flemleri (<code>TestMain<\/code>)<\/h3>\n<p>Bazen bir paketteki t\u00fcm testler i\u00e7in ortak bir kurulum veya y\u0131k\u0131m i\u015flemine ihtiya\u00e7 duyulur (\u00f6rn: veritaban\u0131 ba\u011flant\u0131s\u0131 kurma\/kapama). Bu senaryolar i\u00e7in <code>TestMain<\/code> fonksiyonu kullan\u0131l\u0131r:<br \/>\n<code>func TestMain(m *testing.M) { ... }<\/code><br \/>\n*   <code>TestMain<\/code> fonksiyonu, bir paketteki t\u00fcm testlerden \u00f6nce bir kez \u00e7al\u0131\u015f\u0131r.<br \/>\n*   Gerekli kurulumlar\u0131 yapar, ard\u0131ndan <code>m.Run()<\/code> \u00e7a\u011f\u0131rarak t\u00fcm testleri \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n*   <code>m.Run()<\/code> d\u00f6nd\u00fckten sonra y\u0131k\u0131m i\u015flemlerini yapar.<br \/>\n*   <code>m.Run()<\/code>&#8216;\u0131n d\u00f6nd\u00fcrd\u00fc\u011f\u00fc durum kodu ile programdan \u00e7\u0131k\u0131l\u0131r.<\/p>\n<pre><code class=\"language-go\">\/\/ mypackage\/main_test.go\npackage mypackage\n\nimport (\n    \"fmt\"\n    \"os\"\n    \"testing\"\n)\n\nfunc TestMain(m *testing.M) {\n    fmt.Println(\"T\u00fcm testlerden \u00f6nce kurulum yap\u0131l\u0131yor...\")\n    \/\/ Ortak kurulum i\u015flemleri burada\n    \/\/ \u00d6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131s\u0131 kurma\n\n    exitCode := m.Run() \/\/ T\u00fcm testleri \u00e7al\u0131\u015ft\u0131r\n\n    fmt.Println(\"T\u00fcm testlerden sonra y\u0131k\u0131m yap\u0131l\u0131yor...\")\n    \/\/ Ortak y\u0131k\u0131m i\u015flemleri burada\n    \/\/ \u00d6rne\u011fin, veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kapatma\n\n    os.Exit(exitCode)\n}\n\nfunc TestExample1(t *testing.T) {\n    t.Log(\"TestExample1 \u00e7al\u0131\u015f\u0131yor\")\n}\n\nfunc TestExample2(t *testing.T) {\n    t.Log(\"TestExample2 \u00e7al\u0131\u015f\u0131yor\")\n}<\/code><\/pre>\n<h2>Temel Birim Testi Yazma<\/h2>\n<p>\u015eimdi, basit bir Go fonksiyonu i\u00e7in nas\u0131l birim testi yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m g\u00f6relim. Diyelim ki iki say\u0131y\u0131 \u00e7arpan bir fonksiyonumuz var.<\/p>\n<pre><code class=\"language-go\">\/\/ calculator.go\npackage calculator\n\nfunc Multiply(a, b int) int {\n    return a * b\n}\n\nfunc Divide(a, b int) (int, error) {\n    if b == 0 {\n        return 0, errors.New(\"s\u0131f\u0131ra b\u00f6lme hatas\u0131\")\n    }\n    return a \/ b, nil\n}<\/code><\/pre>\n<p>Bu fonksiyonlar i\u00e7in <code>calculator_test.go<\/code> ad\u0131nda bir test dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-go\">\/\/ calculator_test.go\npackage calculator_test \/\/ Ayr\u0131 bir test paketi kullan\u0131yoruz\n\nimport (\n    \"errors\"\n    \"testing\"\n\n    \"github.com\/yourusername\/yourproject\/calculator\" \/\/ Kendi projenizin yolunu kullan\u0131n\n)\n\nfunc TestMultiply(t *testing.T) {\n    \/\/ Senaryo 1: Pozitif say\u0131lar\n    result := calculator.Multiply(2, 3)\n    expected := 6\n    if result != expected {\n        t.Errorf(\"Multiply(2, 3) = %d; beklenen %d\", result, expected)\n    }\n\n    \/\/ Senaryo 2: Negatif say\u0131lar\n    result = calculator.Multiply(-2, 3)\n    expected = -6\n    if result != expected {\n        t.Errorf(\"Multiply(-2, 3) = %d; beklenen %d\", result, expected)\n    }\n\n    \/\/ Senaryo 3: S\u0131f\u0131r ile \u00e7arp\u0131m\n    result = calculator.Multiply(5, 0)\n    expected = 0\n    if result != expected {\n        t.Errorf(\"Multiply(5, 0) = %d; beklenen %d\", result, expected)\n    }\n}\n\nfunc TestDivide(t *testing.T) {\n    \/\/ Ba\u015far\u0131l\u0131 Senaryo: Normal b\u00f6lme\n    t.Run(\"Normal b\u00f6lme\", func(t *testing.T) {\n        result, err := calculator.Divide(6, 3)\n        if err != nil {\n            t.Fatalf(\"Divide(6, 3) beklenmedik hata d\u00f6nd\u00fcrd\u00fc: %v\", err)\n        }\n        expected := 2\n        if result != expected {\n            t.Errorf(\"Divide(6, 3) = %d; beklenen %d\", result, expected)\n        }\n    })\n\n    \/\/ Hata Senaryosu: S\u0131f\u0131ra b\u00f6lme\n    t.Run(\"S\u0131f\u0131ra b\u00f6lme\", func(t *testing.T) {\n        _, err := calculator.Divide(6, 0)\n        if err == nil {\n            t.Fatalf(\"Divide(6, 0) hata d\u00f6nd\u00fcrmeliydi, ancak d\u00f6nd\u00fcrmedi.\")\n        }\n        expectedError := \"s\u0131f\u0131ra b\u00f6lme hatas\u0131\"\n        if err.Error() != expectedError {\n            t.Errorf(\"Divide(6, 0) farkl\u0131 hata mesaj\u0131 d\u00f6nd\u00fcrd\u00fc: '%v'; beklenen: '%s'\", err, expectedError)\n        }\n        \/\/ errors.Is kullanarak hata tipini kontrol etmek daha robust bir yakla\u015f\u0131md\u0131r\n        if !errors.Is(err, errors.New(\"s\u0131f\u0131ra b\u00f6lme hatas\u0131\")) {\n            t.Errorf(\"Divide(6, 0) beklenen hata tipi de\u011fil.\")\n        }\n    })\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>TestMultiply<\/code> fonksiyonunda farkl\u0131 senaryolar\u0131 do\u011frudan test ettik. <code>TestDivide<\/code> fonksiyonunda ise <code>t.Run<\/code> kullanarak alt testler olu\u015fturduk. Bu, her senaryonun ba\u011f\u0131ms\u0131z olarak raporlanmas\u0131n\u0131 sa\u011flar ve test \u00e7\u0131kt\u0131s\u0131n\u0131 daha okunabilir hale getirir. Ayr\u0131ca, hata durumlar\u0131n\u0131 test ederken <code>errors.Is<\/code> kullan\u0131m\u0131n\u0131 g\u00f6sterdik, bu Go&#8217;da hata kar\u015f\u0131la\u015ft\u0131rmas\u0131 i\u00e7in \u00f6nerilen yoldur.<\/p>\n<h2>\u0130leri Seviye Test Teknikleri<\/h2>\n<p>Go&#8217;da birim testleri yazarken verimlili\u011fi ve okunabilirli\u011fi art\u0131rmak i\u00e7in kullanabilece\u011finiz baz\u0131 ileri teknikler bulunmaktad\u0131r.<\/p>\n<h3>Test Tablolar\u0131 (Table Driven Tests)<\/h3>\n<p>Test tablolar\u0131, birden fazla giri\u015f-\u00e7\u0131k\u0131\u015f kombinasyonunu veya farkl\u0131 senaryolar\u0131 tek bir test fonksiyonu i\u00e7inde, daha d\u00fczenli ve tekrarlanabilir bir \u015fekilde test etmek i\u00e7in kullan\u0131lan yayg\u0131n bir Go desenidir. \u00d6zellikle bir fonksiyonun farkl\u0131 parametrelerle nas\u0131l davrand\u0131\u011f\u0131n\u0131 test ederken \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-go\">\/\/ calculator_test.go devam\u0131\npackage calculator_test\n\nimport (\n    \"testing\"\n    \"github.com\/yourusername\/yourproject\/calculator\"\n)\n\nfunc TestMultiplyWithTable(t *testing.T) {\n    tests := []struct {\n        name     string\n        a, b     int\n        expected int\n    }{\n        {\"pozitif say\u0131lar\", 2, 3, 6},\n        {\"negatif say\u0131lar\", -2, 3, -6},\n        {\"s\u0131f\u0131r ile \u00e7arp\u0131m\", 5, 0, 0},\n        {\"iki negatif say\u0131\", -4, -5, 20},\n        {\"b\u00fcy\u00fck say\u0131lar\", 100, 10, 1000},\n    }\n\n    for _, tt := range tests {\n        t.Run(tt.name, func(t *testing.T) {\n            result := calculator.Multiply(tt.a, tt.b)\n            if result != tt.expected {\n                t.Errorf(\"Multiply(%d, %d) = %d; beklenen %d\", tt.a, tt.b, result, tt.expected)\n            }\n        })\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>tests<\/code> ad\u0131nda bir <code>struct<\/code> dilimi tan\u0131mlad\u0131k. Her <code>struct<\/code> eleman\u0131, bir test senaryosunu (ad, giri\u015f de\u011ferleri <code>a<\/code>, <code>b<\/code> ve beklenen sonu\u00e7 <code>expected<\/code>) temsil eder. <code>for<\/code> d\u00f6ng\u00fcs\u00fc i\u00e7inde her bir senaryo <code>t.Run<\/code> ile ayr\u0131 bir alt test olarak \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu yakla\u015f\u0131m, yeni senaryolar eklemeyi \u00e7ok kolay hale getirir ve kod tekrar\u0131n\u0131 azalt\u0131r.<\/p>\n<h3>Hata Durumlar\u0131n\u0131 Test Etme<\/h3>\n<p>Go&#8217;da fonksiyonlar genellikle hata durumlar\u0131n\u0131 <code>error<\/code> aray\u00fcz\u00fc d\u00f6nd\u00fcrerek belirtir. Bu hata durumlar\u0131n\u0131 do\u011fru bir \u015fekilde test etmek \u00f6nemlidir.<\/p>\n<pre><code class=\"language-go\">\/\/ calculator_test.go devam\u0131\npackage calculator_test\n\nimport (\n    \"errors\"\n    \"testing\"\n    \"github.com\/yourusername\/yourproject\/calculator\"\n)\n\nfunc TestDivideWithTable(t *testing.T) {\n    tests := []struct {\n        name        string\n        a, b        int\n        expected    int\n        expectedErr error\n    }{\n        {\"normal b\u00f6lme\", 6, 3, 2, nil},\n        {\"s\u0131f\u0131ra b\u00f6lme\", 6, 0, 0, errors.New(\"s\u0131f\u0131ra b\u00f6lme hatas\u0131\")},\n        {\"negatif sonu\u00e7\", -10, 2, -5, nil},\n        {\"tam b\u00f6l\u00fcnmeyen\", 7, 3, 2, nil}, \/\/ Go'da int b\u00f6lme tam say\u0131 sonucunu verir\n    }\n\n    for _, tt := range tests {\n        t.Run(tt.name, func(t *testing.T) {\n            result, err := calculator.Divide(tt.a, tt.b)\n\n            if tt.expectedErr != nil {\n                \/\/ Hata bekleniyorsa\n                if err == nil {\n                    t.Fatalf(\"Divide(%d, %d) hata d\u00f6nd\u00fcrmeliydi, ancak d\u00f6nd\u00fcrmedi.\", tt.a, tt.b)\n                }\n                if !errors.Is(err, tt.expectedErr) {\n                    t.Errorf(\"Divide(%d, %d) farkl\u0131 hata d\u00f6nd\u00fcrd\u00fc: '%v'; beklenen: '%v'\", tt.a, tt.b, err, tt.expectedErr)\n                }\n            } else {\n                \/\/ Hata beklenmiyorsa\n                if err != nil {\n                    t.Fatalf(\"Divide(%d, %d) beklenmedik hata d\u00f6nd\u00fcrd\u00fc: %v\", tt.a, tt.b, err)\n                }\n                if result != tt.expected {\n                    t.Errorf(\"Divide(%d, %d) = %d; beklenen %d\", tt.a, tt.b, result, tt.expected)\n                }\n            }\n        })\n    }\n}<\/code><\/pre>\n<p>Bu test tablosu, hem ba\u015far\u0131l\u0131 sonu\u00e7lar\u0131 hem de beklenen hata durumlar\u0131n\u0131 test eder. <code>errors.Is<\/code> fonksiyonu, hata zincirindeki belirli bir hatay\u0131 kontrol etmek i\u00e7in kullan\u0131l\u0131r ve do\u011frudan hata mesaj\u0131 kar\u015f\u0131la\u015ft\u0131rmas\u0131ndan daha g\u00fcvenilirdir.<\/p>\n<h3>Paralel Testler<\/h3>\n<p>Go testleri, <code>t.Parallel()<\/code> \u00e7a\u011fr\u0131s\u0131 ile paralel olarak \u00e7al\u0131\u015ft\u0131r\u0131labilir. Bu, \u00f6zellikle uzun s\u00fcren veya ba\u011f\u0131ms\u0131z testler i\u00e7in test s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilir.<\/p>\n<pre><code class=\"language-go\">\/\/ mypackage\/long_running_test.go\npackage mypackage\n\nimport (\n    \"testing\"\n    \"time\"\n)\n\nfunc LongRunningFunction(duration time.Duration) {\n    time.Sleep(duration)\n}\n\nfunc TestLongRunningFunction1(t *testing.T) {\n    t.Parallel() \/\/ Bu testin paralel \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar\n    LongRunningFunction(100 * time.Millisecond)\n    t.Log(\"TestLongRunningFunction1 bitti\")\n}\n\nfunc TestLongRunningFunction2(t *testing.T) {\n    t.Parallel() \/\/ Bu testin paralel \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar\n    LongRunningFunction(150 * time.Millisecond)\n    t.Log(\"TestLongRunningFunction2 bitti\")\n}<\/code><\/pre>\n<p><code>go test -parallel N<\/code> komutu ile ayn\u0131 anda ka\u00e7 testin paralel \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirleyebilirsiniz (N, varsay\u0131lan olarak GOMAXPROCS de\u011feridir).<br \/>\n<strong>\u00d6nemli Not:<\/strong> Paralel testler yazarken, testler aras\u0131nda payla\u015f\u0131lan durum olmad\u0131\u011f\u0131ndan emin olmal\u0131s\u0131n\u0131z. E\u011fer testler birbirlerinin durumunu etkiliyorsa, paralel \u00e7al\u0131\u015ft\u0131rmak beklenmedik hatalara yol a\u00e7abilir. Her testin ba\u011f\u0131ms\u0131z olmas\u0131 birim testlerinin temel prensibidir.<\/p>\n<h3>\u00d6rnekler (Examples)<\/h3>\n<p>Go&#8217;da <code>ExampleXxx<\/code> fonksiyonlar\u0131, kodunuzun nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 g\u00f6steren k\u00fc\u00e7\u00fck \u00f6rnekler yazman\u0131za olanak tan\u0131r. Bu \u00f6rnekler sadece dok\u00fcmantasyon g\u00f6revi g\u00f6rmekle kalmaz, ayn\u0131 zamanda <code>go test<\/code> komutu taraf\u0131ndan da derlenir ve \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu, \u00f6rnek kodunuzun her zaman g\u00fcncel ve do\u011fru \u00e7al\u0131\u015f\u0131r durumda kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-go\">\/\/ calculator.go (\u00f6rnek fonksiyon)\npackage calculator\n\nimport \"fmt\"\n\nfunc Greet(name string) string {\n    return fmt.Sprintf(\"Merhaba, %s!\", name)\n}<\/code><\/pre>\n<pre><code class=\"language-go\">\/\/ calculator_test.go (\u00f6rnek test)\npackage calculator_test\n\nimport (\n    \"fmt\"\n    \"github.com\/yourusername\/yourproject\/calculator\"\n)\n\nfunc ExampleGreet() {\n    fmt.Println(calculator.Greet(\"D\u00fcnya\"))\n    \/\/ Output: Merhaba, D\u00fcnya!\n}\n\nfunc ExampleMultiply() {\n    result := calculator.Multiply(5, 4)\n    fmt.Println(result)\n    \/\/ Output: 20\n}<\/code><\/pre>\n<p><code>go test<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>Output:<\/code> yorumundaki \u00e7\u0131kt\u0131 ile fonksiyonun ger\u00e7ek \u00e7\u0131kt\u0131s\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r. E\u011fer e\u015fle\u015fmezse, test ba\u015far\u0131s\u0131z olur. Bu, kod \u00f6rneklerinizin her zaman do\u011fru olmas\u0131n\u0131 garanti etmenin harika bir yoludur.<\/p>\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Y\u00f6netimi: Mocking ve Stubbing<\/h2>\n<p>Birim testlerinin temel amac\u0131, kodun birimlerini izole bir \u015fekilde test etmektir. Ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, bir fonksiyon genellikle veritaban\u0131, a\u011f servisleri, dosya sistemi gibi harici ba\u011f\u0131ml\u0131l\u0131klara sahiptir. Bu ba\u011f\u0131ml\u0131l\u0131klar, birim testlerini karma\u015f\u0131kla\u015ft\u0131r\u0131r ve yava\u015flat\u0131r. Bu sorunu \u00e7\u00f6zmek i\u00e7in &#8220;mocking&#8221; ve &#8220;stubbing&#8221; teknikleri kullan\u0131l\u0131r.<\/p>\n<p>*   <strong>Mock (Taklit):<\/strong> Bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n davran\u0131\u015f\u0131n\u0131 taklit eden bir nesnedir. Genellikle bir aray\u00fcz\u00fc implemente eder ve belirli metot \u00e7a\u011fr\u0131lar\u0131nda \u00f6nceden tan\u0131mlanm\u0131\u015f de\u011ferleri d\u00f6nd\u00fcr\u00fcr veya belirli eylemleri kaydeder.<br \/>\n*   <strong>Stub (Yer Tutucu):<\/strong> Bir mock&#8217;a benzer, ancak daha basittir. Genellikle sadece belirli bir metot \u00e7a\u011fr\u0131s\u0131 i\u00e7in sabit bir de\u011fer d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Go&#8217;da ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00f6netimi i\u00e7in en yayg\u0131n ve idiomatik yakla\u015f\u0131m aray\u00fczleri kullanmakt\u0131r.<\/p>\n<h3>Interface Kullan\u0131m\u0131<\/h3>\n<p>Go&#8217;da, bir fonksiyonun veya metodun harici bir servise ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 varsa, bu servisi do\u011frudan somut bir t\u00fcr olarak kullanmak yerine bir aray\u00fcz (interface) tan\u0131mlayarak soyutlamak en iyi uygulamad\u0131r.<\/p>\n<pre><code class=\"language-go\">\/\/ user_service.go\npackage user\n\nimport \"fmt\"\n\n\/\/ UserStore, kullan\u0131c\u0131 verilerini depolayan bir aray\u00fczd\u00fcr.\ntype UserStore interface {\n    GetUserByID(id int) (string, error)\n    SaveUser(id int, name string) error\n}\n\n\/\/ DatabaseStore, UserStore aray\u00fcz\u00fcn\u00fc implemente eden ger\u00e7ek bir veritaban\u0131 depolama implementasyonudur.\ntype DatabaseStore struct {\n    \/\/ Ger\u00e7ek veritaban\u0131 ba\u011flant\u0131s\u0131 vb.\n}\n\nfunc (db *DatabaseStore) GetUserByID(id int) (string, error) {\n    \/\/ Ger\u00e7ek veritaban\u0131 sorgusu\n    if id == 1 {\n        return \"Alice\", nil\n    }\n    return \"\", fmt.Errorf(\"kullan\u0131c\u0131 bulunamad\u0131: %d\", id)\n}\n\nfunc (db *DatabaseStore) SaveUser(id int, name string) error {\n    \/\/ Ger\u00e7ek veritaban\u0131 kaydetme i\u015flemi\n    fmt.Printf(\"Kullan\u0131c\u0131 kaydedildi: %d - %s\\n\", id, name)\n    return nil\n}\n\n\/\/ UserService, kullan\u0131c\u0131 i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7erir ve bir UserStore ba\u011f\u0131ml\u0131l\u0131\u011f\u0131na sahiptir.\ntype UserService struct {\n    Store UserStore \/\/ Ba\u011f\u0131ml\u0131l\u0131k bir aray\u00fcz olarak tan\u0131mlan\u0131r\n}\n\nfunc (s *UserService) GetUserName(id int) (string, error) {\n    name, err := s.Store.GetUserByID(id)\n    if err != nil {\n        return \"\", fmt.Errorf(\"kullan\u0131c\u0131 ad\u0131 al\u0131namad\u0131: %w\", err)\n    }\n    return name, nil\n}<\/code><\/pre>\n<p>\u015eimdi bu <code>UserService<\/code>&#8216;i test etmek istedi\u011fimizde, ger\u00e7ek <code>DatabaseStore<\/code>&#8216;a ihtiya\u00e7 duymay\u0131z. Bunun yerine, <code>UserStore<\/code> aray\u00fcz\u00fcn\u00fc implemente eden bir mock nesnesi olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-go\">\/\/ user_service_test.go\npackage user_test\n\nimport (\n    \"errors\"\n    \"testing\"\n\n    \"github.com\/yourusername\/yourproject\/user\"\n)\n\n\/\/ MockUserStore, UserStore aray\u00fcz\u00fcn\u00fc implemente eden bir mock yap\u0131d\u0131r.\ntype MockUserStore struct {\n    GetUserByIDFunc func(id int) (string, error)\n    SaveUserFunc    func(id int, name string) error\n}\n\nfunc (m *MockUserStore) GetUserByID(id int) (string, error) {\n    if m.GetUserByIDFunc != nil {\n        return m.GetUserByIDFunc(id)\n    }\n    return \"\", errors.New(\"GetUserByID implemente edilmedi\")\n}\n\nfunc (m *MockUserStore) SaveUser(id int, name string) error {\n    if m.SaveUserFunc != nil {\n        return m.SaveUserFunc(id, name)\n    }\n    return errors.New(\"SaveUser implemente edilmedi\")\n}\n\nfunc TestGetUserName(t *testing.T) {\n    tests := []struct {\n        name          string\n        userID        int\n        mockGetUser   func(id int) (string, error)\n        expectedName  string\n        expectedError error\n    }{\n        {\n            name:   \"ba\u015far\u0131l\u0131 kullan\u0131c\u0131 ad\u0131 alma\",\n            userID: 1,\n            mockGetUser: func(id int) (string, error) {\n                if id == 1 {\n                    return \"Alice\", nil\n                }\n                return \"\", errors.New(\"kullan\u0131c\u0131 bulunamad\u0131\")\n            },\n            expectedName:  \"Alice\",\n            expectedError: nil,\n        },\n        {\n            name:   \"kullan\u0131c\u0131 bulunamad\u0131 hatas\u0131\",\n            userID: 99,\n            mockGetUser: func(id int) (string, error) {\n                return \"\", errors.New(\"kullan\u0131c\u0131 bulunamad\u0131: 99\")\n            },\n            expectedName:  \"\",\n            expectedError: errors.New(\"kullan\u0131c\u0131 ad\u0131 al\u0131namad\u0131: kullan\u0131c\u0131 bulunamad\u0131: 99\"),\n        },\n    }\n\n    for _, tt := range tests {\n        t.Run(tt.name, func(t *testing.T) {\n            mockStore := &MockUserStore{\n                GetUserByIDFunc: tt.mockGetUser,\n            }\n            service := &user.UserService{Store: mockStore}\n\n            name, err := service.GetUserName(tt.userID)\n\n            if tt.expectedError != nil {\n                if err == nil {\n                    t.Fatalf(\"beklenen hata: %v, ancak hata yok\", tt.expectedError)\n                }\n                if err.Error() != tt.expectedError.Error() { \/\/ Hata mesaj\u0131 kar\u015f\u0131la\u015ft\u0131rmas\u0131\n                    t.Errorf(\"beklenen hata: '%v', al\u0131nan hata: '%v'\", tt.expectedError, err)\n                }\n            } else {\n                if err != nil {\n                    t.Fatalf(\"beklenmeyen hata: %v\", err)\n                }\n                if name != tt.expectedName {\n                    t.Errorf(\"beklenen isim: '%s', al\u0131nan isim: '%s'\", tt.expectedName, name)\n                }\n            }\n        })\n    }\n}<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, <code>UserService<\/code>&#8216;in <code>UserStore<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131, test senaryosuna \u00f6zel olarak tan\u0131mlanm\u0131\u015f bir <code>MockUserStore<\/code> ile de\u011fi\u015ftirerek <code>GetUserName<\/code> metodunu izole bir \u015fekilde test etmemizi sa\u011flar.<\/p>\n<h3>Mock K\u00fct\u00fcphaneleri<\/h3>\n<p>Yukar\u0131daki manuel mocking y\u00f6ntemi basit aray\u00fczler i\u00e7in yeterli olsa da, \u00e7ok say\u0131da metodu olan veya karma\u015f\u0131k davran\u0131\u015flar gerektiren aray\u00fczler i\u00e7in manuel mock yazmak yorucu olabilir. Bu durumlarda <code>gomock<\/code> gibi \u00fc\u00e7\u00fcnc\u00fc taraf mock k\u00fct\u00fcphaneleri kullan\u0131labilir. Bu k\u00fct\u00fcphaneler, aray\u00fczlerden mock kodu otomatik olarak \u00fcretir ve daha geli\u015fmi\u015f beklenti tan\u0131mlama ve do\u011frulama yetenekleri sunar. Ancak, Go&#8217;nun felsefesi genellikle bu t\u00fcr k\u00fct\u00fcphanelerden ka\u00e7\u0131nmay\u0131 ve m\u00fcmk\u00fcn oldu\u011funca standart k\u00fct\u00fcphane ve idiomatik yakla\u015f\u0131mlar\u0131 kullanmay\u0131 te\u015fvik eder.<\/p>\n<h2>Test Kapsam\u0131 (Test Coverage)<\/h2>\n<p>Test kapsam\u0131, yaz\u0131lan testlerin kodunuzun ne kadar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131 g\u00f6steren bir \u00f6l\u00e7\u00fcmd\u00fcr. Y\u00fcksek test kapsam\u0131, kod taban\u0131n\u0131z\u0131n b\u00fcy\u00fck bir b\u00f6l\u00fcm\u00fcn\u00fcn test edildi\u011fine dair bir g\u00f6sterge olabilir, ancak tek ba\u015f\u0131na kodun kalitesini veya testlerin etkinli\u011fini garanti etmez.<\/p>\n<p>Go&#8217;da test kapsam\u0131n\u0131 \u00f6l\u00e7mek \u00e7ok kolayd\u0131r:<br \/>\n*   <code>go test -cover<\/code>: Testleri \u00e7al\u0131\u015ft\u0131r\u0131r ve genel kapsam y\u00fczdesini g\u00f6sterir.<br \/>\n*   <code>go test -coverprofile=coverage.out<\/code>: Kapsam verilerini <code>coverage.out<\/code> dosyas\u0131na yazar.<br \/>\n*   <code>go tool cover -html=coverage.out<\/code>: <code>coverage.out<\/code> dosyas\u0131ndaki verileri kullanarak, test edilmeyen kod sat\u0131rlar\u0131n\u0131 vurgulayan etkile\u015fimli bir HTML raporu olu\u015fturur.<\/p>\n<p>\u00d6rnek kullan\u0131m:<\/p>\n<pre><code class=\"language-bash\">go test -cover\n<h2>coverage: 87.5% of statements in github.com\/yourusername\/yourproject\/calculator<\/h2>\n\ngo test -coverprofile=coverage.out .\/... # T\u00fcm paketler i\u00e7in kapsam\ngo tool cover -html=coverage.out<\/code><\/pre>\n<p>HTML raporu, kodunuzun hangi k\u0131s\u0131mlar\u0131n\u0131n testler taraf\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131n\u0131 (ye\u015fil) ve hangi k\u0131s\u0131mlar\u0131n\u0131n \u00e7al\u0131\u015ft\u0131r\u0131lmad\u0131\u011f\u0131n\u0131 (k\u0131rm\u0131z\u0131) g\u00f6rsel olarak g\u00f6sterir. Bu, test eksikliklerini bulmak i\u00e7in harika bir ara\u00e7t\u0131r.<\/p>\n<p><strong>Uyar\u0131:<\/strong> Y\u00fcksek test kapsam\u0131 \u00f6nemlidir, ancak %100 kapsam her zaman %100 g\u00fcvenilirlik anlam\u0131na gelmez. Testlerinizin sadece kod sat\u0131rlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131 de\u011fil, ayn\u0131 zamanda do\u011fru senaryolar\u0131, kenar durumlar\u0131 ve hata yollar\u0131n\u0131 da test etmesi gerekir. Kapsam, test kalitesi i\u00e7in bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r, nihai hedef de\u011fildir.<\/p>\n<h2>Test Edilebilir Kod Yazma \u0130pu\u00e7lar\u0131<\/h2>\n<p>\u0130yi birim testleri yazmak, sadece <code>testing<\/code> paketini iyi kullanmakla ilgili de\u011fildir; ayn\u0131 zamanda test edilebilir kod yazma al\u0131\u015fkanl\u0131klar\u0131 geli\u015ftirmekle de ilgilidir.<\/p>\n<p>*   <strong>K\u00fc\u00e7\u00fck, Odaklanm\u0131\u015f Fonksiyonlar:<\/strong> Her fonksiyonun tek bir sorumlulu\u011fu olmal\u0131d\u0131r. Bu, fonksiyonu test etmeyi kolayla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc sadece o tek sorumlulu\u011fun do\u011fru \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131na odaklanabilirsiniz.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection):<\/strong> \u00d6zellikle aray\u00fczler arac\u0131l\u0131\u011f\u0131yla ba\u011f\u0131ml\u0131l\u0131klar\u0131 enjekte edin. Bu, testlerde ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar yerine mock veya stub nesneleri kullanman\u0131za olanak tan\u0131r.<br \/>\n*   <strong>Global Durumdan Ka\u00e7\u0131nma:<\/strong> Global de\u011fi\u015fkenler veya singleton&#8217;lar, testler aras\u0131nda beklenmedik etkile\u015fimlere yol a\u00e7abilir ve testleri k\u0131r\u0131lgan hale getirebilir. M\u00fcmk\u00fcn oldu\u011funca global durumdan ka\u00e7\u0131n\u0131n veya dikkatli y\u00f6netin.<br \/>\n*   <strong>Yan Etkileri Minimize Etme:<\/strong> Bir fonksiyonun sadece girdi parametrelerine ba\u011fl\u0131 olarak \u00e7\u0131kt\u0131 \u00fcretmesi ve d\u0131\u015f d\u00fcnyay\u0131 (veritaban\u0131, dosya sistemi vb.) de\u011fi\u015ftirmemesi (yani yan etkilerinin olmamas\u0131) testini kolayla\u015ft\u0131r\u0131r. Yan etkileri olan fonksiyonlar\u0131 izole etmeye \u00e7al\u0131\u015f\u0131n.<br \/>\n*   <strong>Saf Fonksiyonlar:<\/strong> M\u00fcmk\u00fcn oldu\u011funca, ayn\u0131 girdilerle her zaman ayn\u0131 \u00e7\u0131kt\u0131y\u0131 veren ve hi\u00e7bir yan etkisi olmayan &#8220;saf fonksiyonlar&#8221; yazmaya \u00e7al\u0131\u015f\u0131n. Bu t\u00fcr fonksiyonlar en kolay test edilebilir olanlard\u0131r.<\/p>\n<h2>S\u0131k\u00e7a Yap\u0131lan Hatalar ve Ka\u00e7\u0131n\u0131lmas\u0131 Gerekenler<\/h2>\n<p>Birim testleri yazarken geli\u015ftiricilerin s\u0131k\u00e7a yapt\u0131\u011f\u0131 baz\u0131 hatalar vard\u0131r:<\/p>\n<p>*   <strong>Testleri G\u00fcncellemeyi Unutmak:<\/strong> Kod de\u011fi\u015fti\u011finde veya refactor edildi\u011finde, ilgili testlerin de g\u00fcncellenmesi gerekir. Aksi takdirde, testler yanl\u0131\u015f beklentilere sahip olur ve yan\u0131lt\u0131c\u0131 sonu\u00e7lar verir.<br \/>\n*   <strong>\u00c7ok Fazla veya \u00c7ok Az Test Yazmak:<\/strong> Her kod sat\u0131r\u0131n\u0131 test etmek zaman al\u0131c\u0131 ve gereksiz olabilir. \u00d6te yandan, kritik i\u015f mant\u0131\u011f\u0131n\u0131 test etmemek b\u00fcy\u00fck riskler ta\u015f\u0131r. \u00d6nemli i\u015f mant\u0131\u011f\u0131na, kenar durumlara ve hata senaryolar\u0131na odaklanarak dengeli bir yakla\u015f\u0131m benimseyin.<br \/>\n*   <strong>Yava\u015f Testler:<\/strong> Birim testleri h\u0131zl\u0131 olmal\u0131d\u0131r. Harici ba\u011f\u0131ml\u0131l\u0131klar\u0131 (veritaban\u0131, a\u011f) i\u00e7eren testler birim testi de\u011fildir; bunlar entegrasyon testleridir ve ayr\u0131 \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131d\u0131r. Yava\u015f testler, geli\u015ftiricilerin testleri d\u00fczenli olarak \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 engeller.<br \/>\n*   <strong>Ger\u00e7ek D\u0131\u015f\u0131 Senaryolar\u0131 Test Etmek:<\/strong> Testler, kodun ger\u00e7ek d\u00fcnyada nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 yans\u0131tmal\u0131d\u0131r. \u00c7ok soyut veya ger\u00e7ek\u00e7i olmayan senaryolar\u0131 test etmek, zaman kayb\u0131na ve yanl\u0131\u015f g\u00fcvene yol a\u00e7abilir.<br \/>\n*   <strong>Birim Testlerini Entegrasyon Testleriyle Kar\u0131\u015ft\u0131rmak:<\/strong> Birim testleri, kodun en k\u00fc\u00e7\u00fck par\u00e7as\u0131n\u0131 izole bir \u015fekilde test eder. Entegrasyon testleri ise birden fazla birimin veya sistemin birbiriyle etkile\u015fimini test eder. Bu iki test t\u00fcr\u00fcn\u00fc kar\u0131\u015ft\u0131rmamak ve uygun ara\u00e7larla (\u00f6rn: entegrasyon testleri i\u00e7in ger\u00e7ek veritaban\u0131 ba\u011flant\u0131s\u0131) \u00e7al\u0131\u015ft\u0131rmak \u00f6nemlidir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Go&#8217;da birim testleri yazmak, <code>testing<\/code> paketinin basit ama g\u00fc\u00e7l\u00fc yap\u0131s\u0131 sayesinde olduk\u00e7a kolay ve keyifli bir s\u00fcre\u00e7tir. Bu makalede ele ald\u0131\u011f\u0131m\u0131z gibi, Go&#8217;nun yerle\u015fik test \u00e7er\u00e7evesi, temel testlerden ileri seviye tekniklere (test tablolar\u0131, paralel testler, \u00f6rnekler) ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netiminde aray\u00fczlerin kullan\u0131m\u0131na kadar geni\u015f bir yelpazede destek sunar.<\/p>\n<p>Birim testleri, sadece hatalar\u0131 bulmakla kalmaz, ayn\u0131 zamanda kod kalitesini art\u0131r\u0131r, refactoring&#8217;i g\u00fcvenli hale getirir ve geli\u015ftirme s\u00fcrecine h\u0131z katar. Test kapsam\u0131 gibi ara\u00e7lar, testlerinizin ne kadar etkili oldu\u011funu anlaman\u0131za yard\u0131mc\u0131 olurken, test edilebilir kod yazma prensiplerini benimsemek, bu s\u00fcreci daha da verimli hale getirir.<\/p>\n<p>Unutmay\u0131n ki birim testleri, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Onlar\u0131 d\u00fczenli olarak yazmak, \u00e7al\u0131\u015ft\u0131rmak ve bak\u0131m\u0131n\u0131 yapmak, daha sa\u011flam, g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir Go uygulamalar\u0131 olu\u015fturman\u0131n anahtar\u0131d\u0131r. Go&#8217;nun sade ve etkili test mekanizmalar\u0131n\u0131 kullanarak, kodunuzun kalitesini s\u00fcrekli olarak g\u00fcvence alt\u0131na alabilir ve geli\u015ftirme yolculu\u011funuzda daha emin ad\u0131mlarla ilerleyebilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Go&#8217;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nYaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00fcretilen kodun kalitesi, g\u00fcvenilirli\u011fi ve s","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-39181","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Go&#039;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go&#039;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Go&#039;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber Giri\u015f Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00fcretilen kodun kalitesi, g\u00fcvenilirli\u011fi ve s\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-16T00:40:51+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go&#8217;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-02-16T00:40:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/\"},\"wordCount\":2831,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/\",\"name\":\"Go'da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-16T00:40:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go&#8217;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Go'da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Go'da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber","og_description":"Go'da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber Giri\u015f Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00fcretilen kodun kalitesi, g\u00fcvenilirli\u011fi ve s","og_url":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-16T00:40:51+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go&#8217;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber","datePublished":"2026-02-16T00:40:51+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/"},"wordCount":2831,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/","name":"Go'da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-16T00:40:51+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/goda-birim-testleri-nasil-yazilir-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go&#8217;da Birim Testleri Nas\u0131l Yaz\u0131l\u0131r: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=39181"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39181\/revisions"}],"predecessor-version":[{"id":39182,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39181\/revisions\/39182"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}