{"id":33869,"date":"2025-11-08T06:01:31","date_gmt":"2025-11-08T03:01:31","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/"},"modified":"2025-11-08T06:01:31","modified_gmt":"2025-11-08T03:01:31","slug":"giris-neden-uctan-uca-testler-ve-autotools","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/","title":{"rendered":"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?"},"content":{"rendered":"<p>Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin ve yaz\u0131l\u0131m kalitenizi art\u0131r\u0131n.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, bir uygulaman\u0131n t\u00fcm par\u00e7alar\u0131n\u0131n sorunsuz bir \u015fekilde bir araya gelerek \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik bir \u00f6neme sahiptir. Birim testleri tek tek bile\u015fenlerin do\u011frulu\u011funu sa\u011flarken, entegrasyon testleri birka\u00e7 mod\u00fcl\u00fcn birlikte \u00e7al\u0131\u015fmas\u0131n\u0131 kontrol eder. Ancak ya t\u00fcm sistemin, yani veritaban\u0131, a\u011f servisleri, kullan\u0131c\u0131 aray\u00fcz\u00fc ve i\u015f mant\u0131\u011f\u0131n\u0131n bir b\u00fct\u00fcn olarak beklendi\u011fi gibi davrand\u0131\u011f\u0131n\u0131 do\u011frulamak istiyorsak? \u0130\u015fte tam bu noktada, u\u00e7tan uca (End-to-End &#8211; E2E) testler devreye giriyor. E2E testler, bir kullan\u0131c\u0131n\u0131n ger\u00e7ek d\u00fcnyadaki etkile\u015fimlerini sim\u00fcle ederek, uygulaman\u0131z\u0131n ba\u015ftan sona do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 garanti alt\u0131na al\u0131r. Bu, geli\u015ftiricilere ve payda\u015flara b\u00fcy\u00fck bir g\u00fcven verir, \u00f6zellikle karma\u015f\u0131k sistemlerde hatalar\u0131 erken a\u015famada yakalamak i\u00e7in vazge\u00e7ilmezdir. Peki, a\u00e7\u0131k kaynak d\u00fcnyas\u0131n\u0131n k\u00f6kl\u00fc ve g\u00fc\u00e7l\u00fc yap\u0131land\u0131rma arac\u0131 Autotools ile bu t\u00fcr testleri nas\u0131l entegre edebiliriz?<\/p>\n<p>Autotools (Autoconf, Automake, Libtool \u00fc\u00e7l\u00fcs\u00fc), genellikle C ve C++ projelerinde, farkl\u0131 sistemlerde derleme ve kurulum s\u00fcre\u00e7lerini otomatikle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Bir\u00e7ok b\u00fcy\u00fck a\u00e7\u0131k kaynak projesi, GNU ara\u00e7lar\u0131 ve Linux \u00e7ekirde\u011fi gibi \u00f6nemli yaz\u0131l\u0131mlar Autotools altyap\u0131s\u0131n\u0131 kullan\u0131r. Ancak, Autotools&#8217;un test otomasyonu yetenekleri \u00e7o\u011fu zaman g\u00f6z ard\u0131 edilir veya karma\u015f\u0131k bulunur. Oysa Autotools, <code>make check<\/code> komutu arac\u0131l\u0131\u011f\u0131yla projelerimize sa\u011flam bir test s\u00fciti entegre etmemiz i\u00e7in olduk\u00e7a esnek bir yap\u0131 sunar. Bu makale boyunca, Autotools tabanl\u0131 projelerinize nas\u0131l u\u00e7tan uca testler yazaca\u011f\u0131n\u0131z\u0131, bu testleri nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z\u0131 ve hatta ileri d\u00fczeyde nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, geli\u015ftirme s\u00fcre\u00e7lerinizi daha verimli, yaz\u0131l\u0131mlar\u0131n\u0131z\u0131 ise daha g\u00fcvenilir hale getirmektir. Bu sayede, hem kendinizin hem de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n yaz\u0131l\u0131m\u0131n\u0131za olan g\u00fcvenini art\u0131rabilirsiniz.<\/p>\n<p>Yaz\u0131l\u0131m geli\u015ftirmede kalitenin art\u0131r\u0131lmas\u0131, s\u00fcrekli entegrasyon (CI) ve s\u00fcrekli da\u011f\u0131t\u0131m (CD) s\u00fcre\u00e7lerinin temelini olu\u015fturur. E2E testler, bu otomasyon zincirinin \u00f6nemli bir halkas\u0131d\u0131r. Autotools&#8217;un sa\u011flaml\u0131\u011f\u0131 ile E2E testlerin kapsaml\u0131l\u0131\u011f\u0131n\u0131 birle\u015ftirerek, yaz\u0131l\u0131m\u0131n\u0131z\u0131n sadece derlenebilir de\u011fil, ayn\u0131 zamanda beklenen \u015fekilde \u00e7al\u0131\u015f\u0131r durumda oldu\u011fundan emin olabilirsiniz. \u015eimdi, bu heyecan verici konunun temel kavramlar\u0131na daha yak\u0131ndan bakal\u0131m.<\/p>\n<h2>Temel Kavramlar: U\u00e7tan Uca Testler ve Autotools Ekosistemi Nedir?<\/h2>\n<p>U\u00e7tan uca testlere ve Autotools&#8217;a derinlemesine dalmadan \u00f6nce, bu iki \u00f6nemli kavram\u0131 netle\u015ftirmekte fayda var. Bu sayede, konuya yabanc\u0131 olan okuyucular bile sa\u011flam bir temel \u00fczerine in\u015fa edebilirler.<\/p>\n<h3>U\u00e7tan Uca (End-to-End) Testler Nelerdir?<\/h3>\n<p>U\u00e7tan uca testler, bir yaz\u0131l\u0131m uygulamas\u0131n\u0131n t\u00fcm ak\u0131\u015f\u0131n\u0131 ba\u015ftan sona test etme s\u00fcrecidir. Bu testler, uygulaman\u0131n farkl\u0131 katmanlar\u0131n\u0131n (veritaban\u0131, a\u011f, UI, API&#8217;ler vb.) birlikte d\u00fczg\u00fcn \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131, yani bir kullan\u0131c\u0131n\u0131n ger\u00e7ek senaryoda kar\u015f\u0131la\u015faca\u011f\u0131 t\u00fcm ad\u0131mlar\u0131 sim\u00fcle ederek do\u011frular. Birim testleri fonksiyonlar\u0131n veya s\u0131n\u0131flar\u0131n izole edilmi\u015f davran\u0131\u015flar\u0131n\u0131 kontrol ederken, entegrasyon testleri birka\u00e7 mod\u00fcl aras\u0131ndaki etkile\u015fimi incelerken, E2E testleri t\u00fcm sistemin bir b\u00fct\u00fcn olarak beklenen i\u015flevselli\u011fi sunup sunmad\u0131\u011f\u0131n\u0131 kontrol eder. \u00d6rne\u011fin, bir CLI uygulamas\u0131nda, bir E2E testi uygulaman\u0131n belirli komutlarla \u00e7a\u011fr\u0131lmas\u0131n\u0131, \u00e7\u0131kt\u0131s\u0131n\u0131n do\u011fru olmas\u0131n\u0131, dosya sistemi \u00fczerinde beklenen etkileri yapmas\u0131n\u0131 ve hatta harici bir servise do\u011fru bir istek g\u00f6nderip almas\u0131n\u0131 do\u011frulayabilir.<\/p>\n<ul>\n<li><b>Avantajlar\u0131:<\/b> Y\u00fcksek g\u00fcvenilirlik sa\u011flar, ger\u00e7ek kullan\u0131c\u0131 deneyimini yans\u0131t\u0131r, kritik i\u015f ak\u0131\u015flar\u0131n\u0131 do\u011frular, regresyonlar\u0131 \u00f6nler.<\/li>\n<li><b>Dezavantajlar\u0131:<\/b> Di\u011fer test t\u00fcrlerine g\u00f6re daha yava\u015ft\u0131r, daha k\u0131r\u0131lgan olabilir (k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik bile testi bozabilir), kurulumu ve bak\u0131m\u0131 daha maliyetlidir. Bu nedenle, kritik ve karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131 i\u00e7in E2E testleri idealdir, her k\u00fc\u00e7\u00fck \u00f6zellik i\u00e7in de\u011fil.<\/li>\n<\/ul>\n<h3>Autotools Ekosistemi: K\u0131sa Bir Bak\u0131\u015f<\/h3>\n<p>Autotools, GNU Projesi&#8217;nin bir par\u00e7as\u0131 olarak geli\u015ftirilen ve \u00f6zellikle Unix benzeri sistemlerde yaz\u0131l\u0131m derleme ve kurulumunu kolayla\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015f bir ara\u00e7 setidir. Temelde \u00fc\u00e7 ana bile\u015fenden olu\u015fur:<\/p>\n<ol>\n<li><b>Autoconf:<\/b> Geli\u015ftiricinin yazd\u0131\u011f\u0131 <code>configure.ac<\/code> veya <code>configure.in<\/code> dosyas\u0131ndan, kullan\u0131c\u0131 sisteminde \u00e7al\u0131\u015facak <code>configure<\/code> beti\u011fini \u00fcretir. Bu betik, derleme ortam\u0131n\u0131 kontrol eder (derleyici, k\u00fct\u00fcphaneler, ba\u015fl\u0131k dosyalar\u0131 vb. var m\u0131?) ve projenin o ortama g\u00f6re yap\u0131land\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><b>Automake:<\/b> Geli\u015ftiricinin yazd\u0131\u011f\u0131 <code>Makefile.am<\/code> dosyas\u0131ndan, <code>configure<\/code> beti\u011fi taraf\u0131ndan kullan\u0131lacak <code>Makefile.in<\/code> dosyalar\u0131n\u0131 \u00fcretir. <code>Makefile.am<\/code>, projenin derlenmesi, kurulmas\u0131 ve test edilmesi i\u00e7in gerekli kurallar\u0131 tan\u0131mlar.<\/li>\n<li><b>Libtool:<\/b> Ta\u015f\u0131nabilir k\u00fct\u00fcphaneler (statik ve dinamik) olu\u015fturmay\u0131 ve kullanmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ol>\n<p>Autotools projelerinde testler genellikle <code>make check<\/code> komutuyla \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu komut, <code>Makefile.am<\/code> i\u00e7inde tan\u0131mlanan <code>check<\/code> hedefini tetikler ve bu hedefe ba\u011fl\u0131 olan t\u00fcm testleri s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131r. Test sonu\u00e7lar\u0131 genellikle standart \u00e7\u0131kt\u0131ya yaz\u0131l\u0131r ve test beti\u011finin \u00e7\u0131k\u0131\u015f kodu (0 ba\u015far\u0131, di\u011ferleri hata) sonucun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 belirler. Bu mekanizma, u\u00e7tan uca testlerimizi entegre etmek i\u00e7in m\u00fckemmel bir zemin haz\u0131rlar.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Autotools, farkl\u0131 i\u015fletim sistemlerinde sorunsuz derleme ve \u00e7al\u0131\u015fmay\u0131 sa\u011flamak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu uyumluluk, test ortam\u0131n\u0131z\u0131 haz\u0131rlarken de olduk\u00e7a faydal\u0131d\u0131r. Testlerinizin platformdan ba\u011f\u0131ms\u0131z oldu\u011fundan emin olmak, uzun vadede projenizin s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131racakt\u0131r.\n<\/div>\n<p>Bu temel kavramlarla donanm\u0131\u015f olarak, art\u0131k Autotools projenizde test altyap\u0131s\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131m\u0131za ge\u00e7ebiliriz. Bu s\u00fcre\u00e7, projenizin mevcut yap\u0131s\u0131na ba\u011fl\u0131 olarak k\u00fc\u00e7\u00fck de\u011fi\u015fiklikler gerektirebilir ancak genel ad\u0131mlar olduk\u00e7a standartt\u0131r.<\/p>\n<h2>Autotools Projelerinde Test Altyap\u0131s\u0131n\u0131 Kurmak: Nas\u0131l Ba\u015flan\u0131r?<\/h2>\n<p>Bir Autotools projesine u\u00e7tan uca testleri entegre etmenin ilk ad\u0131m\u0131, testlerin \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131 bir altyap\u0131 olu\u015fturmakt\u0131r. Bu genellikle projenizin <code>configure.ac<\/code> ve <code>Makefile.am<\/code> dosyalar\u0131nda baz\u0131 de\u011fi\u015fiklikler yapmay\u0131 ve testlerinizi i\u00e7erecek yeni bir dizin olu\u015fturmay\u0131 gerektirir.<\/p>\n<h3>1. Test Dizinini Olu\u015fturma<\/h3>\n<p>\u0130lk olarak, projenizin ana dizininde testlerinizi bar\u0131nd\u0131racak bir dizin olu\u015fturmal\u0131s\u0131n\u0131z. Genellikle bu dizine <code>tests\/<\/code> ad\u0131 verilir. \u0130\u00e7erisinde test betiklerinizi ve bu testlere \u00f6zg\u00fc <code>Makefile.am<\/code> dosyas\u0131n\u0131 bulunduracakt\u0131r.<\/p>\n<pre><code>\nmkdir tests\ntouch tests\/Makefile.am\n<\/pre>\n<p><\/code><\/p>\n<h3>2. <code>configure.ac<\/code> Dosyas\u0131n\u0131 G\u00fcncelleme<\/h3>\n<p><code>configure.ac<\/code> dosyas\u0131, Autoconf'un projenizi yap\u0131land\u0131rmak i\u00e7in kulland\u0131\u011f\u0131 temel dosyad\u0131r. Test dizininizin de yap\u0131land\u0131rma s\u00fcrecine dahil edildi\u011finden emin olmal\u0131y\u0131z. Bunun i\u00e7in, <code>AC_OUTPUT<\/code> makrosuna <code>tests\/Makefile<\/code>'\u0131 eklemelisiniz. Ayr\u0131ca, testler i\u00e7in baz\u0131 temel programlar\u0131n (\u00f6rne\u011fin, <code>grep<\/code>, <code>sed<\/code>, <code>diff<\/code> gibi yayg\u0131n Unix ara\u00e7lar\u0131) varl\u0131\u011f\u0131n\u0131 kontrol etmek isteyebilirsiniz.<\/p>\n<pre><code>\n# configure.ac dosyas\u0131ndan bir kesit\nAC_INIT([myproject], [1.0], [bug-report@example.com])\nAM_INIT_AUTOMAKE([-Wall gnu dist-bzip2])\nAC_PROG_CC\nAC_PROG_INSTALL\nAM_SILENT_RULES([yes]) # Daha sessiz derleme \u00e7\u0131kt\u0131s\u0131 i\u00e7in\n\n# ... di\u011fer kontroller ...\n\n# Test dizinini yap\u0131land\u0131rmaya dahil et\nAC_CONFIG_FILES([\n    Makefile\n    tests\/Makefile\n])\nAC_OUTPUT\n<\/pre>\n<p><\/code><\/p>\n<p>Bu de\u011fi\u015fiklik, <code>configure<\/code> beti\u011fi \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda <code>tests\/Makefile.in<\/code> dosyas\u0131ndan <code>tests\/Makefile<\/code> dosyas\u0131n\u0131n olu\u015fturulmas\u0131n\u0131 sa\u011flar. B\u00f6ylece test dizininiz de derleme ve test s\u00fcrecine dahil edilmi\u015f olur.<\/p>\n<h3>3. Ana <code>Makefile.am<\/code> Dosyas\u0131n\u0131 G\u00fcncelleme<\/h3>\n<p>Projenizin ana <code>Makefile.am<\/code> dosyas\u0131nda, <code>tests\/<\/code> dizinini alt dizin olarak tan\u0131mlaman\u0131z gerekir. Bu, <code>make<\/code> komutunun ana dizinden <code>tests\/<\/code> dizinindeki <code>Makefile<\/code>'\u0131 da i\u015fleyebilmesini sa\u011flar.<\/p>\n<pre><code>\n# Makefile.am dosyas\u0131ndan bir kesit\nAUTOMAKE_OPTIONS = foreign\n\n# Ana programlar\u0131n\u0131z\u0131n veya k\u00fct\u00fcphanelerinizin tan\u0131mlar\u0131\nbin_PROGRAMS = my_app\nmy_app_SOURCES = src\/main.c src\/utils.c\n\n# ... di\u011fer tan\u0131mlar ...\n\n# Test dizinini alt dizin olarak ekle\nSUBDIRS = . tests\n<\/pre>\n<p><\/code><\/p>\n<p><code>SUBDIRS = . tests<\/code> sat\u0131r\u0131, <code>make<\/code> komutunun \u00f6nce ge\u00e7erli dizindeki <code>Makefile<\/code>'\u0131, ard\u0131ndan <code>tests\/<\/code> dizinindeki <code>Makefile<\/code>'\u0131 i\u015fleyece\u011fini belirtir. B\u00f6ylece, <code>make check<\/code> komutu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, Autotools <code>tests\/<\/code> dizinindeki testleri de otomatik olarak tetikleyebilir.<\/p>\n<h3>4. <code>tests\/Makefile.am<\/code> Dosyas\u0131n\u0131 Tan\u0131mlama<\/h3>\n<p>\u015eimdi s\u0131ra, as\u0131l testleri bar\u0131nd\u0131racak olan <code>tests\/Makefile.am<\/code> dosyas\u0131n\u0131 yap\u0131land\u0131rmaya geldi. Bu dosya, \u00e7al\u0131\u015ft\u0131r\u0131lacak test betiklerini veya programlar\u0131n\u0131 tan\u0131mlar. En basit haliyle, test betiklerini <code>check_SCRIPTS<\/code> de\u011fi\u015fkeniyle tan\u0131mlayabilirsiniz.<\/p>\n<pre><code>\n# tests\/Makefile.am\n# Test betiklerinin \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131 dizin\nTESTS_ENVIRONMENT = srcdir=$(srcdir) builddir=$(builddir)\nTESTS = test_hello.sh test_feature_x.sh\n\n# Test betiklerini buraya ekleyin\ncheck_SCRIPTS = $(TESTS)\n\n# Testlerin \u00e7al\u0131\u015ft\u0131r\u0131labilmesi i\u00e7in gerekli programlar\u0131n derlenmesi (iste\u011fe ba\u011fl\u0131)\n# check_PROGRAMS = test_runner\n# test_runner_SOURCES = test_runner.c\n<\/pre>\n<p><\/code><\/p>\n<p><code>TESTS_ENVIRONMENT<\/code> de\u011fi\u015fkeni, test betiklerinin \u00e7al\u0131\u015ft\u0131\u011f\u0131 ortam i\u00e7in ek de\u011fi\u015fkenler tan\u0131mlaman\u0131za olanak tan\u0131r. <code>srcdir<\/code> ve <code>builddir<\/code> genellikle test betiklerinin kaynak ve derleme dizinlerine eri\u015fmesi i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. <code>TESTS<\/code> de\u011fi\u015fkeni ise \u00e7al\u0131\u015ft\u0131r\u0131lacak test betiklerinin bir listesidir. <code>check_SCRIPTS<\/code> de\u011fi\u015fkeni de bu listeyi kullanarak Autotools'a hangi betiklerin <code>make check<\/code> ile \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gerekti\u011fini bildirir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Testlerinizi m\u00fcmk\u00fcn oldu\u011funca izole edin. Her test beti\u011finin kendi ge\u00e7ici dosyalar\u0131n\u0131 olu\u015fturup temizlemesini sa\u011flay\u0131n. Bu, testlerin paralel \u00e7al\u0131\u015fmas\u0131na izin verir ve testler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r, b\u00f6ylece daha g\u00fcvenilir sonu\u00e7lar elde edersiniz.\n<\/div>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, Autotools projenizin test altyap\u0131s\u0131 haz\u0131r demektir. Projenizi yeniden yap\u0131land\u0131r\u0131p derledikten sonra (<code>autoreconf -fis && .\/configure && make<\/code>), <code>make check<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda Autotools, <code>tests\/<\/code> dizinindeki tan\u0131mlanm\u0131\u015f test betiklerinizi \u00e7al\u0131\u015ft\u0131rmaya ba\u015flayacakt\u0131r. \u015eimdi, bu betikleri nas\u0131l yazaca\u011f\u0131m\u0131za odaklanabiliriz.<\/p>\n<h2>U\u00e7tan Uca Test Senaryolar\u0131 Yazma: Uygulamal\u0131 Yakla\u015f\u0131m<\/h2>\n<p>Art\u0131k Autotools projemizde test altyap\u0131s\u0131n\u0131 kurdu\u011fumuza g\u00f6re, s\u0131ra geldi ger\u00e7ek test senaryolar\u0131n\u0131 yazmaya. U\u00e7tan uca testler genellikle kabuk betikleri (shell scripts) veya Python, Perl gibi betik dilleri kullan\u0131larak yaz\u0131l\u0131r. Bu diller, sistem komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rma, \u00e7\u0131kt\u0131lar\u0131 yakalama ve dosya sistemiyle etkile\u015fim kurma konusunda olduk\u00e7a esneklik sunar.<\/p>\n<h3>Basit Bir CLI Uygulamas\u0131 \u00dczerinde \u00d6rnek<\/h3>\n<p>Basit bir C program\u0131 yazd\u0131\u011f\u0131m\u0131z\u0131 varsayal\u0131m. Bu program, kendisine verilen iki say\u0131y\u0131 toplay\u0131p sonucu d\u00f6nd\u00fcr\u00fcyor veya ge\u00e7ersiz arg\u00fcmanlarda hata mesaj\u0131 veriyor:<\/p>\n<pre><code>\n\/\/ src\/main.c\n#include <stdio.h>\n#include <stdlib.h>\n\nint main(int argc, char *argv[]) {\n    if (argc != 3) {\n        fprintf(stderr, \"Kullan\u0131m: %s <sayi1> <sayi2>\\n\", argv[0]);\n        return 1; \/\/ Hata kodu\n    }\n    int num1 = atoi(argv[1]);\n    int num2 = atoi(argv[2]);\n    printf(\"Toplam: %d\\n\", num1 + num2);\n    return 0; \/\/ Ba\u015far\u0131 kodu\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu program\u0131 derleyebilmek i\u00e7in ana <code>Makefile.am<\/code> dosyas\u0131nda \u015fu tan\u0131mlar olmal\u0131:<\/p>\n<pre><code>\n# Makefile.am\nbin_PROGRAMS = my_adder\nmy_adder_SOURCES = src\/main.c\n<\/pre>\n<p><\/code><\/p>\n<h3>Test Beti\u011fi Yazma: <code>test_adder_valid.sh<\/code><\/h3>\n<p>Bu toplama program\u0131 i\u00e7in ba\u015far\u0131l\u0131 bir senaryoyu test eden bir kabuk beti\u011fi yazal\u0131m. Beti\u011fimizin amac\u0131, program\u0131 do\u011fru arg\u00fcmanlarla \u00e7al\u0131\u015ft\u0131rmak ve \u00e7\u0131kt\u0131s\u0131n\u0131n beklendi\u011fi gibi olup olmad\u0131\u011f\u0131n\u0131 kontrol etmektir.<\/p>\n<pre><code>\n#!\/bin\/bash\n# tests\/test_adder_valid.sh\n\n# Testin \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131 ge\u00e7ici dizin olu\u015ftur\nTEST_DIR=$(mktemp -d)\nif [ ! -d \"$TEST_DIR\" ]; then\n    echo \"HATA: Ge\u00e7ici dizin olu\u015fturulamad\u0131.\"\n    exit 1\nfi\ncd \"$TEST_DIR\" || exit 1\n\n# Derlenmi\u015f my_adder program\u0131n\u0131n yolunu bul\n# builddir, configure taraf\u0131ndan tan\u0131mlan\u0131r ve tests\/Makefile.am'e iletilir\nMY_ADDER_PROG=\"${builddir}\/my_adder\"\n\n# Program\u0131n varl\u0131\u011f\u0131n\u0131 kontrol et\nif [ ! -f \"$MY_ADDER_PROG\" ]; then\n    echo \"HATA: my_adder program\u0131 bulunamad\u0131: $MY_ADDER_PROG\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test Ba\u015fl\u0131yor: Ge\u00e7erli Arg\u00fcmanlarla Toplama ---\"\n\n# Program\u0131 \u00e7al\u0131\u015ft\u0131r ve \u00e7\u0131kt\u0131s\u0131n\u0131 yakala\nOUTPUT=$(\"$MY_ADDER_PROG\" 5 3)\nEXIT_CODE=$?\n\n# \u00c7\u0131k\u0131\u015f kodunu kontrol et\nif [ \"$EXIT_CODE\" -ne 0 ]; then\n    echo \"HATA: Program beklenenden farkl\u0131 bir \u00e7\u0131k\u0131\u015f kodu d\u00f6nd\u00fcrd\u00fc: $EXIT_CODE\"\n    echo \"\u00c7\u0131kt\u0131: $OUTPUT\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\n# \u00c7\u0131kt\u0131y\u0131 kontrol et\nEXPECTED_OUTPUT=\"Toplam: 8\"\nif [ \"$OUTPUT\" != \"$EXPECTED_OUTPUT\" ]; then\n    echo \"HATA: Program \u00e7\u0131kt\u0131s\u0131 beklenenden farkl\u0131.\"\n    echo \"Beklenen: '$EXPECTED_OUTPUT'\"\n    echo \"Al\u0131nan:   '$OUTPUT'\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test BA\u015eARILI ---\"\n# Ge\u00e7ici dizini temizle\nrm -rf \"$TEST_DIR\"\nexit 0\n<\/pre>\n<p><\/code><\/p>\n<h3>Test Beti\u011fi Yazma: <code>test_adder_invalid.sh<\/code><\/h3>\n<p>\u015eimdi de ge\u00e7ersiz arg\u00fcmanlarla bir hata senaryosunu test eden bir betik yazal\u0131m. Burada program\u0131n hata kodu d\u00f6nd\u00fcrmesi ve standart hata \u00e7\u0131kt\u0131s\u0131na do\u011fru mesaj\u0131 yazmas\u0131 beklenir.<\/p>\n<pre><code>\n#!\/bin\/bash\n# tests\/test_adder_invalid.sh\n\nTEST_DIR=$(mktemp -d)\nif [ ! -d \"$TEST_DIR\" ]; then\n    echo \"HATA: Ge\u00e7ici dizin olu\u015fturulamad\u0131.\"\n    exit 1\nfi\ncd \"$TEST_DIR\" || exit 1\n\nMY_ADDER_PROG=\"${builddir}\/my_adder\"\n\nif [ ! -f \"$MY_ADDER_PROG\" ]; then\n    echo \"HATA: my_adder program\u0131 bulunamad\u0131: $MY_ADDER_PROG\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test Ba\u015fl\u0131yor: Ge\u00e7ersiz Arg\u00fcmanlarla Toplama ---\"\n\n# Program\u0131 ge\u00e7ersiz arg\u00fcmanlarla \u00e7al\u0131\u015ft\u0131r ve standart hata \u00e7\u0131kt\u0131s\u0131n\u0131 yakala\nERROR_OUTPUT=$(\"$MY_ADDER_PROG\" 5 2>&1 >\/dev\/null) # stdout'u yok say, stderr'i yakala\nEXIT_CODE=$?\n\n# \u00c7\u0131k\u0131\u015f kodunu kontrol et (beklenen 1)\nif [ \"$EXIT_CODE\" -ne 1 ]; then\n    echo \"HATA: Program beklenenden farkl\u0131 bir \u00e7\u0131k\u0131\u015f kodu d\u00f6nd\u00fcrd\u00fc: $EXIT_CODE\"\n    echo \"Hata \u00c7\u0131kt\u0131s\u0131: $ERROR_OUTPUT\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\n# Hata \u00e7\u0131kt\u0131s\u0131n\u0131 kontrol et\nEXPECTED_ERROR=\"Kullan\u0131m: ${MY_ADDER_PROG<strong>*\/} <sayi1> <sayi2>\" # Sadece program ad\u0131n\u0131 al<\/strong>\nif [[ ! \"$ERROR_OUTPUT\" =~ \"$EXPECTED_ERROR\" ]]; then\n    echo \"HATA: Program hata \u00e7\u0131kt\u0131s\u0131 beklenenden farkl\u0131.\"\n    echo \"Beklenen (i\u00e7ermeli): '$EXPECTED_ERROR'\"\n    echo \"Al\u0131nan:             '$ERROR_OUTPUT'\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test BA\u015eARILI ---\"\nrm -rf \"$TEST_DIR\"\nexit 0\n<\/pre>\n<p><\/code><\/p>\n<p>Bu betiklerde, <code>${MY_ADDER_PROG<strong>*\/}<\/code> ifadesi, program\u0131n tam yolundan sadece ad\u0131n\u0131 almak i\u00e7in kullan\u0131l\u0131r, bu da hata mesaj\u0131n\u0131n do\u011fru \u015fekilde e\u015fle\u015fmesini sa\u011flar.<\/p>\n<p><\/strong><\/p>\n<h3><code>tests\/Makefile.am<\/code> G\u00fcncellemesi<\/h3>\n<p>Bu yeni test betiklerini <code>tests\/Makefile.am<\/code> dosyan\u0131za eklemeyi unutmay\u0131n:<\/p>\n<pre><code>\n# tests\/Makefile.am\nTESTS_ENVIRONMENT = srcdir=$(srcdir) builddir=..\/$(builddir) # builddir'i d\u00fczeltildi\nTESTS = test_adder_valid.sh \\\n        test_adder_invalid.sh\n\ncheck_SCRIPTS = $(TESTS)\n\n# Test betiklerinin \u00e7al\u0131\u015ft\u0131r\u0131labilmesi i\u00e7in gerekli olan my_adder'\u0131 burada tan\u0131mla\n# B\u00f6ylece \"make check\" \u00f6ncesinde my_adder derlenir.\nnoinst_PROGRAMS = my_adder\nmy_adder_SOURCES = src\/main.c\nmy_adder_CFLAGS = -I$(srcdir)\/..\/src # Kaynak dosyalara eri\u015fim i\u00e7in (e\u011fer src\/main.c bu dizinde de\u011filse)\n\n# E\u011fer my_adder \u00fcst dizinde derleniyorsa, burada yeniden derlememek i\u00e7in:\n# TESTS_ENVIRONMENT = ...; export PATH=\"$(abs_builddir):$PATH\"\n# my_adder_PROGRAMS yoksa, TEST_DIR'da do\u011frudan builddir\/my_adder kullan\u0131labilir\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: <code>tests\/Makefile.am<\/code> i\u00e7inde <code>noinst_PROGRAMS<\/code> ile testler i\u00e7in \u00f6zel olarak derlenecek programlar tan\u0131mlayabilirsiniz. Ya da <code>TESTS_ENVIRONMENT<\/code> i\u00e7inde <code>PATH<\/code> de\u011fi\u015fkenini ayarlayarak ana projenin derlenmi\u015f programlar\u0131na eri\u015fim sa\u011flayabilirsiniz. \u0130kinci yakla\u015f\u0131m, ana program\u0131 tekrar derlemeye gerek kalmad\u0131\u011f\u0131 i\u00e7in daha verimli olabilir. <code>builddir=..\/$(builddir)<\/code> d\u00fczeltmesi, test dizininden ana dizine relative path i\u00e7in gereklidir.\n<\/div>\n<p>Bu ad\u0131mlarla, Autotools projenizde u\u00e7tan uca test senaryolar\u0131n\u0131z\u0131 yazabilir ve <code>make check<\/code> komutuyla \u00e7al\u0131\u015ft\u0131rabilirsiniz. Her test beti\u011fi, program\u0131n\u0131z\u0131n belirli bir y\u00f6n\u00fcn\u00fc veya bir kullan\u0131m senaryosunu do\u011frulamal\u0131d\u0131r. Bir sonraki b\u00f6l\u00fcmde, daha karma\u015f\u0131k, ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu yakla\u015f\u0131m\u0131 nas\u0131l uygulayabilece\u011fimizi ke\u015ffedece\u011fiz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Karma\u015f\u0131k Bir Uygulaman\u0131n U\u00e7tan Uca Testi<\/h2>\n<p>\u015eimdiye kadar basit bir toplama uygulamas\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131k. Ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131 genellikle daha karma\u015f\u0131kt\u0131r; dosya sistemiyle etkile\u015fime girer, harici ba\u011f\u0131ml\u0131l\u0131klar\u0131 olabilir veya daha karma\u015f\u0131k komut sat\u0131r\u0131 aray\u00fczleri sunar. Bu b\u00f6l\u00fcmde, daha karma\u015f\u0131k bir CLI arac\u0131 \u00f6rne\u011fi \u00fczerinden u\u00e7tan uca testlerin nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>Vaka Analizi: Bir Basit JSON \u0130\u015fleyici CLI Arac\u0131<\/h3>\n<p>Hayal edin ki, bir CLI uygulamam\u0131z var: <code>json-parser<\/code>. Bu ara\u00e7, JSON dosyalar\u0131n\u0131 okuyabilir, belirli anahtarlara g\u00f6re filtreleme yapabilir ve \u00e7\u0131kt\u0131y\u0131 farkl\u0131 formatlarda (\u00f6rne\u011fin, sadece de\u011ferler) yazd\u0131rabilir. Proje yap\u0131m\u0131z a\u015fa\u011f\u0131daki gibi olsun:<\/p>\n<ul>\n<li><code>src\/<\/code>: C kaynak kodlar\u0131<\/li>\n<li><code>configure.ac<\/code><\/li>\n<li><code>Makefile.am<\/code><\/li>\n<li><code>tests\/<\/code>: Test betikleri burada olacak<\/li>\n<\/ul>\n<p><code>json-parser<\/code>'\u0131n baz\u0131 \u00f6zellikleri:<\/p>\n<ul>\n<li><code>json-parser --file input.json --key name<\/code>: <code>input.json<\/code> dosyas\u0131ndan \"name\" anahtar\u0131n\u0131n de\u011ferini d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>json-parser --file input.json --keys name age<\/code>: Birden fazla anahtar\u0131n de\u011ferlerini d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li>Hatal\u0131 JSON veya bulunamayan anahtarlar i\u00e7in uygun hata mesajlar\u0131 verir.<\/li>\n<\/ul>\n<h3>Test Senaryolar\u0131 ve Betikleri<\/h3>\n<p>Bu t\u00fcr bir uygulama i\u00e7in \u00e7e\u015fitli E2E test senaryolar\u0131 d\u00fc\u015f\u00fcnebiliriz:<\/p>\n<h4>Senaryo 1: Ge\u00e7erli JSON Dosyas\u0131ndan Tek Anahtar Okuma<\/h4>\n<p>Bu test, uygulaman\u0131n temel i\u015flevselli\u011fini do\u011frular. Bir ge\u00e7ici JSON dosyas\u0131 olu\u015fturur, uygulamay\u0131 bu dosya ve bir anahtar ile \u00e7al\u0131\u015ft\u0131r\u0131r ve \u00e7\u0131kt\u0131y\u0131 kontrol eder.<\/p>\n<pre><code>\n#!\/bin\/bash\n# tests\/test_json_single_key.sh\n\nTEST_DIR=$(mktemp -d)\ncd \"$TEST_DIR\" || exit 1\n\nJSON_PARSER_PROG=\"${builddir}\/json-parser\"\n\nif [ ! -f \"$JSON_PARSER_PROG\" ]; then\n    echo \"HATA: json-parser program\u0131 bulunamad\u0131.\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test Ba\u015fl\u0131yor: Tek Anahtar Okuma ---\"\n\n# Ge\u00e7ici JSON dosyas\u0131 olu\u015ftur\ncat <<EOF > input.json\n{\n  \"name\": \"Alice\",\n  \"age\": 30,\n  \"city\": \"New York\"\n}\nEOF\n\n# Program\u0131 \u00e7al\u0131\u015ft\u0131r\nOUTPUT=$(\"$JSON_PARSER_PROG\" --file input.json --key name)\nEXIT_CODE=$?\n\nif [ \"$EXIT_CODE\" -ne 0 ]; then\n    echo \"HATA: Program hata kodu d\u00f6nd\u00fcrd\u00fc: $EXIT_CODE. \u00c7\u0131kt\u0131: $OUTPUT\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\nEXPECTED_OUTPUT=\"Alice\"\nif [ \"$OUTPUT\" != \"$EXPECTED_OUTPUT\" ]; then\n    echo \"HATA: Beklenmeyen \u00e7\u0131kt\u0131.\"\n    echo \"Beklenen: '$EXPECTED_OUTPUT'\"\n    echo \"Al\u0131nan:   '$OUTPUT'\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test BA\u015eARILI ---\"\nrm -rf \"$TEST_DIR\"\nexit 0\n<\/pre>\n<p><\/code><\/p>\n<h4>Senaryo 2: Ge\u00e7ersiz JSON Dosyas\u0131 \u0130\u015fleme<\/h4>\n<p>Bu test, uygulaman\u0131n hata y\u00f6netimi yeteneklerini do\u011frular. Bozuk bir JSON dosyas\u0131 ile \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda uygun bir hata mesaj\u0131 ve \u00e7\u0131k\u0131\u015f kodu beklenecektir.<\/p>\n<pre><code>\n#!\/bin\/bash\n# tests\/test_json_invalid_input.sh\n\nTEST_DIR=$(mktemp -d)\ncd \"$TEST_DIR\" || exit 1\n\nJSON_PARSER_PROG=\"${builddir}\/json-parser\"\n\nif [ ! -f \"$JSON_PARSER_PROG\" ]; then\n    echo \"HATA: json-parser program\u0131 bulunamad\u0131.\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test Ba\u015fl\u0131yor: Ge\u00e7ersiz JSON ---\"\n\n# Ge\u00e7ersiz JSON dosyas\u0131 olu\u015ftur\necho \"{ 'name': 'Bob', }\" > invalid.json\n\n# Program\u0131 \u00e7al\u0131\u015ft\u0131r ve stderr'i yakala\nERROR_OUTPUT=$(\"$JSON_PARSER_PROG\" --file invalid.json --key name 2>&1 >\/dev\/null)\nEXIT_CODE=$?\n\nif [ \"$EXIT_CODE\" -eq 0 ]; then\n    echo \"HATA: Program hata kodu d\u00f6nd\u00fcrmedi (beklenen 1).\"\n    echo \"\u00c7\u0131kt\u0131: $ERROR_OUTPUT\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\n# Hata \u00e7\u0131kt\u0131s\u0131n\u0131n belirli bir mesaj i\u00e7erdi\u011fini do\u011frula\nif [[ ! \"$ERROR_OUTPUT\" =~ \"JSON ayr\u0131\u015ft\u0131rma hatas\u0131\" ]]; then\n    echo \"HATA: Beklenmeyen hata mesaj\u0131.\"\n    echo \"Al\u0131nan: '$ERROR_OUTPUT'\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test BA\u015eARILI ---\"\nrm -rf \"$TEST_DIR\"\nexit 0\n<\/pre>\n<p><\/code><\/p>\n<h4>Senaryo 3: Birden Fazla Anahtar Okuma ve Formatlama<\/h4>\n<p>Daha karma\u015f\u0131k komut sat\u0131r\u0131 se\u00e7eneklerini ve \u00e7\u0131kt\u0131 formatlamay\u0131 test edebiliriz.<\/p>\n<pre><code>\n#!\/bin\/bash\n# tests\/test_json_multiple_keys.sh\n\nTEST_DIR=$(mktemp -d)\ncd \"$TEST_DIR\" || exit 1\n\nJSON_PARSER_PROG=\"${builddir}\/json-parser\"\n\nif [ ! -f \"$JSON_PARSER_PROG\" ]; then\n    echo \"HATA: json-parser program\u0131 bulunamad\u0131.\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test Ba\u015fl\u0131yor: Birden Fazla Anahtar Okuma ---\"\n\ncat <<EOF > input_multi.json\n{\n  \"product\": \"Widget\",\n  \"price\": 19.99,\n  \"inStock\": true\n}\nEOF\n\nOUTPUT=$(\"$JSON_PARSER_PROG\" --file input_multi.json --keys product price --format csv)\nEXIT_CODE=$?\n\nif [ \"$EXIT_CODE\" -ne 0 ]; then\n    echo \"HATA: Program hata kodu d\u00f6nd\u00fcrd\u00fc: $EXIT_CODE. \u00c7\u0131kt\u0131: $OUTPUT\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\nEXPECTED_OUTPUT=\"Widget,19.99\"\nif [ \"$OUTPUT\" != \"$EXPECTED_OUTPUT\" ]; then\n    echo \"HATA: Beklenmeyen \u00e7\u0131kt\u0131.\"\n    echo \"Beklenen: '$EXPECTED_OUTPUT'\"\n    echo \"Al\u0131nan:   '$OUTPUT'\"\n    rm -rf \"$TEST_DIR\"\n    exit 1\nfi\n\necho \"--- Test BA\u015eARILI ---\"\nrm -rf \"$TEST_DIR\"\nexit 0\n<\/pre>\n<p><\/code><\/p>\n<h3>Hata Ay\u0131klama \u0130pu\u00e7lar\u0131<\/h3>\n<p>U\u00e7tan uca testler bazen beklendi\u011fi gibi \u00e7al\u0131\u015fmayabilir. Bu durumda hata ay\u0131klama \u00f6nemlidir:<\/p>\n<ol>\n<li><b>Detayl\u0131 \u00c7\u0131kt\u0131:<\/b> <code>make check<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131rken <code>AM_V_GEN=1<\/code> veya <code>V=1<\/code> gibi de\u011fi\u015fkenler kullanarak daha detayl\u0131 \u00e7\u0131kt\u0131 alabilirsiniz. Bu, hangi komutlar\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rmenizi sa\u011flar. \u00d6rne\u011fin: <code>make AM_V_GEN=1 check<\/code>.<\/li>\n<li><b>Test Betiklerini Do\u011frudan \u00c7al\u0131\u015ft\u0131rma:<\/b> Bir test beti\u011fi ba\u015far\u0131s\u0131z oldu\u011funda, onu do\u011frudan <code>tests\/<\/code> dizininden \u00e7al\u0131\u015ft\u0131rarak (\u00f6rne\u011fin <code>.\/tests\/test_json_invalid_input.sh<\/code>) sorunu daha h\u0131zl\u0131 tespit edebilirsiniz. Beti\u011fe <code>set -x<\/code> ekleyerek t\u00fcm komutlar\u0131n \u00e7al\u0131\u015fmadan \u00f6nce yazd\u0131r\u0131lmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/li>\n<li><b>Log Dosyalar\u0131:<\/b> Karma\u015f\u0131k testlerde, uygulaman\u0131z\u0131n loglar\u0131n\u0131 belirli bir dosyaya y\u00f6nlendirip test beti\u011finizin sonunda bu loglar\u0131 kontrol etmek faydal\u0131 olabilir.<\/li>\n<li><b>Ge\u00e7ici Dizin Temizli\u011fini Devre D\u0131\u015f\u0131 B\u0131rakma:<\/b> Hata ay\u0131klarken, test beti\u011finin sonunda ge\u00e7ici dizini silen <code>rm -rf \"$TEST_DIR\"<\/code> komutunu ge\u00e7ici olarak yorum sat\u0131r\u0131 yap\u0131n. B\u00f6ylece ba\u015far\u0131s\u0131z olan testin olu\u015fturdu\u011fu t\u00fcm dosyalar\u0131 inceleyebilirsiniz.<\/li>\n<\/ol>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131klar\u0131 olan testler i\u00e7in Docker veya Podman gibi kapsay\u0131c\u0131 teknolojilerini kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Test ortam\u0131n\u0131 izole etmek ve tekrarlanabilirli\u011fi sa\u011flamak i\u00e7in bu, paha bi\u00e7ilmez bir ara\u00e7 olabilir. Autotools do\u011frudan kapsay\u0131c\u0131lar\u0131 y\u00f6netmese de, test beti\u011finiz i\u00e7inde kapsay\u0131c\u0131 komutlar\u0131n\u0131 \u00e7a\u011f\u0131rabilirsiniz.\n<\/div>\n<p>Bu b\u00f6l\u00fcm, Autotools ile karma\u015f\u0131k bir uygulaman\u0131n u\u00e7tan uca testlerinin nas\u0131l yaz\u0131labilece\u011fine dair pratik bir bak\u0131\u015f a\u00e7\u0131s\u0131 sundu. Betik dillerinin esnekli\u011fini kullanarak, uygulaman\u0131z\u0131n t\u00fcm katmanlar\u0131n\u0131 kapsayan sa\u011flam testler olu\u015fturabilirsiniz. Bir sonraki b\u00f6l\u00fcmde, daha deneyimli kullan\u0131c\u0131lar i\u00e7in paralel test \u00e7al\u0131\u015ft\u0131rma ve raporlama gibi ileri d\u00fczey konulara odaklanaca\u011f\u0131z.<\/p>\n<h3><code>tests\/Makefile.am<\/code> G\u00fcncellemesi (JSON Parser i\u00e7in)<\/h3>\n<p>JSON parser testleri i\u00e7in <code>tests\/Makefile.am<\/code> dosyas\u0131 \u015fu \u015fekilde g\u00fcncellenebilir:<\/p>\n<pre><code>\n# tests\/Makefile.am\nTESTS_ENVIRONMENT = srcdir=$(srcdir) builddir=..\/$(builddir)\nTESTS = test_json_single_key.sh \\\n        test_json_invalid_input.sh \\\n        test_json_multiple_keys.sh\n\ncheck_SCRIPTS = $(TESTS)\n\n# json-parser program\u0131n\u0131 test dizininde derlemek i\u00e7in\n# (e\u011fer ana Makefile.am'de zaten tan\u0131ml\u0131 de\u011filse veya testlerin \u00f6zel bir s\u00fcr\u00fcm\u00fcn\u00fc istiyorsan\u0131z)\nnoinst_PROGRAMS = json-parser\njson_parser_SOURCES = src\/json_parser.c src\/utils.c # \u00d6rnek kaynak dosyalar\njson_parser_LDADD = -ljson # Varsay\u0131msal bir JSON k\u00fct\u00fcphanesi ba\u011f\u0131ml\u0131l\u0131\u011f\u0131\n\n# E\u011fer json-parser ana dizinde derleniyorsa, sadece yolunu belirtmek yeterlidir:\n# TESTS_ENVIRONMENT = PATH=\"$(abs_builddir):$PATH\"\n# noinst_PROGRAMS tan\u0131mlamaya gerek kalmaz.\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kurulumla, <code>make check<\/code> komutu <code>json-parser<\/code>'\u0131 derleyecek (e\u011fer <code>noinst_PROGRAMS<\/code> ile tan\u0131ml\u0131ysa) ve ard\u0131ndan t\u00fcm test betiklerini s\u0131rayla \u00e7al\u0131\u015ft\u0131racakt\u0131r. Her beti\u011fin \u00e7\u0131k\u0131\u015f kodu 0 ise test ba\u015far\u0131l\u0131, aksi takdirde ba\u015far\u0131s\u0131z say\u0131l\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Konular: Paralel Test \u00c7al\u0131\u015ft\u0131rma ve Raporlama<\/h2>\n<p>B\u00fcy\u00fck projelerde \u00e7ok say\u0131da u\u00e7tan uca test oldu\u011funda, test s\u00fcresi \u00f6nemli bir darbo\u011faz haline gelebilir. Autotools, bu sorunu \u00e7\u00f6zmek i\u00e7in baz\u0131 mekanizmalar sunar. Ayr\u0131ca, test sonu\u00e7lar\u0131n\u0131 sadece ge\u00e7ip ge\u00e7medi\u011fini g\u00f6rmekle kalmay\u0131p, daha anlaml\u0131 raporlar halinde sunmak da \u00f6nemlidir. Bu b\u00f6l\u00fcmde, bu ileri d\u00fczey konular\u0131 inceleyece\u011fiz.<\/p>\n<h3>Paralel Test \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Autotools tabanl\u0131 projelerde testleri paralel olarak \u00e7al\u0131\u015ft\u0131rmak olduk\u00e7a basittir, \u00e7\u00fcnk\u00fc <code>make<\/code> program\u0131n\u0131n yerle\u015fik bir \u00f6zelli\u011fidir. Tek yapman\u0131z gereken, <code>make check<\/code> komutunu <code>-j N<\/code> bayra\u011f\u0131yla \u00e7al\u0131\u015ft\u0131rmakt\u0131r. Burada <code>N<\/code>, ayn\u0131 anda \u00e7al\u0131\u015ft\u0131r\u0131lacak i\u015f par\u00e7ac\u0131\u011f\u0131 veya i\u015flem say\u0131s\u0131n\u0131 temsil eder.<\/p>\n<pre><code>\nmake -j 8 check\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>make<\/code>'in 8 testi veya derleme i\u015fini ayn\u0131 anda \u00e7al\u0131\u015ft\u0131rmas\u0131na izin verir. Ancak, paralel test \u00e7al\u0131\u015ft\u0131rman\u0131n sorunsuz olmas\u0131 i\u00e7in baz\u0131 \u00f6n ko\u015fullar vard\u0131r:<\/p>\n<ol>\n<li><b>Test \u0130zolasyonu:<\/b> Her testin birbirinden tamamen ba\u011f\u0131ms\u0131z olmas\u0131 gerekir. Testler aras\u0131nda dosya sistemi, veritaban\u0131 veya a\u011f kaynaklar\u0131 gibi payla\u015f\u0131ml\u0131 durumlar olmamal\u0131d\u0131r. E\u011fer testler birbirine ba\u011f\u0131ml\u0131ysa veya ortak kaynaklar\u0131 kilitlemeye \u00e7al\u0131\u015f\u0131yorsa, paralel \u00e7al\u0131\u015ft\u0131rma hatalara veya karars\u0131z sonu\u00e7lara yol a\u00e7abilir. Bu nedenle, her test beti\u011finin kendi ge\u00e7ici dizininde \u00e7al\u0131\u015fmas\u0131n\u0131 ve i\u015fi bittikten sonra temizli\u011fini yapmas\u0131n\u0131 sa\u011flamak hayati \u00f6nem ta\u015f\u0131r.<\/li>\n<li><b>Kaynak Kullan\u0131m\u0131:<\/b> Paralel \u00e7al\u0131\u015fan testler, CPU, RAM ve disk G\/\u00c7 gibi sistem kaynaklar\u0131n\u0131 yo\u011fun bir \u015fekilde kullanabilir. Yeterli kayna\u011fa sahip bir makinede \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun.<\/li>\n<\/ol>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Test betiklerinizde <code>mktemp -d<\/code> kullanarak her test i\u00e7in benzersiz bir ge\u00e7ici dizin olu\u015fturun. Test sonunda bu dizini temizleyin (<code>rm -rf \"$TEST_DIR\"<\/code>). Bu, testlerin paralel \u00e7al\u0131\u015f\u0131rken birbirlerini etkilememesini garanti eden en iyi uygulamad\u0131r.\n<\/div>\n<h3>Test Raporlama<\/h3>\n<p>Autotools'un varsay\u0131lan <code>make check<\/code> \u00e7\u0131kt\u0131s\u0131 genellikle test betiklerinin standart \u00e7\u0131kt\u0131lar\u0131n\u0131 g\u00f6sterir ve ba\u015far\u0131s\u0131z olan testleri belirtir. Bu temel durumlar i\u00e7in yeterli olsa da, \u00f6zellikle s\u00fcrekli entegrasyon (CI) sistemlerinde veya b\u00fcy\u00fck test s\u00fcitlerinde daha yap\u0131land\u0131r\u0131lm\u0131\u015f bir rapora ihtiya\u00e7 duyulabilir.<\/p>\n<h4>1. Basit Raporlama<\/h4>\n<p>Varsay\u0131lan olarak, bir test beti\u011fi 0 \u00e7\u0131k\u0131\u015f kodu d\u00f6nd\u00fcr\u00fcrse ba\u015far\u0131l\u0131 say\u0131l\u0131r, 0'dan farkl\u0131 bir kod d\u00f6nd\u00fcr\u00fcrse ba\u015far\u0131s\u0131z say\u0131l\u0131r. <code>make check<\/code> bu durumu \u00f6zetleyecektir. Ba\u015far\u0131s\u0131z olan testlerin \u00e7\u0131kt\u0131lar\u0131 genellikle konsolda g\u00f6sterilir.<\/p>\n<h4>2. Yap\u0131land\u0131r\u0131lm\u0131\u015f Raporlar (TAP veya JUnit)<\/h4>\n<p>Autotools'un kendisi do\u011frudan JUnit XML veya Test Anything Protocol (TAP) gibi modern test raporlama formatlar\u0131n\u0131 desteklemez. Ancak, test betikleriniz bu formatlarda \u00e7\u0131kt\u0131 \u00fcretecek \u015fekilde yaz\u0131labilir ve bu \u00e7\u0131kt\u0131lar daha sonra CI\/CD ara\u00e7lar\u0131 taraf\u0131ndan i\u015flenebilir.<\/p>\n<ul>\n<li><b>TAP (Test Anything Protocol):<\/b> Basit ve insan taraf\u0131ndan okunabilir bir format olup, kabuk betikleri i\u00e7inde kolayca \u00fcretilebilir. Her test ad\u0131m\u0131 i\u00e7in \"ok\" veya \"not ok\" ile ba\u015flayan bir sat\u0131r kullan\u0131l\u0131r.<\/li>\n<li><b>JUnit XML:<\/b> Java ekosisteminden do\u011fmu\u015f olsa da, bir\u00e7ok CI sistemi (Jenkins, GitLab CI, GitHub Actions) taraf\u0131ndan test sonu\u00e7lar\u0131n\u0131 g\u00f6rselle\u015ftirmek i\u00e7in yayg\u0131n olarak kullan\u0131lan bir XML format\u0131d\u0131r. Test beti\u011finizin sonunda, test sonu\u00e7lar\u0131n\u0131 (ge\u00e7en, ba\u015far\u0131s\u0131z olan, atlanan testler) bir JUnit XML dosyas\u0131na yazan k\u00fc\u00e7\u00fck bir yard\u0131mc\u0131 betik veya k\u00fct\u00fcphane kullanabilirsiniz.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin, bir Python beti\u011fi kullanarak JUnit XML \u00e7\u0131kt\u0131s\u0131 \u00fcretebilirsiniz. Kabuk beti\u011finiz bu Python beti\u011fini \u00e7a\u011f\u0131rabilir.<\/p>\n<pre><code>\n# Python ile JUnit XML \u00e7\u0131kt\u0131s\u0131 \u00fcretimi i\u00e7in basit bir \u00f6rnek\n# generate_junit_report.py\nimport sys\nimport xml.etree.ElementTree as ET\n\ndef generate_report(test_name, success, message=\"\"):\n    testsuite = ET.Element(\"testsuite\", name=test_name, tests=\"1\", failures=\"0\")\n    testcase = ET.SubElement(testsuite, \"testcase\", name=test_name)\n    if not success:\n        testsuite.set(\"failures\", \"1\")\n        failure = ET.SubElement(testcase, \"failure\", message=\"Test Failed\")\n        failure.text = message\n    \n    tree = ET.ElementTree(testsuite)\n    ET.indent(tree, space=\"  \", level=0) # Pretty print\n    return ET.tostring(testsuite, encoding=\"unicode\")\n\nif __name__ == \"__main__\":\n    if len(sys.argv) < 3:\n        print(\"Kullan\u0131m: python generate_junit_report.py <test_ad\u0131> <ba\u015far\u0131_durumu> [mesaj]\")\n        sys.exit(1)\n    \n    test_name = sys.argv[1]\n    success = sys.argv[2].lower() == \"true\"\n    message = sys.argv[3] if len(sys.argv) > 3 else \"\"\n\n    report_xml = generate_report(test_name, success, message)\n    with open(f\"{test_name}_junit.xml\", \"w\") as f:\n        f.write(report_xml)\n    print(f\"JUnit raporu {test_name}_junit.xml olarak kaydedildi.\")\n<\/pre>\n<p><\/code><\/p>\n<p>Daha sonra test beti\u011finizin sonunda, bu Python beti\u011fini \u00e7a\u011f\u0131rarak test sonucunu bir XML dosyas\u0131na yazabilirsiniz.<\/p>\n<h4>3. CI\/CD Entegrasyonu<\/h4>\n<p>Autotools tabanl\u0131 projeler i\u00e7in CI\/CD entegrasyonu olduk\u00e7a basittir. Temel ad\u0131mlar \u015funlard\u0131r:<\/p>\n<ol>\n<li><b>Ortam\u0131 Kurma:<\/b> CI arac\u0131n\u0131zda (GitHub Actions, GitLab CI, Jenkins vb.) projenizi derlemek i\u00e7in gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Autotools'u kurun.<\/li>\n<li><b>Yap\u0131land\u0131rma:<\/b> <code>.\/configure<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n.<\/li>\n<li><b>Derleme:<\/b> <code>make<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n.<\/li>\n<li><b>Test Etme:<\/b> <code>make check<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Paralel \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>make -j N check<\/code> kullanabilirsiniz.<\/li>\n<li><b>Raporlama (iste\u011fe ba\u011fl\u0131):<\/b> E\u011fer test betikleriniz JUnit XML veya TAP \u00e7\u0131kt\u0131s\u0131 \u00fcretiyorsa, CI arac\u0131n\u0131z\u0131n bu raporlar\u0131 parse etmesini sa\u011flayacak ad\u0131mlar\u0131 ekleyin. \u00d6rne\u011fin, GitHub Actions'da bir JUnit reporter aksiyonu kullanabilirsiniz.<\/li>\n<\/ol>\n<pre><code>\n# .github\/workflows\/ci.yml (GitHub Actions \u00f6rne\u011fi)\nname: Autotools CI\n\non: [push, pull_request]\n\njobs:\n  build-and-test:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v3\n    - name: Kurulum\n      run: |\n        sudo apt-get update\n        sudo apt-get install -y autoconf automake build-essential\n    - name: Yap\u0131land\u0131rma\n      run: |\n        autoreconf -fis\n        .\/configure\n    - name: Derleme\n      run: make\n    - name: Test Etme\n      run: make -j$(nproc) check\n    # JUnit raporlar\u0131n\u0131 toplamak i\u00e7in (e\u011fer testleriniz JUnit \u00e7\u0131kt\u0131s\u0131 \u00fcretiyorsa)\n    - name: Test Raporlar\u0131n\u0131 Y\u00fckle\n      uses: actions\/upload-artifact@v3\n      if: always()\n      with:\n        name: test-results\n        path: tests\/*.xml # Testlerinizin \u00fcretti\u011fi XML dosyalar\u0131\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, Autotools projelerinizin testleri otomatik olarak \u00e7al\u0131\u015ft\u0131r\u0131labilir ve sonu\u00e7lar CI\/CD pipeline'\u0131n\u0131z\u0131n bir par\u00e7as\u0131 olarak takip edilebilir. Bu, yaz\u0131l\u0131m kalitesini s\u00fcrekli olarak izlemenizi ve olas\u0131 regresyonlar\u0131 h\u0131zla tespit etmenizi sa\u011flar.<\/p>\n<h2>S\u0131k\u00e7a Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h2>\n<p>Autotools ile u\u00e7tan uca testler geli\u015ftirirken baz\u0131 yayg\u0131n sorunlarla kar\u015f\u0131la\u015fmak olas\u0131d\u0131r. Bu b\u00f6l\u00fcmde, bu sorunlar\u0131 ve pratik \u00e7\u00f6z\u00fcm yollar\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>Sorun 1: \"make check\" Testleri Bulam\u0131yor veya \u00c7al\u0131\u015ft\u0131ram\u0131yor<\/h3>\n<p><b>Belirti:<\/b> <code>make check<\/code> komutu \u00e7al\u0131\u015f\u0131yor ancak hi\u00e7bir test beti\u011fini \u00e7al\u0131\u015ft\u0131rm\u0131yor veya \"No tests to run\" gibi bir mesaj veriyor.<\/p>\n<p><b>Olas\u0131 Nedenler ve \u00c7\u00f6z\u00fcmler:<\/b><\/p>\n<ul>\n<li><b><code>tests\/Makefile<\/code> Olu\u015fturulmam\u0131\u015f:<\/b> <code>configure.ac<\/code> dosyan\u0131zda <code>AC_OUTPUT(Makefile tests\/Makefile)<\/code> sat\u0131r\u0131n\u0131n oldu\u011fundan ve <code>autoreconf -fis && .\/configure<\/code> ad\u0131mlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun.<\/li>\n<li><b><code>SUBDIRS<\/code> Tan\u0131ml\u0131 De\u011fil:<\/b> Ana <code>Makefile.am<\/code> dosyan\u0131zda <code>SUBDIRS = . tests<\/code> (veya benzeri bir tan\u0131m\u0131n) mevcut oldu\u011fundan emin olun.<\/li>\n<li><b><code>check_SCRIPTS<\/code> Tan\u0131ml\u0131 De\u011fil:<\/b> <code>tests\/Makefile.am<\/code> dosyas\u0131nda test betiklerinizi <code>check_SCRIPTS = test1.sh test2.sh<\/code> \u015feklinde do\u011fru bir \u015fekilde tan\u0131mlad\u0131\u011f\u0131n\u0131zdan emin olun.<\/li>\n<li><b>Test Beti\u011fi Y\u00fcr\u00fct\u00fclebilir De\u011fil:<\/b> Test beti\u011finizin (\u00f6rne\u011fin <code>.sh<\/code> dosyas\u0131) y\u00fcr\u00fctme izinlerine sahip oldu\u011fundan emin olun: <code>chmod +x tests\/test_script.sh<\/code>.<\/li>\n<\/ul>\n<h3>Sorun 2: Testler Ba\u015far\u0131s\u0131z Oluyor Ancak Hata Mesajlar\u0131 Yetersiz<\/h3>\n<p><b>Belirti:<\/b> Bir test ba\u015far\u0131s\u0131z oluyor ancak konsolda sadece \"X test failed\" gibi genel bir mesaj g\u00f6r\u00fcn\u00fcyor. Neden ba\u015far\u0131s\u0131z oldu\u011funu anlamak zorla\u015f\u0131yor.<\/p>\n<p><b>Olas\u0131 Nedenler ve \u00c7\u00f6z\u00fcmler:<\/b><\/p>\n<ul>\n<li><b>Test Beti\u011fi \u00c7\u0131kt\u0131 \u00dcretmiyor:<\/b> Test beti\u011finizin, ba\u015far\u0131s\u0131zl\u0131k durumunda anlaml\u0131 hata mesajlar\u0131n\u0131 standart \u00e7\u0131kt\u0131ya (<code>stdout<\/code>) veya standart hata \u00e7\u0131kt\u0131s\u0131na (<code>stderr<\/code>) yazd\u0131\u011f\u0131ndan emin olun.<\/li>\n<li><b><code>make check<\/code> \u00c7\u0131kt\u0131s\u0131 Bast\u0131r\u0131l\u0131yor:<\/b> Baz\u0131 <code>Makefile<\/code> yap\u0131land\u0131rmalar\u0131 \u00e7\u0131kt\u0131lar\u0131 bast\u0131rabilir. Daha detayl\u0131 \u00e7\u0131kt\u0131 i\u00e7in <code>make V=1 check<\/code> veya <code>make AM_V_GEN=1 check<\/code> komutunu kullan\u0131n.<\/li>\n<li><b>Ge\u00e7ici Dizin Temizli\u011fi:<\/b> Hata ay\u0131klarken, test beti\u011finizin sonundaki <code>rm -rf \"$TEST_DIR\"<\/code> komutunu ge\u00e7ici olarak yorum sat\u0131r\u0131 yap\u0131n. B\u00f6ylece, testin ba\u015far\u0131s\u0131z oldu\u011fu andaki t\u00fcm dosyalar\u0131 inceleyebilirsiniz.<\/li>\n<li><b>\u00c7\u0131k\u0131\u015f Kodu Kontrol\u00fc:<\/b> Test beti\u011finizin her a\u015famas\u0131nda komutlar\u0131n \u00e7\u0131k\u0131\u015f kodlar\u0131n\u0131 (<code>$?<\/code>) kontrol edin ve ba\u015far\u0131s\u0131zl\u0131k durumunda erken \u00e7\u0131k\u0131\u015f yap\u0131n.<\/li>\n<\/ul>\n<h3>Sorun 3: Test Ortam\u0131 \u0130zolasyonu Eksikli\u011fi<\/h3>\n<p><b>Belirti:<\/b> Testler, farkl\u0131 s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131klar\u0131nda veya paralel \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131klar\u0131nda bazen ba\u015far\u0131l\u0131 bazen ba\u015far\u0131s\u0131z oluyor. Testler, birbirlerinin durumunu veya dosyalar\u0131n\u0131 etkiliyor gibi g\u00f6r\u00fcn\u00fcyor.<\/p>\n<p><b>Olas\u0131 Nedenler ve \u00c7\u00f6z\u00fcmler:<\/b><\/p>\n<ul>\n<li><b>Payla\u015f\u0131ml\u0131 Kaynaklar:<\/b> Testlerin dosya sistemi, veritaban\u0131, a\u011f portlar\u0131 gibi payla\u015f\u0131lan kaynaklar\u0131 kulland\u0131\u011f\u0131ndan \u015f\u00fcpheleniyorsan\u0131z, her testin kendi izole ortam\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun.<\/li>\n<li><b><code>mktemp -d<\/code> Kullan\u0131m\u0131:<\/b> Her test beti\u011finin ba\u015f\u0131nda <code>TEST_DIR=$(mktemp -d)<\/code> ile benzersiz bir ge\u00e7ici dizin olu\u015fturun ve t\u00fcm dosya sistemi i\u015flemlerini bu dizin i\u00e7inde yap\u0131n. Test sonunda bu dizini temizlemeyi unutmay\u0131n.<\/li>\n<li><b>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00f6netme:<\/b> E\u011fer testler harici servis veya veritaban\u0131 gerektiriyorsa, test s\u00fcitinizin bu servisleri testten \u00f6nce ba\u015flat\u0131p sonra durdurmas\u0131 veya test edilecek ortam i\u00e7in mock\/stub kullanmas\u0131 gerekebilir.<\/li>\n<\/ul>\n<h3>Sorun 4: Testler \u00c7ok Yava\u015f \u00c7al\u0131\u015f\u0131yor<\/h3>\n<p><b>Belirti:<\/b> Test s\u00fcitinizin tamamlanmas\u0131 uzun s\u00fcr\u00fcyor, bu da geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc yava\u015flat\u0131yor.<\/p>\n<p><b>Olas\u0131 Nedenler ve \u00c7\u00f6z\u00fcmler:<\/b><\/p>\n<ul>\n<li><b>Paralel \u00c7al\u0131\u015ft\u0131rma:<\/b> <code>make -j N check<\/code> komutuyla testleri paralel \u00e7al\u0131\u015ft\u0131rmay\u0131 deneyin. Burada <code>N<\/code>, i\u015flemci \u00e7ekirdek say\u0131n\u0131z kadar veya daha fazla olabilir (\u00f6rne\u011fin <code>$(nproc)<\/code>).<\/li>\n<li><b>Gereksiz \u0130\u015flemler:<\/b> Test betiklerinde gereksiz a\u011f istekleri, uzun s\u00fcreli uyku komutlar\u0131 veya a\u015f\u0131r\u0131 dosya G\/\u00c7 i\u015flemlerinden ka\u00e7\u0131n\u0131n.<\/li>\n<li><b>Test Verilerini Optimize Etme:<\/b> B\u00fcy\u00fck test verilerini kullanmak yerine, testler i\u00e7in yeterli ancak k\u00fc\u00e7\u00fck boyutlu veri setleri olu\u015fturun.<\/li>\n<li><b>Kapsam D\u0131\u015f\u0131 B\u0131rakma:<\/b> \u00c7ok yava\u015f veya \u00e7ok pahal\u0131 olan baz\u0131 E2E testleri, CI\/CD pipeline'\u0131n\u0131n her ad\u0131m\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lmak yerine sadece belirli tetikleyicilerde (\u00f6rne\u011fin geceleyin) \u00e7al\u0131\u015ft\u0131r\u0131labilir.<\/li>\n<\/ul>\n<h3>Sorun 5: Derleme Ortam\u0131 Farkl\u0131l\u0131klar\u0131<\/h3>\n<p><b>Belirti:<\/b> Testler bir geli\u015ftirme makinesinde \u00e7al\u0131\u015f\u0131rken CI ortam\u0131nda ba\u015far\u0131s\u0131z oluyor veya tam tersi.<\/p>\n<p><b>Olas\u0131 Nedenler ve \u00c7\u00f6z\u00fcmler:<\/b><\/p>\n<ul>\n<li><b>Ortam De\u011fi\u015fkenleri:<\/b> CI ortam\u0131 ile yerel ortam aras\u0131ndaki farklar\u0131 kontrol edin. <code>PATH<\/code>, <code>LD_LIBRARY_PATH<\/code> gibi ortam de\u011fi\u015fkenleri \u00f6nemlidir.<\/li>\n<li><b>Ba\u011f\u0131ml\u0131l\u0131klar:<\/b> CI ortam\u0131nda t\u00fcm gerekli k\u00fct\u00fcphanelerin ve ara\u00e7lar\u0131n kurulu oldu\u011fundan emin olun. <code>.\/configure<\/code> a\u015famas\u0131nda eksik ba\u011f\u0131ml\u0131l\u0131klar\u0131 kontrol etmek i\u00e7in <code>config.log<\/code> dosyas\u0131n\u0131 inceleyin.<\/li>\n<li><b>Docker\/Kapsay\u0131c\u0131lar:<\/b> Geli\u015ftirme ve CI ortamlar\u0131 aras\u0131nda tutarl\u0131l\u0131k sa\u011flamak i\u00e7in Docker gibi kapsay\u0131c\u0131 teknolojilerini kullan\u0131n. Bu, \"benim makinemde \u00e7al\u0131\u015f\u0131yor\" sorununu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ortadan kald\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu yayg\u0131n sorunlar\u0131 ve \u00e7\u00f6z\u00fcmlerini bilmek, Autotools ile u\u00e7tan uca test geli\u015ftirme s\u00fcrecinizi \u00e7ok daha p\u00fcr\u00fczs\u00fcz hale getirecektir. Unutmay\u0131n, testleriniz ne kadar sa\u011flam ve anla\u015f\u0131l\u0131r olursa, sorun giderme o kadar kolay olur.<\/p>\n<h2>Sonu\u00e7: Sa\u011flam Yaz\u0131l\u0131m Geli\u015ftirmenin Anahtar\u0131<\/h2>\n<p>Bu makale boyunca, Autotools ile u\u00e7tan uca testlerin g\u00fcc\u00fcn\u00fc ve entegrasyonunu derinlemesine inceledik. Yaz\u0131l\u0131m kalitesini art\u0131rmak ve geli\u015ftirme s\u00fcre\u00e7lerini daha g\u00fcvenilir hale getirmek i\u00e7in u\u00e7tan uca testlerin ne kadar kritik oldu\u011funu g\u00f6rd\u00fck. Autotools'un esnek yap\u0131s\u0131 sayesinde, birim testlerinden \u00e7ok daha fazlas\u0131n\u0131, yani bir uygulaman\u0131n t\u00fcm katmanlar\u0131n\u0131 kapsayan ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 test etme yetene\u011fine sahibiz.<\/p>\n<p>\u0130lk olarak, Autotools ekosistemini ve u\u00e7tan uca testlerin temel prensiplerini anlamak i\u00e7in sa\u011flam bir temel olu\u015fturduk. Ard\u0131ndan, <code>configure.ac<\/code> ve <code>Makefile.am<\/code> dosyalar\u0131nda gerekli de\u011fi\u015fiklikleri yaparak Autotools projenize nas\u0131l bir test altyap\u0131s\u0131 kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik. \u00d6zellikle, <code>tests\/Makefile.am<\/code> dosyas\u0131n\u0131n ve <code>check_SCRIPTS<\/code> de\u011fi\u015fkeninin rol\u00fc, testlerinizi Autotools'a tan\u0131tmak i\u00e7in hayati \u00f6nem ta\u015f\u0131yor.<\/p>\n<p>Uygulamal\u0131 b\u00f6l\u00fcmde, basit bir CLI uygulamas\u0131ndan ba\u015flayarak, karma\u015f\u0131k JSON i\u015fleyici bir ara\u00e7 \u00fczerinde ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 nas\u0131l test edece\u011fimizi g\u00f6sterdik. Kabuk betiklerinin g\u00fcc\u00fcn\u00fc kullanarak, program \u00e7\u0131kt\u0131s\u0131n\u0131 yakalama, hata kodlar\u0131n\u0131 kontrol etme ve dosya sistemiyle etkile\u015fim kurma gibi temel test tekniklerini uygulad\u0131k. Her testin izole bir ortamda \u00e7al\u0131\u015fmas\u0131n\u0131n \u00f6nemini ve ge\u00e7ici dizinlerin nas\u0131l y\u00f6netilece\u011fini vurgulad\u0131k.<\/p>\n<p>Son olarak, paralel test \u00e7al\u0131\u015ft\u0131rma gibi performans optimizasyonlar\u0131ndan ve test raporlama mekanizmalar\u0131ndan bahsettik. \u00d6zellikle JUnit XML gibi standart formatlarda rapor \u00fcretmenin, CI\/CD pipeline'lar\u0131nda test sonu\u00e7lar\u0131n\u0131 g\u00f6rselle\u015ftirmek i\u00e7in ne kadar de\u011ferli oldu\u011funu g\u00f6rd\u00fck. Ayr\u0131ca, kar\u015f\u0131la\u015fabilece\u011finiz yayg\u0131n sorunlara ve bunlar\u0131n \u00e7\u00f6z\u00fcmlerine de de\u011finerek, test geli\u015ftirme yolculu\u011funuzda size rehberlik etmeyi ama\u00e7lad\u0131k.<\/p>\n<p>Unutmay\u0131n, iyi yaz\u0131lm\u0131\u015f u\u00e7tan uca testler, yaz\u0131l\u0131m\u0131n\u0131z\u0131n sadece derlenebilir oldu\u011funu de\u011fil, ayn\u0131 zamanda beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kan\u0131tlayan en g\u00fc\u00e7l\u00fc g\u00fcvencelerden biridir. Autotools'un sa\u011flad\u0131\u011f\u0131 bu g\u00fc\u00e7l\u00fc altyap\u0131y\u0131 kullanarak, projelerinizin kalitesini s\u00fcrekli olarak art\u0131rabilir, regresyonlar\u0131 erkenden yakalayabilir ve kullan\u0131c\u0131lar\u0131n\u0131za g\u00fcvenle \u00e7al\u0131\u015fan yaz\u0131l\u0131mlar sunabilirsiniz. Sa\u011flam yaz\u0131l\u0131m geli\u015ftirme yolculu\u011funuzda testlerinizi s\u00fcrekli iyile\u015ftirmeyi ve test kapsama alan\u0131n\u0131z\u0131 art\u0131rmay\u0131 hedefleyin. Bu, uzun vadede size b\u00fcy\u00fck faydalar sa\u011flayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n<h4>S: Autotools u\u00e7tan uca testler i\u00e7in en iyi ara\u00e7 m\u0131d\u0131r?<\/h4>\n<p><b>C:<\/b> Autotools, \u00f6zellikle C\/C++ tabanl\u0131 ve komut sat\u0131r\u0131 aray\u00fcz\u00fc olan projelerde u\u00e7tan uca testleri entegre etmek i\u00e7in son derece sa\u011flam ve yayg\u0131n bir mekanizma sunar. \"En iyi\" ara\u00e7 olup olmad\u0131\u011f\u0131, projenin niteli\u011fine ba\u011fl\u0131d\u0131r. Modern web veya GUI uygulamalar\u0131 i\u00e7in Selenium, Cypress gibi daha \u00f6zelle\u015fmi\u015f E2E test \u00e7er\u00e7eveleri daha uygun olabilir. Ancak Autotools, derleme ve sistem seviyesi etkile\u015fimleri test etmek i\u00e7in m\u00fckemmeldir.<\/p>\n<\/li>\n<li>\n<h4>S: Testlerimi hangi dilde yazmal\u0131y\u0131m?<\/h4>\n<p><b>C:<\/b> Genellikle kabuk betikleri (bash) veya Python, Perl gibi betik dilleri tercih edilir. Bu diller, sistem komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rma, \u00e7\u0131kt\u0131y\u0131 yakalama ve dosya sistemiyle etkile\u015fim kurma konusunda esneklik sunar. Python, karma\u015f\u0131k mant\u0131k ve veri manip\u00fclasyonu gerektiren testler i\u00e7in daha g\u00fc\u00e7l\u00fc bir se\u00e7enek olabilirken, basit kontroller i\u00e7in bash betikleri yeterlidir.<\/p>\n<\/li>\n<li>\n<h4>S: <code>make check<\/code> yerine ba\u015fka bir \u015fey kullanabilir miyim?<\/h4>\n<p><b>C:<\/b> Autotools'un standart test \u00e7al\u0131\u015ft\u0131rma mekanizmas\u0131 <code>make check<\/code>'tir ve bu hedefe ba\u011fl\u0131 di\u011fer hedefler de tan\u0131mlayabilirsiniz (\u00f6rne\u011fin <code>make distcheck<\/code>). Kendi \u00f6zel test \u00e7al\u0131\u015ft\u0131rma komutlar\u0131n\u0131z\u0131 tan\u0131mlaman\u0131z m\u00fcmk\u00fcnd\u00fcr ancak bu, Autotools'un konvansiyonlar\u0131ndan uzakla\u015fmak anlam\u0131na gelecektir. Genellikle <code>make check<\/code>, CI\/CD ara\u00e7lar\u0131 ve di\u011fer geli\u015ftiriciler taraf\u0131ndan beklenen standart bir aray\u00fczd\u00fcr.<\/p>\n<\/li>\n<li>\n<h4>S: CI\/CD'ye Autotools testlerini nas\u0131l entegre ederim?<\/h4>\n<p><b>C:<\/b> Entegrasyon olduk\u00e7a basittir. CI\/CD pipeline'\u0131n\u0131zda (GitHub Actions, GitLab CI, Jenkins vb.), Autotools'u kurduktan sonra s\u0131ras\u0131yla <code>autoreconf -fis<\/code>, <code>.\/configure<\/code>, <code>make<\/code> ve son olarak <code>make check<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131z yeterlidir. E\u011fer testleriniz JUnit XML gibi raporlar \u00fcretiyorsa, CI arac\u0131n\u0131z\u0131n bu raporlar\u0131 parse etmesini sa\u011flayacak ek ad\u0131mlar ekleyebilirsiniz.<\/p>\n<\/li>\n<li>\n<h4>S: Autotools ile GUI uygulamalar\u0131n\u0131 test edebilir miyim?<\/h4>\n<p><b>C:<\/b> Teorik olarak, Autotools ile \u00e7al\u0131\u015ft\u0131r\u0131lan bir kabuk beti\u011fi, GUI uygulamas\u0131n\u0131 ba\u015flat\u0131p sonra <code>xdotool<\/code> gibi ara\u00e7larla sanal klavye ve fare giri\u015fleri g\u00f6ndermeyi deneyebilir. Ancak bu olduk\u00e7a karma\u015f\u0131k ve k\u0131r\u0131lgan bir y\u00f6ntemdir. GUI uygulamalar\u0131n\u0131 test etmek i\u00e7in Selenium, Cypress, Playwright, Qt Test (Qt uygulamalar\u0131 i\u00e7in) gibi \u00f6zel olarak tasarlanm\u0131\u015f GUI test \u00e7er\u00e7evelerini kullanmak \u00e7ok daha pratik ve etkilidir.<\/p>\n<\/li>\n<\/ol>\n<style>\n  \/* Basic mobile-friendly styles for demonstration *\/\n  body {\n    font-family: Arial, sans-serif;\n    line-height: 1.6;\n    margin: 0 auto;\n    max-width: 800px;\n    padding: 20px;\n    color: #333;\n  }\n  h2, h3 {\n    color: #2c3e50;\n    margin-top: 1.5em;\n    margin-bottom: 0.5em;\n  }\n  pre {\n    background: #f4f4f4;\n    padding: 15px;\n    border-left: 3px solid #007bff;\n    overflow-x: auto;\n  }\n  code {\n    font-family: \"Courier New\", monospace;\n    background-color: #eee;\n    padding: 2px 4px;\n    border-radius: 3px;\n  }\n  .expert-tip {\n    background-color: #e6f7ff;\n    border-left: 5px solid #007bff;\n    padding: 15px;\n    margin: 20px 0;\n    font-style: italic;\n    color: #0056b3;\n  }\n  ul, ol {\n    margin-bottom: 1em;\n  }\n  table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n  }\n  th, td {\n    border: 1px solid #ddd;\n    padding: 8px;\n    text-align: left;\n  }\n  th {\n    background-color: #f2f2f2;\n  }<\/p>\n<p>  @media screen and (max-width: 768px) {\n    body {\n      padding: 10px;\n    }\n    h2 {\n      font-size: 1.5em;\n    }\n    h3 {\n      font-size: 1.2em;\n    }\n    pre {\n      font-size: 0.9em;\n    }\n  }\n<\/style>\n","protected":false},"excerpt":{"rendered":"Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin&hellip;","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-33869","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>Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?<\/title>\n<meta name=\"description\" content=\"Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin ve yaz\u0131l\u0131m kalitenizi art\u0131r\u0131n.\" \/>\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\/giris-neden-uctan-uca-testler-ve-autotools\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?\" \/>\n<meta property=\"og:description\" content=\"Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin ve yaz\u0131l\u0131m kalitenizi art\u0131r\u0131n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-08T03:01:31+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=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?\",\"datePublished\":\"2025-11-08T03:01:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/\"},\"wordCount\":4934,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/\",\"name\":\"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-08T03:01:31+00:00\",\"description\":\"Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin ve yaz\u0131l\u0131m kalitenizi art\u0131r\u0131n.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?\"}]},{\"@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":"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?","description":"Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin ve yaz\u0131l\u0131m kalitenizi art\u0131r\u0131n.","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\/giris-neden-uctan-uca-testler-ve-autotools\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?","og_description":"Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin ve yaz\u0131l\u0131m kalitenizi art\u0131r\u0131n.","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-08T03:01:31+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?","datePublished":"2025-11-08T03:01:31+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/"},"wordCount":4934,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/","name":"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-08T03:01:31+00:00","description":"Autotools projelerinizde u\u00e7tan uca (end-to-end) testleri nas\u0131l entegre edece\u011finizi, yazaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Sa\u011flam yaz\u0131l\u0131mlar geli\u015ftirin ve yaz\u0131l\u0131m kalitenizi art\u0131r\u0131n.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-uctan-uca-testler-ve-autotools\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Neden U\u00e7tan Uca Testler ve Autotools?"}]},{"@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\/33869","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=33869"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33869\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}