{"id":31457,"date":"2025-10-10T05:02:24","date_gmt":"2025-10-10T02:02:24","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/"},"modified":"2025-10-10T05:02:24","modified_gmt":"2025-10-10T02:02:24","slug":"shell-betikleri-testinde-stubbingin-gucu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/","title":{"rendered":"Shell Betikleri Testinde Stubbing&#8217;in G\u00fcc\u00fc"},"content":{"rendered":"<p><body><\/p>\n<style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            max-width: 900px;\n            margin: 0 auto;\n            padding: 20px;\n            background-color: #f9f9f9;\n        }<\/p>\n<p>        h2, h3 {\n            color: #2c3e50;\n            margin-top: 30px;\n            margin-bottom: 15px;\n            border-bottom: 2px solid #eee;\n            padding-bottom: 10px;\n        }<\/p>\n<p>        p {\n            margin-bottom: 1em;\n            text-align: justify;\n        }<\/p>\n<p>        .uzman-ipucu {\n            background-color: #e8f5e9;\n            border-left: 5px solid #4CAF50;\n            padding: 15px;\n            margin: 20px 0;\n            border-radius: 4px;\n            color: #2e7d32;\n            font-style: italic;\n        }<\/p>\n<p>        pre {\n            background-color: #272822;\n            color: #f8f8f2;\n            padding: 15px;\n            border-radius: 5px;\n            overflow-x: auto;\n            font-family: 'Consolas', 'Monaco', 'Andale Mono', 'Ubuntu Mono', monospace;\n            font-size: 0.9em;\n            margin: 20px 0;\n        }<\/p>\n<p>        code {\n            font-family: 'Consolas', 'Monaco', 'Andale Mono', 'Ubuntu Mono', monospace;\n            background-color: #eee;\n            padding: 2px 4px;\n            border-radius: 3px;\n        }<\/p>\n<p>        pre code {\n            background-color: transparent; \/* Override for inline code *\/\n            padding: 0;\n            border-radius: 0;\n        }<\/p>\n<p>        ul, ol {\n            margin-bottom: 1em;\n            padding-left: 20px;\n        }<\/p>\n<p>        li {\n            margin-bottom: 0.5em;\n        }<\/p>\n<p>        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin: 20px 0;\n        }<\/p>\n<p>        table, th, td {\n            border: 1px solid #ddd;\n        }<\/p>\n<p>        th, td {\n            padding: 12px;\n            text-align: left;\n        }<\/p>\n<p>        th {\n            background-color: #f2f2f2;\n            color: #333;\n        }<\/p>\n<p>        \/* Responsive Design *\/\n        @media (max-width: 768px) {\n            body {\n                padding: 15px;\n            }<\/p>\n<p>            h2 {\n                font-size: 1.8em;\n            }<\/p>\n<p>            h3 {\n                font-size: 1.4em;\n            }<\/p>\n<p>            pre {\n                white-space: pre-wrap; \/* Allows long lines to wrap *\/\n                word-break: break-all; \/* Ensures words break *\/\n            }<\/p>\n<p>            table, thead, tbody, th, td, tr {\n                display: block;\n            }<\/p>\n<p>            thead tr {\n                position: absolute;\n                top: -9999px;\n                left: -9999px;\n            }<\/p>\n<p>            tr {\n                border: 1px solid #ccc;\n                margin-bottom: 10px;\n            }<\/p>\n<p>            td {\n                border: none;\n                border-bottom: 1px solid #eee;\n                position: relative;\n                padding-left: 50%;\n                text-align: right;\n            }<\/p>\n<p>            td:before {\n                position: absolute;\n                top: 6px;\n                left: 6px;\n                width: 45%;\n                padding-right: 10px;\n                white-space: nowrap;\n                text-align: left;\n                font-weight: bold;\n            }<\/p>\n<p>            \/* Data labels for table cells *\/\n            td:nth-of-type(1):before { content: \"Konsept\"; }\n            td:nth-of-type(2):before { content: \"A\u00e7\u0131klama\"; }\n            td:nth-of-type(3):before { content: \"Stubbing ile Fark\u0131\"; }\n        }<\/p>\n<p>        @media (max-width: 480px) {\n            h2 {\n                font-size: 1.5em;\n            }<\/p>\n<p>            h3 {\n                font-size: 1.2em;\n            }<\/p>\n<p>            .uzman-ipucu {\n                padding: 10px;\n            }\n        }\n    <\/style>\n<p>Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, &#8216;stubbing&#8217; tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak test s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ve daha g\u00fcvenilir hale getirebilece\u011finizi detayl\u0131ca a\u00e7\u0131kl\u0131yor.<\/p>\n<p>Shell betikleri, otomasyon d\u00fcnyas\u0131n\u0131n isimsiz kahramanlar\u0131d\u0131r. Sistem y\u00f6netimi g\u00f6revlerinden CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatlar\u0131na kadar pek \u00e7ok alanda kar\u015f\u0131m\u0131za \u00e7\u0131karlar. Ancak, bu betikleri yazmak kolay olsa da, onlar\u0131 d\u00fczg\u00fcn bir \u015fekilde test etmek genellikle g\u00f6z ard\u0131 edilen veya &#8220;\u00e7ok zor&#8221; olarak etiketlenen bir konudur. Peki, bu zorlu\u011fun temelinde neler yatar? \u00d6ncelikle, shell betikleri genellikle sistemin di\u011fer bile\u015fenleriyle derinlemesine etkile\u015fim halindedir. \u00d6rne\u011fin, bir betik bir veritaban\u0131na ba\u011flanabilir, bir API \u00e7a\u011fr\u0131s\u0131 yapabilir, dosya sistemi \u00fczerinde i\u015flemler ger\u00e7ekle\u015ftirebilir ya da harici komut sat\u0131r\u0131 ara\u00e7lar\u0131n\u0131 (<code>curl<\/code>, <code>aws cli<\/code>, <code>kubectl<\/code> gibi) \u00e7al\u0131\u015ft\u0131rabilir. Bu t\u00fcr d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar, test ortam\u0131n\u0131 kurmay\u0131 ve her bir testin izole bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamay\u0131 olduk\u00e7a karma\u015f\u0131k hale getirir.<\/p>\n<p>Dahas\u0131, ger\u00e7ek d\u0131\u015f servislerle yap\u0131lan testler genellikle yava\u015f \u00e7al\u0131\u015f\u0131r ve maliyetlidir. Her test ko\u015fumunda bir veri taban\u0131na ba\u011flanmak veya bir bulut servisine istek g\u00f6ndermek hem zaman al\u0131r hem de gereksiz yere kaynak t\u00fcketir. En \u00f6nemlisi, bu ba\u011f\u0131ml\u0131l\u0131klar testlerinizin karars\u0131z olmas\u0131na yol a\u00e7abilir. \u00d6rne\u011fin, a\u011f sorunlar\u0131, servis kesintileri veya d\u0131\u015f API&#8217;deki beklenmedik de\u011fi\u015fiklikler, asl\u0131nda \u00e7al\u0131\u015fan beti\u011finizin testlerinin ba\u015far\u0131s\u0131z olmas\u0131na neden olabilir. Bu &#8220;flaky tests&#8221; (karars\u0131z testler), geli\u015ftiricilerin g\u00fcvenini zedeler ve otomasyonun faydalar\u0131n\u0131 azalt\u0131r. Ayr\u0131ca, kritik sistem komutlar\u0131n\u0131n (<code>rm -rf<\/code> gibi) yanl\u0131\u015fl\u0131kla ger\u00e7ek ortamda \u00e7al\u0131\u015ft\u0131r\u0131lma riski de cabas\u0131d\u0131r. Bu durumlar, geli\u015ftiricileri genellikle test yazmaktan vazge\u00e7irir veya sadece manuel testlere y\u00f6nlendirir, bu da uzun vadede daha b\u00fcy\u00fck sorunlara yol a\u00e7ar. \u0130\u015fte tam da bu noktada, stubbing devreye girer ve bu karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Shell betiklerinin do\u011fas\u0131 gere\u011fi esnek ve dinamik olmas\u0131, ayn\u0131 zamanda test edilebilirli\u011fi a\u00e7\u0131s\u0131ndan baz\u0131 benzersiz zorluklar\u0131 beraberinde getirir. Geli\u015ftiriciler, betiklerin farkl\u0131 senaryolarda do\u011fru tepki verdi\u011finden emin olmak isterler ancak d\u0131\u015f sistemlere s\u00fcrekli ba\u011f\u0131ml\u0131 kalmak istemezler. \u0130\u015fte bu \u00e7eli\u015fkiyi \u00e7\u00f6zmek i\u00e7in stubbing gibi teknikler vazge\u00e7ilmez bir hal al\u0131r.<\/p>\n<div class=\"uzman-ipucu\">\n        Uzman \u0130pucu: Shell betiklerini test ederken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck sorunlardan biri, d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131n testlerin tutarl\u0131l\u0131\u011f\u0131n\u0131 bozmas\u0131d\u0131r. Stubbing, bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 ortadan kald\u0131rarak test ortam\u0131n\u0131zda tam kontrol sa\u011flar.\n    <\/div>\n<h2>Stubbing sh Nedir ve Temel Kavramlar\u0131 Nelerdir?<\/h2>\n<p>Stubbing, yaz\u0131l\u0131m testlerinde, bir bile\u015fenin d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole etmek i\u00e7in kullan\u0131lan temel bir tekniktir. Shell betikleri (<code>sh<\/code>, <code>bash<\/code>, <code>zsh<\/code> vb.) \u00f6zelinde stubbing, bir beti\u011fin \u00e7a\u011f\u0131rd\u0131\u011f\u0131 harici komutlar\u0131, fonksiyonlar\u0131 veya servisleri, \u00f6nceden tan\u0131mlanm\u0131\u015f ve kontrol edilebilir davran\u0131\u015flarla de\u011fi\u015ftirmek anlam\u0131na gelir. B\u00f6ylece, test etti\u011finiz beti\u011fin ger\u00e7ekten ne yapt\u0131\u011f\u0131na odaklanabilir, d\u0131\u015f fakt\u00f6rlerin etkisini ortadan kald\u0131rabilirsiniz. Bu sayede, testleriniz daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha tekrarlanabilir hale gelir.<\/p>\n<p>Stubbing&#8217;in temel amac\u0131, test edilen birimin (bu durumda shell beti\u011fi) izole bir ortamda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakt\u0131r. Diyelim ki bir shell beti\u011finiz, uzak bir sunucudan veri indirmek i\u00e7in <code>curl<\/code> komutunu kullan\u0131yor. Ger\u00e7ek bir test ortam\u0131nda, <code>curl<\/code>&#8216;\u0131n ba\u015far\u0131l\u0131 olmas\u0131 i\u00e7in internet ba\u011flant\u0131s\u0131, hedef sunucunun \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 ve do\u011fru veriyi d\u00f6nd\u00fcrmesi gerekir. Bu ko\u015fullar\u0131n her zaman sa\u011flanmas\u0131 zordur. Stubbing ile, <code>curl<\/code> komutunu ge\u00e7ici olarak kendi yazd\u0131\u011f\u0131n\u0131z bir fonksiyona veya ba\u015fka bir beti\u011fe y\u00f6nlendirerek, sanki <code>curl<\/code> \u00e7al\u0131\u015fm\u0131\u015f gibi, ancak sizin istedi\u011finiz sonucu (ba\u015far\u0131l\u0131 indirme, hata mesaj\u0131, bo\u015f veri vb.) d\u00f6nd\u00fcrmesini sa\u011flayabilirsiniz. Bu, test senaryolar\u0131n\u0131z\u0131 \u00e7ok daha esnek ve kontrol edilebilir k\u0131lar.<\/p>\n<p>Peki, stubbing&#8217;i mocking veya faking gibi di\u011fer test izolasyon tekniklerinden ay\u0131ran nedir? K\u0131saca a\u00e7\u0131klamak gerekirse:<\/p>\n<ul>\n<li><strong>Stubbing:<\/strong> Test edilen bile\u015fenin d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n &#8220;davran\u0131\u015f\u0131n\u0131&#8221; taklit eder. Genellikle belirli bir \u00e7\u0131kt\u0131 d\u00f6nd\u00fcrmek veya belirli bir i\u015flemi sim\u00fcle etmekle ilgilenir. Stub&#8217;lar genellikle daha basit ve statiktir.<\/li>\n<li><strong>Mocking:<\/strong> Stubbing&#8217;e benzer, ancak daha geli\u015fmi\u015ftir. Bir mock nesnesi, sadece davran\u0131\u015f taklidi yapmakla kalmaz, ayn\u0131 zamanda test edilen bile\u015fenin bu ba\u011f\u0131ml\u0131l\u0131kla nas\u0131l etkile\u015fime girdi\u011fini (hangi parametrelerle \u00e7a\u011fr\u0131ld\u0131\u011f\u0131, ka\u00e7 kez \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 vb.) de kaydeder. Bu sayede, testlerinizde etkile\u015fimleri do\u011frulayabilirsiniz.<\/li>\n<li><strong>Faking:<\/strong> Ger\u00e7ek bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n basitle\u015ftirilmi\u015f bir uygulamas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, ger\u00e7ek bir veritaban\u0131 yerine, bellekte \u00e7al\u0131\u015fan basit bir veritaban\u0131 uygulamas\u0131n\u0131 kullanmak faking&#8217;e bir \u00f6rnektir.<\/li>\n<\/ul>\n<p>Shell betikleri d\u00fcnyas\u0131nda stubbing, genellikle iki ana y\u00f6ntemle ger\u00e7ekle\u015ftirilir:<\/p>\n<ol>\n<li><strong>PATH Manip\u00fclasyonu:<\/strong> Beti\u011fin arad\u0131\u011f\u0131 harici komutlar\u0131n (<code>ls<\/code>, <code>curl<\/code>, <code>grep<\/code> vb.) yerine, kendi sahte versiyonlar\u0131m\u0131z\u0131 i\u00e7eren bir dizini <code>PATH<\/code> ortam de\u011fi\u015fkeninin ba\u015f\u0131na eklemek. Betik bir komut \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda, kabuk \u00f6nce bizim sahte komutlar\u0131m\u0131z\u0131 i\u00e7eren dizine bakar ve onu bulursa, bizim versiyonumuzu \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Fonksiyon \u00dczerine Yazma (Function Overriding):<\/strong> E\u011fer betik i\u00e7inde zaten bir shell fonksiyonu tan\u0131mlanm\u0131\u015fsa veya biz ge\u00e7ici olarak bir fonksiyonu yeniden tan\u0131mlayabilirsek, beti\u011fin o fonksiyonu \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda bizim sahte versiyonumuzun \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabiliriz. Bu, genellikle mevcut betik fonksiyonlar\u0131n\u0131 veya sistem komutlar\u0131n\u0131n kabuk fonksiyonlar\u0131 olarak tan\u0131mlanm\u0131\u015f hallerini hedeflemek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ol>\n<p>Bu teknikler sayesinde, ger\u00e7ek sistemden tamamen izole edilmi\u015f, \u00f6ng\u00f6r\u00fclebilir ve h\u0131zl\u0131 test ortamlar\u0131 olu\u015fturabiliriz. B\u00f6ylece, geli\u015ftirme s\u00fcrecindeki verimlili\u011finiz artar ve daha sa\u011flam, hatas\u0131z shell betikleri \u00fcretebilirsiniz. Stubbing, ayn\u0131 zamanda CI\/CD s\u00fcre\u00e7lerinde otomatik testlerin temelini olu\u015fturur ve da\u011f\u0131t\u0131m \u00f6ncesi g\u00fcvenilirli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu y\u00f6ntemler, \u00f6zellikle betiklerinizin beklenmedik hatalara veya d\u0131\u015f sistemdeki de\u011fi\u015fikliklere nas\u0131l tepki verdi\u011fini test etmek i\u00e7in paha bi\u00e7ilmezdir. Gelin \u015fimdi bu temel kavramlar\u0131 pratik \u00f6rneklerle daha yak\u0131ndan inceleyelim.<\/p>\n<h2>Stubbing ile \u0130lk Ad\u0131mlar: Basit Bir \u00d6rnek Nas\u0131l Ba\u015flar?<\/h2>\n<p>\u015eimdi stubbing&#8217;in pratik d\u00fcnyas\u0131na ad\u0131m atal\u0131m. \u0130lk olarak, <code>PATH<\/code> ortam de\u011fi\u015fkenini manip\u00fcle ederek harici bir komutu nas\u0131l stub&#8217;layaca\u011f\u0131m\u0131z\u0131 g\u00f6relim. Bu y\u00f6ntem, shell betiklerinizin d\u0131\u015far\u0131dan \u00e7a\u011f\u0131rd\u0131\u011f\u0131 herhangi bir komutu (\u00f6rne\u011fin <code>curl<\/code>, <code>git<\/code>, <code>docker<\/code>, <code>kubectl<\/code>) taklit etmek i\u00e7in olduk\u00e7a etkilidir. Ad\u0131m ad\u0131m ilerleyelim:<\/p>\n<h3>Vaka Analizi 1: Uzak Bir Kaynaktan Veri \u00c7eken Beti\u011fi Test Etme<\/h3>\n<p>Diyelim ki, uzak bir API&#8217;den kullan\u0131c\u0131 listesi \u00e7eken ve bunu i\u015fleyen basit bir shell beti\u011finiz var. Betik, <code>curl<\/code> komutunu kullanarak HTTP iste\u011fi yap\u0131yor. Biz, <code>curl<\/code>&#8216;\u0131n ger\u00e7ek bir API&#8217;ye gitmesini engellemek ve bunun yerine kendi kontrol\u00fcm\u00fczdeki bir JSON \u00e7\u0131kt\u0131s\u0131 d\u00f6nd\u00fcrmesini sa\u011flamak istiyoruz.<\/p>\n<p>\u0130\u015fte test etmek istedi\u011fimiz betik (<code>get_users.sh<\/code>):<\/p>\n<pre><code>\n#!\/bin\/bash\n\n# Uzak bir API'den kullan\u0131c\u0131lar\u0131 \u00e7eker\nfetch_users() {\n    local api_url=\"https:\/\/api.example.com\/users\"\n    local response=$(curl -s \"$api_url\") # -s: sessiz mod\n\n    if [ $? -eq 0 ]; then\n        echo \"$response\" | jq '.' # JSON \u00e7\u0131kt\u0131s\u0131n\u0131 formatla (jq y\u00fckl\u00fc olmal\u0131)\n        return 0\n    else\n        echo \"Hata: Kullan\u0131c\u0131lar \u00e7ekilemedi.\" >&2\n        return 1\n    fi\n}\n\n# E\u011fer betik do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131ysa\nif [[ \"${BASH_SOURCE[0]}\" == \"${0}\" ]]; then\n    fetch_users\nfi\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu betik, <code>curl<\/code> ve <code>jq<\/code> komutlar\u0131na ba\u011f\u0131ml\u0131d\u0131r. Biz sadece <code>curl<\/code>'\u0131 stub'layarak test etmek istiyoruz. \u0130\u015fte test beti\u011fimiz (<code>test_get_users.sh<\/code>) ve <code>curl<\/code> stub'\u0131m\u0131z (<code>test_stubs\/curl<\/code>):<\/p>\n<p><strong>1. Stub Dizini Olu\u015fturma ve Sahte Komutu Yazma:<\/strong><\/p>\n<p>\u00d6ncelikle, sahte komutlar\u0131m\u0131z\u0131 bar\u0131nd\u0131racak bir dizin olu\u015ftural\u0131m. \u00d6rne\u011fin, <code>test_stubs\/<\/code>:<\/p>\n<pre><code>\nmkdir -p test_stubs\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, <code>curl<\/code> komutunu taklit edecek olan beti\u011fi <code>test_stubs\/curl<\/code> yoluna olu\u015ftural\u0131m:<\/p>\n<pre><code>\n# test_stubs\/curl i\u00e7eri\u011fi\n#!\/bin\/bash\necho '{\"status\": \"success\", \"data\": [{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}]}'\nexit 0\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu sahte <code>curl<\/code> beti\u011fine \u00e7al\u0131\u015ft\u0131rma izni verelim:<\/p>\n<pre><code>\nchmod +x test_stubs\/curl\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>2. Test Beti\u011fini Yazma (PATH Manip\u00fclasyonu ile):<\/strong><\/p>\n<p>\u015eimdi de testlerimizi y\u00f6netecek ana beti\u011fi (<code>run_tests.sh<\/code>) yazal\u0131m. Bu betik, <code>PATH<\/code> ortam de\u011fi\u015fkenini manip\u00fcle ederek, bizim sahte <code>curl<\/code>'\u0131m\u0131z\u0131n ger\u00e7ek <code>curl<\/code>'dan \u00f6nce bulunmas\u0131n\u0131 sa\u011flayacak:<\/p>\n<pre><code>\n# run_tests.sh i\u00e7eri\u011fi\n#!\/bin\/bash\n\n# Test ortam\u0131n\u0131 ayarla\nTEST_STUBS_DIR=\".\/test_stubs\"\nORIGINAL_PATH=\"$PATH\" # Orijinal PATH'i sakla\n\nsetup_test_env() {\n    # Stub dizinimizi PATH'in en ba\u015f\u0131na ekliyoruz\n    export PATH=\"$TEST_STUBS_DIR:$PATH\"\n    echo \"PATH g\u00fcncellendi: $PATH\"\n}\n\ncleanup_test_env() {\n    # Testler bittikten sonra PATH'i eski haline getiriyoruz\n    export PATH=\"$ORIGINAL_PATH\"\n    echo \"PATH eski haline getirildi: $PATH\"\n    rm -rf \"$TEST_STUBS_DIR\" # Stub dizinini de temizleyelim\n}\n\n# Hata durumunda cleanup yapmay\u0131 garantile\ntrap cleanup_test_env EXIT\n\nrun_test_case_success() {\n    echo \"--- Test Durumu: Ba\u015far\u0131l\u0131 API Yan\u0131t\u0131 ---\"\n    # get_users.sh beti\u011fini \u00e7al\u0131\u015ft\u0131r\n    output=$(.\/get_users.sh)\n    expected_output='{\n  \"status\": \"success\",\n  \"data\": [\n    {\n      \"id\": 1,\n      \"name\": \"Alice\"\n    },\n    {\n      \"id\": 2,\n      \"name\": \"Bob\"\n    }\n  ]\n}'\n    if [[ \"$output\" == \"$expected_output\" ]]; then\n        echo \"Test BA\u015eARILI: Beklenen \u00e7\u0131kt\u0131 al\u0131nd\u0131.\"\n    else\n        echo \"Test BA\u015eARISIZ: Beklenen \u00e7\u0131kt\u0131 ile uyu\u015fmuyor.\"\n        echo \"Beklenen:\\n$expected_output\"\n        echo \"Al\u0131nan:\\n$output\"\n        return 1\n    fi\n}\n\nrun_test_case_failure() {\n    echo \"--- Test Durumu: Hatal\u0131 API Yan\u0131t\u0131 (curl hatas\u0131) ---\"\n    # Bu test i\u00e7in farkl\u0131 bir curl stub'\u0131 kullanal\u0131m\n    echo '#!\/bin\/bash' > \"$TEST_STUBS_DIR\/curl\"\n    echo 'echo \"curl: (6) Could not resolve host: api.example.com\" >&2' >> \"$TEST_STUBS_DIR\/curl\"\n    echo 'exit 6' >> \"$TEST_STUBS_DIR\/curl\"\n    chmod +x \"$TEST_STUBS_DIR\/curl\"\n\n    output=$(.\/get_users.sh 2>&1) # Hata \u00e7\u0131kt\u0131s\u0131n\u0131 da yakala\n    if echo \"$output\" | grep -q \"Hata: Kullan\u0131c\u0131lar \u00e7ekilemedi.\"; then\n        echo \"Test BA\u015eARILI: Hata mesaj\u0131 do\u011fru \u015fekilde yakaland\u0131.\"\n    else\n        echo \"Test BA\u015eARISIZ: Hata mesaj\u0131 bekleniyor ancak bulunamad\u0131.\"\n        echo \"Al\u0131nan:\\n$output\"\n        return 1\n    fi\n}\n\n# Testleri \u00e7al\u0131\u015ft\u0131r\nsetup_test_env\nrun_test_case_success\nrun_test_case_failure\n\necho \"T\u00fcm testler tamamland\u0131.\"\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu test beti\u011fini \u00e7al\u0131\u015ft\u0131r\u0131labilir hale getirin: <code>chmod +x run_tests.sh<\/code>. Ard\u0131ndan <code>.\/run_tests.sh<\/code> ile \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>get_users.sh<\/code> beti\u011finizin ger\u00e7ek <code>curl<\/code> yerine sizin sahte <code>curl<\/code>'\u0131n\u0131z\u0131 kulland\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Bu y\u00f6ntem, shell betiklerini d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klardan izole etmek i\u00e7in olduk\u00e7a g\u00fc\u00e7l\u00fc ve esnektir. \u00d6zellikle farkl\u0131 hata senaryolar\u0131n\u0131 (a\u011f kesintisi, sunucu hatas\u0131 vb.) sim\u00fcle etmek istedi\u011finizde, sahte komutlar\u0131n \u00e7\u0131k\u0131\u015f kodlar\u0131n\u0131 ve hata mesajlar\u0131n\u0131 kolayca manip\u00fcle edebilirsiniz.<\/p>\n<p>Unutmamak gerekir ki, <code>trap cleanup_test_env EXIT<\/code> komutu, betik herhangi bir nedenle sonland\u0131\u011f\u0131nda (ba\u015far\u0131l\u0131 veya hatal\u0131), <code>cleanup_test_env<\/code> fonksiyonunun \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder. Bu, test ortam\u0131n\u0131z\u0131 temizlemenin ve <code>PATH<\/code>'i eski haline getirmenin kritik bir yoludur. Aksi takdirde, ortam de\u011fi\u015fkenleriniz kal\u0131c\u0131 olarak de\u011fi\u015febilir ve di\u011fer betiklerinizi etkileyebilir. Bu ilk ad\u0131mda, <code>PATH<\/code> manip\u00fclasyonunun ne kadar g\u00fc\u00e7l\u00fc ve basit bir stubbing mekanizmas\u0131 sa\u011flad\u0131\u011f\u0131n\u0131 g\u00f6rm\u00fc\u015f olduk. \u015eimdi, daha incelikli bir stubbing y\u00f6ntemine, yani fonksiyonlar\u0131 ge\u00e7ici olarak ge\u00e7ersiz k\u0131lmaya ge\u00e7elim.<\/p>\n<h3>Fonksiyonlar\u0131 Ge\u00e7ici Olarak Ge\u00e7ersiz K\u0131lma: Yerel Stubbing Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p><code>PATH<\/code> manip\u00fclasyonu, harici komutlar\u0131 stub'lamak i\u00e7in m\u00fckemmel bir y\u00f6ntemdir. Ancak, bazen beti\u011finiz i\u00e7inde tan\u0131mlanm\u0131\u015f bir shell fonksiyonunun davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek isteyebilirsiniz. \u0130\u015fte burada fonksiyonlar\u0131 ge\u00e7ici olarak ge\u00e7ersiz k\u0131lma (function overriding) tekni\u011fi devreye girer. Bu y\u00f6ntem, \u00f6zellikle betik i\u00e7indeki yard\u0131mc\u0131 fonksiyonlar\u0131 veya karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 test ederken \u00e7ok i\u015fe yarar.<\/p>\n<p>Shell ortam\u0131nda, bir fonksiyonu tan\u0131mlad\u0131\u011f\u0131n\u0131zda veya yeniden tan\u0131mlad\u0131\u011f\u0131n\u0131zda, bu, ge\u00e7erli shell oturumu i\u00e7inde \u00f6nceki tan\u0131mlamas\u0131n\u0131 ge\u00e7ersiz k\u0131lar. Bu \u00f6zelli\u011fi test senaryolar\u0131m\u0131zda kullanarak, beti\u011fimizin beklenen davran\u0131\u015f\u0131 sergileyip sergilemedi\u011fini kontrol edebiliriz.<\/p>\n<h3>Vaka Analizi 2: Bir Betik \u0130\u00e7indeki Yard\u0131mc\u0131 Fonksiyonu Stub'lama<\/h3>\n<p>\u015eimdi, bir dosyan\u0131n varl\u0131\u011f\u0131n\u0131 kontrol eden ve sonra ona g\u00f6re bir i\u015flem yapan bir betik d\u00fc\u015f\u00fcnelim. Beti\u011fimiz, <code>check_file_exists<\/code> ad\u0131nda bir yard\u0131mc\u0131 fonksiyon kullan\u0131yor.<\/p>\n<p>\u0130\u015fte test etmek istedi\u011fimiz betik (<code>process_file.sh<\/code>):<\/p>\n<pre><code>\n#!\/bin\/bash\n\n# check_file_exists: Dosyan\u0131n varl\u0131\u011f\u0131n\u0131 kontrol eder\n# Parametre: $1 = kontrol edilecek dosya yolu\n# \u00c7\u0131kt\u0131: 0 e\u011fer dosya varsa, 1 e\u011fer yoksa\ncheck_file_exists() {\n    local file_path=\"$1\"\n    if [[ -f \"$file_path\" ]]; then\n        echo \"Dosya '$file_path' mevcut.\"\n        return 0\n    else\n        echo \"Hata: Dosya '$file_path' bulunamad\u0131.\" >&2\n        return 1\n    fi\n}\n\n# process_data: Dosya mevcutsa veriyi i\u015fler\nprocess_data() {\n    local data_file=\"$1\"\n    if check_file_exists \"$data_file\"; then\n        echo \"Dosya '$data_file' mevcut, veri i\u015fleniyor...\"\n        # Ger\u00e7ek d\u00fcnya senaryosunda burada dosya i\u00e7eri\u011fi okunur, i\u015flenir vb.\n        echo \"Veri ba\u015far\u0131yla i\u015flendi.\"\n        return 0\n    else\n        echo \"Veri i\u015fleme iptal edildi \u00e7\u00fcnk\u00fc dosya bulunamad\u0131.\" >&2\n        return 1\n    fi\n}\n\n# E\u011fer betik do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131ysa\nif [[ \"${BASH_SOURCE[0]}\" == \"${0}\" ]]; then\n    process_data \"data.txt\"\nfi\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu betikte, <code>process_data<\/code> fonksiyonu, <code>check_file_exists<\/code> fonksiyonunun sonucuna g\u00f6re hareket ediyor. Bizim amac\u0131m\u0131z, <code>check_file_exists<\/code> fonksiyonunu stub'lamak ve ger\u00e7ek dosya sistemi kontrol\u00fc yapmadan onun ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z oldu\u011funu sim\u00fcle etmek. B\u00f6ylece, <code>process_data<\/code>'n\u0131n farkl\u0131 durumlarla nas\u0131l ba\u015fa \u00e7\u0131kt\u0131\u011f\u0131n\u0131 test edebiliriz.<\/p>\n<p><strong>Test Beti\u011fi (<code>run_function_tests.sh<\/code>):<\/strong><\/p>\n<pre><code>\n#!\/bin\/bash\n\n# Orijinal beti\u011fi kaynak olarak dahil edelim\n# Bu sayede beti\u011fin fonksiyonlar\u0131n\u0131 kendi ortam\u0131m\u0131zda tan\u0131mlam\u0131\u015f olaca\u011f\u0131z.\n# Ancak bu fonksiyonlar\u0131 stub'layaca\u011f\u0131m\u0131z i\u00e7in asl\u0131nda kendi tan\u0131mlar\u0131m\u0131z ge\u00e7erli olacak.\n# E\u011fer kaynak dosyan\u0131n fonksiyonlar\u0131n\u0131 direkt override ediyorsak,\n# asl\u0131nda <code>source<\/code> etmeye gerek kalmaz, sadece beti\u011fi \u00e7al\u0131\u015ft\u0131r\u0131rken override ederiz.\n# Ancak burada ba\u011f\u0131ms\u0131z test beti\u011fi i\u00e7inde override edece\u011fiz.\n\n# Temizlik fonksiyonu\ncleanup_test_env() {\n    echo \"Temizlik yap\u0131l\u0131yor...\"\n    unset -f check_file_exists # Stub fonksiyonunu kald\u0131r\n}\ntrap cleanup_test_env EXIT\n\nrun_test_case_file_exists() {\n    echo \"--- Test Durumu: Dosya Mevcut (Stub) ---\"\n    # check_file_exists fonksiyonunu stub'layal\u0131m\n    # Bu fonksiyon, her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda dosyan\u0131n var oldu\u011funu bildirecek\n    check_file_exists() {\n        echo \"Stub: Dosya '$1' mevcut olarak kabul edildi.\"\n        return 0\n    }\n    \n    # process_file.sh beti\u011fini \u00e7al\u0131\u015ft\u0131r, ama i\u00e7indeki process_data'y\u0131 \u00e7a\u011f\u0131raca\u011f\u0131z\n    # Bu testte process_file.sh'nin kendisini \u00e7al\u0131\u015ft\u0131rmak yerine,\n    # i\u00e7indeki process_data fonksiyonunu do\u011frudan \u00e7a\u011f\u0131rabiliriz\n    # Veya beti\u011fin tamam\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131p fonksiyonun override edildi\u011finden emin olabiliriz.\n    # Kolayl\u0131k i\u00e7in beti\u011fi kaynak olarak al\u0131p fonksiyona do\u011frudan eri\u015felim.\n    \n    # \u00d6NEML\u0130: E\u011fer process_file.sh'yi kaynak olarak almak istemiyorsan\u0131z,\n    # ve betik zaten fonksiyonlar\u0131 \u00e7a\u011f\u0131r\u0131yorsa,\n    # o zaman <code>export -f check_file_exists<\/code> kullanman\u0131z ve\n    # test etti\u011finiz beti\u011fi ayr\u0131 bir alt kabukta \u00e7al\u0131\u015ft\u0131rman\u0131z gerekebilir.\n    # Ancak basitlik i\u00e7in burada ayn\u0131 kabukta override ediyoruz.\n\n    # E\u011fer betik ana fonksiyonu olarak \u00e7al\u0131\u015f\u0131yorsa:\n    # output=$(.\/process_file.sh 2>&1)\n    # Bu durumda, beti\u011fin en \u00fcst\u00fcne <code>source<\/code> komutu eklemek mant\u0131kl\u0131 olabilir\n    # ya da beti\u011fi do\u011frudan test beti\u011fi i\u00e7inden \u00e7a\u011f\u0131r\u0131rken override yapmak.\n\n    # Daha temiz bir y\u00f6ntem: Test i\u00e7in bir yard\u0131mc\u0131 betik olu\u015ftural\u0131m\n    # ve fonksiyonlar\u0131 orada override edip ana beti\u011fi \u00f6yle \u00e7a\u011f\u0131ral\u0131m.\n\n    # \u015eimdi daha direkt bir yakla\u015f\u0131mla, beti\u011fi bir alt kabukta \u00e7al\u0131\u015ft\u0131r\u0131rken override edelim\n    # Bu, beti\u011fin orijinal tan\u0131m\u0131n\u0131 etkilemeyecek.\n    # Ancak e\u011fer betik i\u00e7inde \u00e7a\u011fr\u0131lan bir fonksiyonu override etmek istiyorsak,\n    # genelde test beti\u011finin i\u00e7inden <code>source<\/code> edip fonksiyonu override etmek daha kolayd\u0131r.\n    # Burada <code>source<\/code> kullanarak betik fonksiyonlar\u0131n\u0131 ge\u00e7erli kabu\u011fa y\u00fckleyelim\n    source .\/process_file.sh\n\n    output=$(process_data \"test_data.txt\")\n    \n    if echo \"$output\" | grep -q \"Veri ba\u015far\u0131yla i\u015flendi.\"; then\n        echo \"Test BA\u015eARILI: Dosya mevcut olarak kabul edildi ve veri i\u015flendi.\"\n    else\n        echo \"Test BA\u015eARISIZ: Dosya mevcut olarak kabul edilmesine ra\u011fmen veri i\u015flenmedi.\"\n        echo \"Al\u0131nan:\\n$output\"\n        return 1\n    fi\n}\n\nrun_test_case_file_not_exists() {\n    echo \"--- Test Durumu: Dosya Yok (Stub) ---\"\n    # check_file_exists fonksiyonunu tekrar stub'layal\u0131m, bu kez dosyan\u0131n olmad\u0131\u011f\u0131n\u0131 belirtecek\n    check_file_exists() {\n        echo \"Stub: Dosya '$1' mevcut de\u011fil olarak kabul edildi.\" >&2\n        return 1\n    }\n\n    # process_data fonksiyonunu \u00e7al\u0131\u015ft\u0131r\n    output=$(process_data \"non_existent_file.txt\" 2>&1) # Hata \u00e7\u0131kt\u0131s\u0131n\u0131 da yakala\n    \n    if echo \"$output\" | grep -q \"Veri i\u015fleme iptal edildi \u00e7\u00fcnk\u00fc dosya bulunamad\u0131.\"; then\n        echo \"Test BA\u015eARILI: Dosya yok olarak kabul edildi ve i\u015flem iptal edildi.\"\n    else\n        echo \"Test BA\u015eARISIZ: Dosya yok olarak kabul edilmesine ra\u011fmen i\u015flem iptal edilmedi.\"\n        echo \"Al\u0131nan:\\n$output\"\n        return 1\n    fi\n}\n\n# Testleri \u00e7al\u0131\u015ft\u0131r\nrun_test_case_file_exists\nrun_test_case_file_not_exists\necho \"T\u00fcm fonksiyon testleri tamamland\u0131.\"\n    <\/pre>\n<p><\/code><\/p>\n<p><code>run_function_tests.sh<\/code> beti\u011fini \u00e7al\u0131\u015ft\u0131r\u0131labilir hale getirin: <code>chmod +x run_function_tests.sh<\/code>. Ard\u0131ndan <code>.\/run_function_tests.sh<\/code> ile \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>process_file.sh<\/code> i\u00e7indeki <code>check_file_exists<\/code> fonksiyonunun yerine sizin tan\u0131mlad\u0131\u011f\u0131n\u0131z sahte fonksiyonlar\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Bu teknik, \u00f6zellikle bir beti\u011fin i\u00e7 mant\u0131\u011f\u0131n\u0131 veya birden fazla fonksiyonun etkile\u015fimini test ederken \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<div class=\"uzman-ipucu\">\n        Uzman \u0130pucu: Fonksiyonlar\u0131 ge\u00e7ersiz k\u0131larken, stub fonksiyonlar\u0131n\u0131z\u0131n orijinal fonksiyonun bekledi\u011fi parametreleri do\u011fru \u015fekilde ele ald\u0131\u011f\u0131ndan ve beklenen \u00e7\u0131k\u0131\u015f kodunu d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnden emin olun. Bu, testlerinizin ger\u00e7ek\u00e7i olmas\u0131n\u0131 sa\u011flar.\n    <\/div>\n<p>Fonksiyon stubbing'i, <code>PATH<\/code> manip\u00fclasyonuna k\u0131yasla daha gran\u00fcler kontrol sa\u011flar. Tek bir betik i\u00e7indeki belirli bir davran\u0131\u015f\u0131 hedeflemenize olanak tan\u0131r. \u00d6zellikle karma\u015f\u0131k betiklerde, hangi ba\u011f\u0131ml\u0131l\u0131klar\u0131n ger\u00e7ek kalmas\u0131 gerekti\u011fini ve hangilerinin stub'lanmas\u0131 gerekti\u011fini daha hassas bir \u015fekilde belirleyebilirsiniz. Bu iki temel teknikle, shell betiklerinizi test etme yetene\u011finiz \u00f6nemli \u00f6l\u00e7\u00fcde artacakt\u0131r. Ancak stubbing sadece temel kavramlardan ibaret de\u011fildir; ileri d\u00fczey ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131yla test stratejinizi daha da geli\u015ftirebilirsiniz.<\/p>\n<h2>Daha Karma\u015f\u0131k Senaryolar \u0130\u00e7in \u0130pu\u00e7lar\u0131 ve P\u00fcf Noktalar\u0131 Nelerdir?<\/h2>\n<p>Temel stubbing tekniklerini \u00f6\u011frendikten sonra, s\u0131ra daha karma\u015f\u0131k senaryolarla ba\u015fa \u00e7\u0131kmaya geliyor. Shell betik testlerini daha g\u00fc\u00e7l\u00fc, esnek ve g\u00fcvenilir hale getirecek baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131 a\u015fa\u011f\u0131dad\u0131r.<\/p>\n<h3>1. Test Helper Betikleri ve Test \u00c7er\u00e7eveleri Kullan\u0131m\u0131<\/h3>\n<p>B\u00fcy\u00fck projelerde, her test dosyas\u0131 i\u00e7in ayn\u0131 <code>setup<\/code> ve <code>teardown<\/code> mant\u0131\u011f\u0131n\u0131 tekrarlamak verimsizdir. Bu nedenle, test yard\u0131mc\u0131 betikleri (test helper scripts) veya basit test \u00e7er\u00e7eveleri kullanmak, kod tekrar\u0131n\u0131 azalt\u0131r ve testlerinizi daha d\u00fczenli hale getirir. Bu yard\u0131mc\u0131 betikler genellikle \u015funlar\u0131 i\u00e7erir:<\/p>\n<ul>\n<li>Ortam de\u011fi\u015fkenlerini ayarlama (<code>PATH<\/code> manip\u00fclasyonu gibi).<\/li>\n<li>Ge\u00e7ici dizinler olu\u015fturma ve temizleme.<\/li>\n<li>Stub komutlar\u0131n\u0131 veya fonksiyonlar\u0131n\u0131 tan\u0131mlama.<\/li>\n<li>Test sonu\u00e7lar\u0131n\u0131 bi\u00e7imlendirme ve raporlama.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin, t\u00fcm testleriniz i\u00e7in ortak bir <code>test_utils.sh<\/code> dosyas\u0131 olu\u015fturabilir ve test betiklerinizin ba\u015f\u0131nda bunu <code>source<\/code> edebilirsiniz. Bu, testlerinizin daha y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>2. Stub'a Gelen Parametreleri Do\u011frulama<\/h3>\n<p>Bazen bir komutun veya fonksiyonun sadece \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 de\u011fil, ayn\u0131 zamanda hangi parametrelerle \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 da do\u011frulamak istersiniz. Bu, \"mocking\"e daha yak\u0131n bir davran\u0131\u015ft\u0131r ve stub'lar\u0131n\u0131z\u0131 daha ak\u0131ll\u0131 hale getirmenizi sa\u011flar. Sahte komutunuz veya fonksiyonunuz i\u00e7inde, \u00e7a\u011fr\u0131 parametrelerini bir dosyaya yazabilir veya bir ortam de\u011fi\u015fkenine kaydedebilir, daha sonra test beti\u011finiz bu de\u011feri okuyarak do\u011frulamay\u0131 yapabilir.<\/p>\n<p>\u00d6rnek <code>test_stubs\/my_command<\/code>:<\/p>\n<pre><code>\n#!\/bin\/bash\necho \"$@\" >> \"$TEST_STUBS_DIR\/my_command_calls.log\"\necho \"Sahte \u00e7\u0131kt\u0131\"\nexit 0\n    <\/pre>\n<p><\/code><\/p>\n<p>Test beti\u011finizde ise:<\/p>\n<pre><code>\n# ... test_stubs\/my_command_calls.log i\u00e7eri\u011fini oku ve do\u011frula ...\nexpected_params=\"--option value --input \/path\/to\/file\"\nactual_params=$(head -n 1 \"$TEST_STUBS_DIR\/my_command_calls.log\")\n\nif [[ \"$actual_params\" == \"$expected_params\" ]]; then\n    echo \"Parametreler do\u011fru \u015fekilde iletildi. BA\u015eARILI.\"\nelse\n    echo \"Parametreler uyu\u015fmuyor. BA\u015eARISIZ.\"\nfi\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu y\u00f6ntem, beti\u011finizin d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klarla do\u011fru \u015fekilde etkile\u015fime girdi\u011finden emin olman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>3. Dinamik \u00c7\u0131k\u0131\u015f Kodlar\u0131 ve Hata Senaryolar\u0131<\/h3>\n<p>Ger\u00e7ek d\u00fcnyada komutlar her zaman ba\u015far\u0131l\u0131 olmaz. A\u011f hatalar\u0131, yetkilendirme sorunlar\u0131 veya ge\u00e7ersiz giri\u015fler nedeniyle farkl\u0131 hata kodlar\u0131 d\u00f6nd\u00fcrebilirler. Stub'lar\u0131n\u0131z\u0131n bu senaryolar\u0131 taklit edebilmesi, beti\u011finizin hata y\u00f6netimini test etmek i\u00e7in kritik \u00f6neme sahiptir. Stub'unuzu, bir ortam de\u011fi\u015fkeninin de\u011ferine veya \u00e7a\u011fr\u0131 parametrelerine g\u00f6re farkl\u0131 \u00e7\u0131k\u0131\u015f kodlar\u0131 d\u00f6nd\u00fcrecek \u015fekilde yap\u0131land\u0131rabilirsiniz.<\/p>\n<p>\u00d6rnek <code>test_stubs\/another_command<\/code>:<\/p>\n<pre><code>\n#!\/bin\/bash\nif [[ \"$1\" == \"--fail\" ]]; then\n    echo \"Hata durumu sim\u00fcle ediliyor.\" >&2\n    exit 1\nelse\n    echo \"Ba\u015far\u0131l\u0131 durum sim\u00fcle ediliyor.\"\n    exit 0\nfi\n    <\/pre>\n<p><\/code><\/p>\n<p>Test beti\u011finizde:<\/p>\n<pre><code>\n# Ba\u015far\u0131l\u0131 senaryo\nunset MOCK_BEHAVIOR\noutput=$(dynamic_command)\nif [ $? -eq 0 ]; then ... fi\n\n# Hata senaryosu\nexport MOCK_BEHAVIOR=\"error\"\noutput=$(dynamic_command --fail 2>&1)\nif [ $? -ne 0 ]; then ... fi\n    <\/pre>\n<p><\/code><\/p>\n<h3>4. Ge\u00e7ici Dizinler ve Temizlik (<code>mktemp<\/code> ve <code>trap<\/code>)<\/h3>\n<p>Testler genellikle ge\u00e7ici dosyalar veya dizinler olu\u015fturur. Bu kaynaklar\u0131n her test ko\u015fumu sonras\u0131nda temizlenmesi, test ortam\u0131n\u0131z\u0131n tutarl\u0131 kalmas\u0131 i\u00e7in \u00e7ok \u00f6nemlidir. <code>mktemp<\/code> komutu ge\u00e7ici dosya ve dizinler olu\u015fturmak i\u00e7in idealdir. <code>trap<\/code> komutu ise bir shell beti\u011fi sonland\u0131\u011f\u0131nda (ba\u015far\u0131l\u0131 veya hatal\u0131) belirli bir komutun veya fonksiyonun \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n#!\/bin\/bash\n\n# Ge\u00e7ici dizin olu\u015ftur\nTEST_TEMP_DIR=$(mktemp -d)\necho \"Ge\u00e7ici dizin olu\u015fturuldu: $TEST_TEMP_DIR\"\n\n# Testler bittikten sonra temizli\u011fi yapacak trap komutu\ncleanup() {\n    echo \"Ge\u00e7ici dizin temizleniyor: $TEST_TEMP_DIR\"\n    rm -rf \"$TEST_TEMP_DIR\"\n}\ntrap cleanup EXIT # Betik ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z olsun, her zaman \u00e7al\u0131\u015f\u0131r\n\n# Testler burada \u00e7al\u0131\u015f\u0131r...\necho \"Testler \u00e7al\u0131\u015f\u0131yor...\"\ntouch \"$TEST_TEMP_DIR\/test_file.txt\"\nls \"$TEST_TEMP_DIR\"\n\n# ...\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131, testlerinizin birbirinden ba\u011f\u0131ms\u0131z olmas\u0131n\u0131 ve sisteminizde gereksiz dosyalar b\u0131rakmamas\u0131n\u0131 garantiler.<\/p>\n<h3>5. Ortam De\u011fi\u015fkenleriyle Dinamik Stub Davran\u0131\u015f\u0131<\/h3>\n<p>Stub'lar\u0131n\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 test beti\u011finizden ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla kontrol edebilirsiniz. Bu, ayn\u0131 stub komutunu farkl\u0131 test senaryolar\u0131nda farkl\u0131 \u015fekillerde davranacak \u015fekilde kullanman\u0131za olanak tan\u0131r.<\/p>\n<pre><code>\n# test_stubs\/dynamic_command\n#!\/bin\/bash\nif [[ \"$MOCK_BEHAVIOR\" == \"error\" ]]; then\n    echo \"Dinamik hata!\" >&2\n    exit 1\nelse\n    echo \"Dinamik ba\u015far\u0131!\"\n    exit 0\nfi\n    <\/pre>\n<p><\/code><\/p>\n<p>Test beti\u011finizde:<\/p>\n<pre><code>\n# Ba\u015far\u0131l\u0131 senaryo\nunset MOCK_BEHAVIOR\noutput=$(dynamic_command)\n# ... kontrol et ...\n\n# Hata senaryosu\nexport MOCK_BEHAVIOR=\"error\"\noutput=$(dynamic_command 2>&1)\n# ... kontrol et ...\nunset MOCK_BEHAVIOR # Temizlemeyi unutma\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ipu\u00e7lar\u0131, shell betik testlerinizi daha sa\u011flam, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir hale getirmenize yard\u0131mc\u0131 olacakt\u0131r. Karma\u015f\u0131k i\u015f mant\u0131klar\u0131n\u0131 ve \u00e7oklu d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7eren betikleri test ederken bu y\u00f6ntemlerin bir kombinasyonunu kullanmak, geli\u015ftirme s\u00fcrecinizde size b\u00fcy\u00fck avantaj sa\u011flayacakt\u0131r. Unutmay\u0131n, iyi yaz\u0131lm\u0131\u015f testler, beti\u011finizin g\u00fcvenilirli\u011fini art\u0131rman\u0131n ve gelecekteki de\u011fi\u015fikliklere kar\u015f\u0131 onu koruman\u0131n en iyi yoludur.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Vaka Analizi: CI\/CD Ortam\u0131nda Stubbing Kullan\u0131m\u0131<\/h2>\n<p>Stubbing, sadece yerel geli\u015ftirme ortam\u0131nda de\u011fil, S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) boru hatlar\u0131nda da paha bi\u00e7ilmez bir rol oynar. CI\/CD, yaz\u0131l\u0131m\u0131n daha h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde teslim edilmesini sa\u011flayan bir dizi otomasyon uygulamas\u0131d\u0131r. Bu s\u00fcre\u00e7te, shell betiklerinin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik \u00f6neme sahiptir.<\/p>\n<h3>Neden CI\/CD'de Stubbing'e \u0130htiya\u00e7 Duyar\u0131z?<\/h3>\n<ol>\n<li><strong>H\u0131z ve Verimlilik:<\/strong> CI\/CD boru hatlar\u0131 h\u0131zl\u0131 geri bildirim d\u00f6ng\u00fcleri gerektirir. Ger\u00e7ek harici servislerle (veritabanlar\u0131, bulut API'leri vb.) her test ko\u015fumunda etkile\u015fim kurmak, test s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde uzatabilir. Stubbing, bu harici ba\u011f\u0131ml\u0131l\u0131klar\u0131 taklit ederek testleri saniyeler i\u00e7inde tamamlaman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>G\u00fcvenilirlik ve Tekrarlanabilirlik:<\/strong> Ger\u00e7ek servisler karars\u0131z olabilir; a\u011f gecikmeleri, servis kesintileri veya veri tutars\u0131zl\u0131klar\u0131 gibi durumlar testlerinizi ba\u015far\u0131s\u0131z k\u0131labilir, asl\u0131nda beti\u011finizde bir hata olmasa bile. Stubbing, bu t\u00fcr d\u0131\u015f fakt\u00f6rleri ortadan kald\u0131rarak testlerinizin her zaman ayn\u0131 ko\u015fullarda \u00e7al\u0131\u015fmas\u0131n\u0131 garantiler ve \"flaky\" testlerin \u00f6n\u00fcne ge\u00e7er.<\/li>\n<li><strong>Maliyet Tasarrufu:<\/strong> Bulut tabanl\u0131 servislerle her test ko\u015fumunda etkile\u015fim kurmak maliyetli olabilir. Stubbing ile ger\u00e7ek servis \u00e7a\u011fr\u0131lar\u0131n\u0131 minimize ederek bulut faturan\u0131zdan tasarruf edebilirsiniz.<\/li>\n<li><strong>\u0130zolasyon ve Kapsaml\u0131 Test:<\/strong> Stubbing, belirli hata senaryolar\u0131n\u0131 (\u00f6rne\u011fin, API'nin 500 hata kodu d\u00f6nd\u00fcrmesi, a\u011f zaman a\u015f\u0131m\u0131) ger\u00e7ek\u00e7i bir \u015fekilde sim\u00fcle etmenize olanak tan\u0131r. Ger\u00e7ek bir ortamda bu senaryolar\u0131 kas\u0131tl\u0131 olarak tetiklemek zor veya imkans\u0131z olabilir. Stub'lar sayesinde, beti\u011finizin her t\u00fcrl\u00fc duruma nas\u0131l tepki verdi\u011fini kapsaml\u0131 bir \u015fekilde test edebilirsiniz.<\/li>\n<\/ol>\n<h3>CI\/CD Boru Hatt\u0131 \u00d6rne\u011fi<\/h3>\n<p>\u015eimdi, bir CI\/CD boru hatt\u0131nda stubbing'in nas\u0131l kullan\u0131labilece\u011fine dair basitle\u015ftirilmi\u015f bir senaryo olu\u015ftural\u0131m. Diyelim ki, bir bulut depolama hizmetine (\u00f6rne\u011fin AWS S3) dosya y\u00fckleyen bir shell beti\u011fimiz var. Bu betik, <code>aws s3 cp<\/code> komutunu kullan\u0131yor.<\/p>\n<p><strong>Y\u00fcklenecek Betik (<code>upload_file.sh<\/code>):<\/strong><\/p>\n<pre><code>\n#!\/bin\/bash\n\n# Belirtilen dosyay\u0131 S3'e y\u00fckler\nupload_to_s3() {\n    local source_file=\"$1\"\n    local s3_bucket=\"$2\"\n    local s3_path=\"$3\"\n\n    if [[ -z \"$source_file\" || -z \"$s3_bucket\" || -z \"$s3_path\" ]]; then\n        echo \"Kullan\u0131m: upload_to_s3 <dosya> <bucket> <yol>\" >&2\n        return 1\n    fi\n\n    echo \"Dosya '$source_file' S3 bucket '$s3_bucket' yoluna '$s3_path' y\u00fckleniyor...\"\n    aws s3 cp \"$source_file\" \"s3:\/\/$s3_bucket\/$s3_path\"\n\n    if [ $? -eq 0 ]; then\n        echo \"Y\u00fckleme BA\u015eARILI: $source_file -> s3:\/\/$s3_bucket\/$s3_path\"\n        return 0\n    else\n        echo \"Y\u00fckleme BA\u015eARISIZ!\" >&2\n        return 1\n    fi\n}\n\nif [[ \"${BASH_SOURCE[0]}\" == \"${0}\" ]]; then\n    # \u00d6rnek kullan\u0131m (ger\u00e7ekte parametrelerle gelir)\n    upload_to_s3 \"local_data.txt\" \"my-prod-bucket\" \"data\/latest.txt\"\nfi\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>CI\/CD Test Ad\u0131m\u0131 (<code>ci_test_script.sh<\/code>):<\/strong><\/p>\n<p>Bu betik, CI\/CD ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak testleri i\u00e7eriyor. <code>aws<\/code> komutunu stub'layarak ger\u00e7ek S3 i\u015flemlerini engelliyoruz.<\/p>\n<pre><code>\n#!\/bin\/bash\n\necho \"CI\/CD Testleri Ba\u015flat\u0131l\u0131yor...\"\n\n# --- Ortam Ayarlar\u0131 ---\nTEST_STUBS_DIR=\".\/ci_test_stubs\"\nmkdir -p \"$TEST_STUBS_DIR\"\nORIGINAL_PATH=\"$PATH\"\n\nsetup_ci_env() {\n    export PATH=\"$TEST_STUBS_DIR:$PATH\"\n    echo \"CI PATH g\u00fcncellendi: $PATH\"\n}\n\ncleanup_ci_env() {\n    echo \"CI Ortam\u0131 Temizleniyor...\"\n    export PATH=\"$ORIGINAL_PATH\"\n    rm -rf \"$TEST_STUBS_DIR\"\n}\ntrap cleanup_ci_env EXIT\n\n# --- AWS CLI Stub'\u0131 ---\n# Test_stubs\/aws i\u00e7eri\u011fi:\n# Bu stub, aws komutunun cp alt komutunu yakalar ve her zaman ba\u015far\u0131l\u0131ym\u0131\u015f gibi davran\u0131r.\n# Ger\u00e7ekte ise S3'e hi\u00e7bir \u015fey y\u00fcklemez.\ncat << 'EOF' > \"$TEST_STUBS_DIR\/aws\"\n#!\/bin\/bash\nif [[ \"$1\" == \"s3\" && \"$2\" == \"cp\" ]]; then\n    echo \"Stub: S3 'cp' komutu yakaland\u0131. Sim\u00fcle edilmi\u015f ba\u015far\u0131.\"\n    echo \"Sim\u00fcle edilmi\u015f y\u00fckleme: $3 -> $4\"\n    exit 0\nelse\n    # Di\u011fer aws komutlar\u0131n\u0131 varsay\u0131lan olarak ba\u015far\u0131s\u0131z yapabiliriz veya\n    # ger\u00e7ek aws'e d\u00fc\u015f\u00fcrmek i\u00e7in PATH'i ayarlayabiliriz.\n    echo \"Stub: Bilinmeyen aws komutu: $@\" >&2\n    exit 1\nfi\nEOF\nchmod +x \"$TEST_STUBS_DIR\/aws\"\necho \"AWS CLI stub haz\u0131r.\"\n\n# --- Test Durumlar\u0131 ---\n\ntest_upload_success() {\n    echo \"--- Test Durumu: S3 Y\u00fckleme Ba\u015far\u0131l\u0131 ---\"\n    # Ge\u00e7ici bir test dosyas\u0131 olu\u015ftur\n    echo \"Test verisi\" > \"$TEST_STUBS_DIR\/temp_data.txt\"\n    local output=$(.\/upload_file.sh \"$TEST_STUBS_DIR\/temp_data.txt\" \"my-test-bucket\" \"test\/data.txt\")\n    local status=$?\n\n    if [ $status -eq 0 ] && echo \"$output\" | grep -q \"Y\u00fckleme BA\u015eARILI\"; then\n        echo \"Test BA\u015eARILI: Dosya ba\u015far\u0131l\u0131 \u015fekilde y\u00fcklendi (sim\u00fcle edildi).\"\n    else\n        echo \"Test BA\u015eARISIZ: Y\u00fckleme ba\u015far\u0131s\u0131z oldu.\"\n        echo \"\u00c7\u0131kt\u0131: $output\"\n        return 1\n    fi\n}\n\ntest_upload_failure_no_args() {\n    echo \"--- Test Durumu: Arg\u00fcman Eksikli\u011fi ---\"\n    local output=$(.\/upload_file.sh 2>&1) # Hata \u00e7\u0131kt\u0131s\u0131n\u0131 da yakala\n    local status=$?\n\n    if [ $status -ne 0 ] && echo \"$output\" | grep -q \"Kullan\u0131m: upload_to_s3\"; then\n        echo \"Test BA\u015eARILI: Arg\u00fcman eksikli\u011fi do\u011fru \u015fekilde yakaland\u0131.\"\n    else\n        echo \"Test BA\u015eARISIZ: Arg\u00fcman eksikli\u011fi beklenirken, farkl\u0131 bir sonu\u00e7 al\u0131nd\u0131.\"\n        echo \"\u00c7\u0131kt\u0131: $output\"\n        return 1\n    fi\n}\n\n# --- Testleri \u00c7al\u0131\u015ft\u0131r ---\nsetup_ci_env\ntest_upload_success\ntest_upload_failure_no_args\n\necho \"T\u00fcm CI\/CD testleri tamamland\u0131.\"\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>ci_test_script.sh<\/code> beti\u011fi, bir CI\/CD arac\u0131 (\u00f6rne\u011fin Jenkins, GitHub Actions, GitLab CI) taraf\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, <code>upload_file.sh<\/code> beti\u011finin ger\u00e7ek AWS komutlar\u0131n\u0131 \u00e7a\u011f\u0131rmak yerine, bizim sa\u011flad\u0131\u011f\u0131m\u0131z sahte <code>aws<\/code> komutunu kullanmas\u0131n\u0131 sa\u011flar. Bu sayede:<\/p>\n<ul>\n<li>Ger\u00e7ek AWS hesap kimlik bilgilerine veya a\u011f ba\u011flant\u0131s\u0131na ihtiya\u00e7 duyulmaz.<\/li>\n<li>Testler an\u0131nda tamamlan\u0131r, ger\u00e7ek bir S3 y\u00fcklemesinin bekleme s\u00fcresi olmaz.<\/li>\n<li>Farkl\u0131 hata senaryolar\u0131n\u0131 (\u00f6rne\u011fin, <code>aws<\/code> komutunun bir yetkilendirme hatas\u0131 d\u00f6nd\u00fcrmesi) kolayca sim\u00fcle edebiliriz.<\/li>\n<\/ul>\n<p>CI\/CD ortam\u0131nda stubbing, geli\u015ftiricilerin kodlar\u0131n\u0131 daha h\u0131zl\u0131 entegre etmelerine, daha g\u00fcvenilir derlemeler yapmalar\u0131na ve nihayetinde daha sa\u011flam yaz\u0131l\u0131mlar sunmalar\u0131na olanak tan\u0131yan kritik bir ara\u00e7t\u0131r. Bu sayede, \"\u00e7al\u0131\u015ft\u0131 bende\" sendromu ortadan kalkar ve otomatik testler, geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn ayr\u0131lmaz bir par\u00e7as\u0131 haline gelir. Betikleriniz karma\u015f\u0131kla\u015ft\u0131k\u00e7a ve d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 artt\u0131k\u00e7a, stubbing'in sundu\u011fu faydalar da katlanarak artacakt\u0131r.<\/p>\n<h2>Sonu\u00e7: Shell Betik Testlerinizde Stubbing Neden Olmazsa Olmaz?<\/h2>\n<p>Shell betikleri, modern yaz\u0131l\u0131m geli\u015ftirme ve sistem y\u00f6netimi s\u00fcre\u00e7lerinin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Ancak, bu betiklerin test edilebilirli\u011fi genellikle hafife al\u0131n\u0131r veya karma\u015f\u0131k bulunur. Bu makale boyunca, 'stubbing sh' tekni\u011finin, shell betiklerinizi test etme \u015feklinizi nas\u0131l devrim niteli\u011finde de\u011fi\u015ftirebilece\u011fini detaylar\u0131yla ele ald\u0131k. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, stubbing sayesinde d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131k, yava\u015fl\u0131k ve karars\u0131zl\u0131k gibi sorunlar\u0131n \u00fcstesinden gelmek m\u00fcmk\u00fcnd\u00fcr. <code>PATH<\/code> manip\u00fclasyonu ve fonksiyon ge\u00e7ersiz k\u0131lma gibi y\u00f6ntemlerle, betiklerinizin \u00e7a\u011f\u0131rd\u0131\u011f\u0131 harici komutlar\u0131 ve i\u00e7 fonksiyonlar\u0131 kendi kontrol\u00fcm\u00fczdeki sahte versiyonlar\u0131yla de\u011fi\u015ftirebildik. Bu, bize test ortam\u0131 \u00fczerinde tam hakimiyet sa\u011flayarak, \u00f6ng\u00f6r\u00fclebilir, h\u0131zl\u0131 ve g\u00fcvenilir testler yazma imkan\u0131 sundu.<\/p>\n<p>Stubbing'in en b\u00fcy\u00fck faydalar\u0131ndan biri, testlerinizin izolasyonunu sa\u011flamas\u0131d\u0131r. Ger\u00e7ek d\u00fcnya servislerine veya dosya sistemine olan ba\u011f\u0131ml\u0131l\u0131klar\u0131 ortadan kald\u0131rarak, beti\u011finizin i\u015f mant\u0131\u011f\u0131na odaklanman\u0131z\u0131 sa\u011flar. Ayr\u0131ca, hata senaryolar\u0131n\u0131 kolayca taklit edebilme yetene\u011fi, beti\u011finizin beklenmedik durumlara kar\u015f\u0131 ne kadar sa\u011flam oldu\u011funu anlaman\u0131za yard\u0131mc\u0131 olur. CI\/CD ortamlar\u0131nda ise, stubbing sayesinde testler \u00e7ok daha h\u0131zl\u0131 ko\u015far, maliyetler d\u00fc\u015fer ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri daha g\u00fcvenilir hale gelir. Bu da s\u00fcrekli entegrasyon ve da\u011f\u0131t\u0131m\u0131n temel prensiplerini g\u00fc\u00e7lendirir.<\/p>\n<p>\u00d6zetle, shell betiklerinizi bir sonraki seviyeye ta\u015f\u0131mak ve otomasyon s\u00fcre\u00e7lerinizde tam g\u00fcven kazanmak istiyorsan\u0131z, stubbing vazge\u00e7ilmez bir ara\u00e7t\u0131r. Geli\u015ftirme ya\u015fam d\u00f6ng\u00fcn\u00fcz\u00fcn her a\u015famas\u0131nda, daha iyi, daha h\u0131zl\u0131 ve daha g\u00fcvenilir testler yazmak i\u00e7in bu teknikleri benimsemenizi \u015fiddetle tavsiye ederiz. Unutmay\u0131n, test edilmemi\u015f kod, potansiyel bir problem kayna\u011f\u0131d\u0131r. Stubbing ile bu riskleri minimize edebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>Stubbing ve Mocking aras\u0131ndaki temel fark nedir?<\/dt>\n<dd><strong>Cevap:<\/strong> Stubbing, bir ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n belirli bir davran\u0131\u015f\u0131n\u0131 (\u00f6rne\u011fin, bir \u00e7\u0131kt\u0131 d\u00f6nd\u00fcrme) taklit ederken, mocking daha geli\u015fmi\u015f bir tekniktir. Mocking sadece davran\u0131\u015f taklidi yapmakla kalmaz, ayn\u0131 zamanda test edilen birimin bu ba\u011f\u0131ml\u0131l\u0131kla nas\u0131l etkile\u015fim kurdu\u011funu (hangi parametrelerle \u00e7a\u011fr\u0131ld\u0131\u011f\u0131, ka\u00e7 kez \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 vb.) da do\u011frular. Shell betiklerinde stubbing genellikle yeterli esnekli\u011fi sunar.<\/dd>\n<dt>Stub'lar\u0131m\u0131 nerede ve nas\u0131l saklamal\u0131y\u0131m?<\/dt>\n<dd><strong>Cevap:<\/strong> Stub'lar\u0131n\u0131z\u0131 genellikle test betiklerinizin yan\u0131nda, \u00f6zel bir dizinde (\u00f6rne\u011fin <code>test_stubs\/<\/code> veya <code>mocks\/<\/code>) saklaman\u0131z \u00f6nerilir. Bu, projenizin yap\u0131s\u0131n\u0131 d\u00fczenli tutar ve testlerinizi kolayca bulup y\u00f6netmenizi sa\u011flar. Her stub beti\u011fi, ilgili komutun ad\u0131yla (\u00f6rne\u011fin <code>curl<\/code> i\u00e7in <code>test_stubs\/curl<\/code>) kaydedilmelidir.<\/dd>\n<dt>Stubbing g\u00fcvenlik riski ta\u015f\u0131r m\u0131?<\/dt>\n<dd><strong>Cevap:<\/strong> Do\u011fru yap\u0131lmad\u0131\u011f\u0131nda evet. \u00d6zellikle <code>PATH<\/code> ortam de\u011fi\u015fkenini manip\u00fcle ederken dikkatli olunmal\u0131d\u0131r. Testler bittikten sonra <code>PATH<\/code>'i orijinal haline getirmek i\u00e7in <code>trap<\/code> komutunu kullanmak kritik \u00f6neme sahiptir. Ayr\u0131ca, stub betiklerinizi sadece g\u00fcvenilir kaynaklardan almal\u0131 ve potansiyel k\u00f6t\u00fc niyetli kod i\u00e7ermedi\u011finden emin olmal\u0131s\u0131n\u0131z. CI\/CD ortamlar\u0131nda, testlerin izole konteynerlerde \u00e7al\u0131\u015fmas\u0131 ek bir g\u00fcvenlik katman\u0131 sa\u011flar.<\/dd>\n<dt>Sadece <code>bash<\/code> i\u00e7in mi ge\u00e7erli bu teknikler, yoksa di\u011fer kabuklarda da kullanabilir miyim?<\/dt>\n<dd><strong>Cevap:<\/strong> Bu makalede g\u00f6sterilen <code>PATH<\/code> manip\u00fclasyonu ve fonksiyon ge\u00e7ersiz k\u0131lma gibi temel stubbing teknikleri, <code>sh<\/code> uyumlu t\u00fcm kabuklarda (<code>bash<\/code>, <code>zsh<\/code>, <code>ksh<\/code> gibi) benzer \u015fekillerde \u00e7al\u0131\u015f\u0131r. Sentaks farkl\u0131l\u0131klar\u0131 olabilir (\u00f6rne\u011fin <code>local<\/code> anahtar kelimesi <code>sh<\/code>'de bulunmazken <code>bash<\/code>'te vard\u0131r), ancak temel prensipler ayn\u0131d\u0131r. Bu sayede, farkl\u0131 kabuk ortamlar\u0131nda da betiklerinizi g\u00fcvenle test edebilirsiniz.<\/dd>\n<dt>T\u00fcm shell betiklerini stub'lamal\u0131 m\u0131y\u0131m?<\/dt>\n<dd><strong>Cevap:<\/strong> Hay\u0131r, t\u00fcm betikleri veya t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 stub'lamak zorunda de\u011filsiniz. Stubbing, genellikle yava\u015f, karars\u0131z, pahal\u0131 veya yan etkilere neden olabilecek d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar i\u00e7in kullan\u0131l\u0131r. Basit, izole edilmi\u015f ve d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olmayan betikler do\u011frudan test edilebilir. Stubbing'i, testlerinizin verimlili\u011fini ve g\u00fcvenilirli\u011fini en \u00e7ok art\u0131raca\u011f\u0131 yerlerde stratejik olarak kullanmal\u0131s\u0131n\u0131z.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, &#8216;stubbing&#8217; tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak&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":[1319],"tags":[],"class_list":{"0":"post-31457","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-powershell","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>Shell Betikleri Testinde Stubbing&#039;in G\u00fcc\u00fc<\/title>\n<meta name=\"description\" content=\"Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, &#039;stubbing&#039; tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak test s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ve daha g\u00fcvenilir hale getirebilece\u011finizi detayl\u0131ca a\u00e7\u0131kl\u0131yor.\" \/>\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\/shell-betikleri-testinde-stubbingin-gucu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Shell Betikleri Testinde Stubbing&#039;in G\u00fcc\u00fc\" \/>\n<meta property=\"og:description\" content=\"Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, &#039;stubbing&#039; tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak test s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ve daha g\u00fcvenilir hale getirebilece\u011finizi detayl\u0131ca a\u00e7\u0131kl\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T02:02:24+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=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Shell Betikleri Testinde Stubbing&#8217;in G\u00fcc\u00fc\",\"datePublished\":\"2025-10-10T02:02:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/\"},\"wordCount\":3762,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PowerShell\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/\",\"name\":\"Shell Betikleri Testinde Stubbing'in G\u00fcc\u00fc\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-10T02:02:24+00:00\",\"description\":\"Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, 'stubbing' tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak test s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ve daha g\u00fcvenilir hale getirebilece\u011finizi detayl\u0131ca a\u00e7\u0131kl\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Shell Betikleri Testinde Stubbing&#8217;in G\u00fcc\u00fc\"}]},{\"@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":"Shell Betikleri Testinde Stubbing'in G\u00fcc\u00fc","description":"Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, 'stubbing' tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak test s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ve daha g\u00fcvenilir hale getirebilece\u011finizi detayl\u0131ca a\u00e7\u0131kl\u0131yor.","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\/shell-betikleri-testinde-stubbingin-gucu\/","og_locale":"tr_TR","og_type":"article","og_title":"Shell Betikleri Testinde Stubbing'in G\u00fcc\u00fc","og_description":"Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, 'stubbing' tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak test s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ve daha g\u00fcvenilir hale getirebilece\u011finizi detayl\u0131ca a\u00e7\u0131kl\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-10T02:02:24+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Shell Betikleri Testinde Stubbing&#8217;in G\u00fcc\u00fc","datePublished":"2025-10-10T02:02:24+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/"},"wordCount":3762,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PowerShell"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/","url":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/","name":"Shell Betikleri Testinde Stubbing'in G\u00fcc\u00fc","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-10T02:02:24+00:00","description":"Shell betiklerini test etmek, \u00f6zellikle d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu oldu\u011funda zorlay\u0131c\u0131 olabilir. Bu makale, 'stubbing' tekni\u011finin g\u00fcc\u00fcn\u00fc kullanarak test s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilece\u011finizi ve daha g\u00fcvenilir hale getirebilece\u011finizi detayl\u0131ca a\u00e7\u0131kl\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/shell-betikleri-testinde-stubbingin-gucu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Shell Betikleri Testinde Stubbing&#8217;in G\u00fcc\u00fc"}]},{"@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\/31457","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=31457"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31457\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}