{"id":32185,"date":"2025-10-18T19:31:22","date_gmt":"2025-10-18T16:31:22","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/"},"modified":"2025-10-18T19:31:22","modified_gmt":"2025-10-18T16:31:22","slug":"modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/","title":{"rendered":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo&#8230;"},"content":{"rendered":"<p><span style=\"display: none;\">Jasmine ve GitHub Actions ile Test Otomasyonu: S\u00fcrekli Entegrasyon<\/span><br \/>\n<body><\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyonu ve s\u00fcrekli entegrasyon (CI) uygulamalar\u0131d\u0131r. Peki, JavaScript projelerinizde Jasmine testlerinizi GitHub Actions ile otomatikle\u015ftirerek geli\u015ftirme s\u00fcre\u00e7lerinizi nas\u0131l devrim niteli\u011finde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz? Bu kapsaml\u0131 rehber, bu soruya ad\u0131m ad\u0131m yan\u0131t veriyor ve size u\u00e7tan uca bir \u00e7\u00f6z\u00fcm sunuyor.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu geli\u015ftirme d\u00fcnyas\u0131nda, yaz\u0131l\u0131m projeleri s\u00fcrekli bir de\u011fi\u015fim ve geli\u015fim i\u00e7indedir. Yeni \u00f6zellikler eklenir, mevcut i\u015flevler iyile\u015ftirilir ve hatalar giderilir. Bu dinamik ortamda, uygulaman\u0131z\u0131n kalitesini korumak ve potansiyel sorunlar\u0131 erkenden tespit etmek hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte tam bu noktada test otomasyonu ve s\u00fcrekli entegrasyon (CI) devreye girer. Test otomasyonu, manuel olarak tekrarlanan test s\u00fcre\u00e7lerini otomatikle\u015ftirerek zamandan tasarruf etmenizi, insan hatas\u0131n\u0131 en aza indirmenizi ve testlerin \u00e7ok daha s\u0131k \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6zellikle birim testleri, kod taban\u0131n\u0131z\u0131n en k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z par\u00e7alar\u0131n\u0131 (fonksiyonlar, mod\u00fcller) do\u011frulamak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu testler, geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fcn en ba\u015f\u0131nda hatalar\u0131 yakalayarak, b\u00fcy\u00fck entegrasyon sorunlar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7er. Jasmine, JavaScript projeleri i\u00e7in pop\u00fcler bir davran\u0131\u015f odakl\u0131 geli\u015ftirme (BDD) test \u00e7er\u00e7evesi olup, anla\u015f\u0131l\u0131r s\u00f6zdizimi ve zengin \u00f6zellikleriyle test yazmay\u0131 keyifli hale getirir. Mocha veya Jest gibi di\u011fer pop\u00fcler \u00e7er\u00e7evelerle birlikte, Jasmine de geni\u015f bir geli\u015ftirici kitlesi taraf\u0131ndan benimsenmi\u015ftir. Do\u011frusu, JavaScript ekosistemindeki \u00e7e\u015fitlilik, her geli\u015ftiricinin kendi projesine en uygun arac\u0131 se\u00e7mesine olanak tan\u0131r. Jasmine&#8217;in sezgisel yap\u0131s\u0131, yeni ba\u015flayanlar i\u00e7in bile kolayca \u00f6\u011frenilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>S\u00fcrekli Entegrasyon (CI) ise, geli\u015ftiricilerin kod de\u011fi\u015fikliklerini ana dallar\u0131na (main\/master) s\u0131k s\u0131k entegre etmelerini te\u015fvik eden bir yaz\u0131l\u0131m geli\u015ftirme uygulamas\u0131d\u0131r. Her entegrasyon sonras\u0131nda, otomatik bir derleme ve test s\u00fcreci tetiklenir. Bu, entegrasyon sorunlar\u0131n\u0131n erken a\u015famalarda tespit edilmesini, hata ay\u0131klama s\u00fcrecinin k\u0131salmas\u0131n\u0131 ve daha istikrarl\u0131 bir kod taban\u0131n\u0131n s\u00fcrd\u00fcr\u00fclmesini sa\u011flar. Sonu\u00e7 olarak, CI, geli\u015ftirme ekiplerinin daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha kaliteli yaz\u0131l\u0131mlar sunmas\u0131na yard\u0131mc\u0131 olur. GitHub Actions, GitHub&#8217;\u0131n kendi i\u00e7inde bar\u0131nd\u0131rd\u0131\u011f\u0131 g\u00fc\u00e7l\u00fc bir CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) arac\u0131d\u0131r. Bu sayede, kodunuzu do\u011frudan depolad\u0131\u011f\u0131n\u0131z platformda otomatik testleri, derlemeleri ve da\u011f\u0131t\u0131mlar\u0131 yap\u0131land\u0131rabilirsiniz. GitHub Actions, YAML tabanl\u0131 i\u015f ak\u0131\u015flar\u0131 (workflows) ile olduk\u00e7a esnek ve \u00f6zelle\u015ftirilebilir bir yap\u0131 sunar. Dolay\u0131s\u0131yla, Jasmine testlerinizin GitHub Actions ile entegrasyonu, geli\u015ftirme s\u00fcre\u00e7lerinizde \u00f6nemli bir otomasyon katman\u0131 olu\u015fturacakt\u0131r.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: S\u00fcrekli Entegrasyon pratikleri, sadece hata bulmakla kalmaz, ayn\u0131 zamanda tak\u0131m i\u00e7i ileti\u015fimi art\u0131r\u0131r ve kod kalitesi standartlar\u0131n\u0131 y\u00fckseltir. Her ba\u015far\u0131l\u0131 CI d\u00f6ng\u00fcs\u00fc, geli\u015ftiricilerin \u00f6zg\u00fcvenini tazeler ve yeni \u00f6zellikler \u00fczerinde daha cesurca \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.\n    <\/div>\n<h2 id=\"jasmine-ile-javascript-birim-testleri-nasil-yazilir-ve-yonetilir\">Jasmine ile JavaScript Birim Testleri Nas\u0131l Yaz\u0131l\u0131r ve Y\u00f6netilir?<\/h2>\n<p>Jasmine, JavaScript uygulamalar\u0131 i\u00e7in temiz ve okunabilir bir s\u00f6zdizimi sunan davran\u0131\u015f odakl\u0131 bir test \u00e7er\u00e7evesidir. Geli\u015ftiricilerin, kodlar\u0131n\u0131n beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in test senaryolar\u0131 yazmas\u0131na olanak tan\u0131r. \u00d6ncelikle, Jasmine&#8217;i projenize dahil etmeniz gerekmektedir. Bir Node.js projeniz varsa, bunu npm arac\u0131l\u0131\u011f\u0131yla kolayca yapabilirsiniz. \u015e\u00fcphesiz, modern JavaScript projelerinin \u00e7o\u011fu zaten bir <code>package.json<\/code> dosyas\u0131na sahiptir.<\/p>\n<p>Jasmine&#8217;i kurmak i\u00e7in a\u015fa\u011f\u0131daki komutlar\u0131 kullanabilirsiniz:<\/p>\n<pre><code>\nnpm init -y\nnpm install --save-dev jasmine\n.\/node_modules\/.bin\/jasmine init\n    <\/pre>\n<p><\/code><\/p>\n<p>\u0130lk komut, projeniz i\u00e7in varsay\u0131lan bir <code>package.json<\/code> dosyas\u0131 olu\u015fturur. \u0130kinci komut Jasmine'i geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olarak kurar. Son komut ise Jasmine'in yap\u0131land\u0131rma dosyalar\u0131n\u0131 (<code>jasmine.json<\/code>) ve \u00f6rnek test klas\u00f6r\u00fcn\u00fc (<code>spec<\/code>) olu\u015fturur. Bu ad\u0131m, Jasmine test ortam\u0131n\u0131z\u0131n temelini atmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Bir Jasmine testi genellikle bir <code>describe<\/code> blo\u011fu ile ba\u015flar ve bu blok, test edilen birimin veya \u00f6zelli\u011fin ad\u0131n\u0131 i\u00e7erir. \u0130\u00e7erisinde, belirli senaryolar\u0131 veya davran\u0131\u015flar\u0131 a\u00e7\u0131klayan bir veya daha fazla <code>it<\/code> blo\u011fu bulunur. Her <code>it<\/code> blo\u011fu, test edilen belirli bir durumu ve beklenen sonucu tan\u0131mlar. \u00d6rne\u011fin, basit bir matematik fonksiyonu i\u00e7in test yazal\u0131m:<\/p>\n<pre><code>\n\/\/ src\/calculator.js\nfunction add(a, b) {\n    return a + b;\n}\n\nfunction subtract(a, b) {\n    return a - b;\n}\n\nmodule.exports = { add, subtract };\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu fonksiyonlar i\u00e7in <code>spec\/calculator.spec.js<\/code> ad\u0131nda bir test dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\n\/\/ spec\/calculator.spec.js\nconst calculator = require('..\/src\/calculator');\n\ndescribe('Calculator', () => {\n    it('should add two numbers correctly', () => {\n        expect(calculator.add(5, 3)).toBe(8);\n        expect(calculator.add(-1, 1)).toBe(0);\n        expect(calculator.add(0, 0)).toBe(0);\n    });\n\n    it('should subtract two numbers correctly', () => {\n        expect(calculator.subtract(10, 4)).toBe(6);\n        expect(calculator.subtract(5, 5)).toBe(0);\n        expect(calculator.subtract(0, 7)).toBe(-7);\n    });\n\n    it('should handle floating point numbers', () => {\n        expect(calculator.add(0.1, 0.2)).toBeCloseTo(0.3);\n    });\n});\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>describe('Calculator', ...)<\/code> blo\u011fu, <code>Calculator<\/code> mod\u00fcl\u00fc i\u00e7in testleri grupland\u0131r\u0131r. Her bir <code>it(...)<\/code> blo\u011fu belirli bir senaryoyu a\u00e7\u0131klar (\"iki say\u0131y\u0131 do\u011fru \u015fekilde toplamal\u0131d\u0131r\" gibi). <code>expect(...).toBe(...)<\/code> yap\u0131s\u0131, bir de\u011ferin beklenen bir de\u011ferle e\u015fle\u015fip e\u015fle\u015fmedi\u011fini kontrol eden bir \"e\u015fle\u015ftirici\" (matcher) kullan\u0131r. Jasmine, <code>toBe<\/code>, <code>toEqual<\/code>, <code>toBeDefined<\/code>, <code>toThrow<\/code> gibi bir\u00e7ok farkl\u0131 e\u015fle\u015ftirici sunar. <code>toBeCloseTo<\/code> ise kayan nokta say\u0131lar\u0131 i\u00e7in hassasiyetle kar\u015f\u0131la\u015ft\u0131rma yapar, bu da finansal hesaplamalar gibi alanlarda olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>Testlerinizi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>package.json<\/code> dosyan\u0131za bir betik (script) ekleyebilirsiniz:<\/p>\n<pre><code>\n\/\/ package.json\n{\n    \"name\": \"jasmine-github-actions-example\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Example project for Jasmine tests with GitHub Actions\",\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"test\": \"jasmine\",\n        \"test:watch\": \"jasmine --watch\"\n    },\n    \"keywords\": [],\n    \"author\": \"\",\n    \"license\": \"ISC\",\n    \"devDependencies\": {\n        \"jasmine\": \"^5.1.0\"\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Art\u0131k terminalinizde <code>npm test<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak t\u00fcm Jasmine testlerinizi \u00e7al\u0131\u015ft\u0131rabilirsiniz. Test sonu\u00e7lar\u0131, konsolda okunabilir bir formatta g\u00f6r\u00fcnt\u00fclenecektir. Bu temel kurulum ve test yazma prati\u011fi, otomasyon s\u00fcrecinin ilk ve en kritik ad\u0131m\u0131d\u0131r. Do\u011frusu, iyi yaz\u0131lm\u0131\u015f birim testleri olmadan herhangi bir CI\/CD sistemi anlams\u0131z kal\u0131r. Bu nedenle, test kapsam\u0131n\u0131z\u0131 art\u0131rmak ve kodunuzun her b\u00f6l\u00fcm\u00fcn\u00fc kapsayan testler yazmak, uzun vadede projenizin sa\u011fl\u0131\u011f\u0131 i\u00e7in \u00f6nemlidir.<\/p>\n<h2 id=\"github-actions-ile-surekli-entegrasyon-is-akis-yapi\">GitHub Actions ile S\u00fcrekli Entegrasyon \u0130\u015f Ak\u0131\u015flar\u0131 Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>GitHub Actions, do\u011frudan GitHub deponuzda yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcn\u00fcz\u00fc otomatikle\u015ftiren g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Kodunuzu derleyebilir, test edebilir, paketleyebilir, da\u011f\u0131tabilir ve hatta \u00f6zel bildirimler g\u00f6nderebilirsiniz. K\u0131sacas\u0131, s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) s\u00fcre\u00e7lerinizi y\u00f6netmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu b\u00f6l\u00fcm, GitHub Actions'\u0131n temel yap\u0131s\u0131n\u0131 ve nas\u0131l bir i\u015f ak\u0131\u015f\u0131 (workflow) olu\u015fturulaca\u011f\u0131n\u0131 a\u00e7\u0131klayacakt\u0131r.<\/p>\n<p>GitHub Actions i\u015f ak\u0131\u015flar\u0131, deponuzdaki <code>.github\/workflows<\/code> dizininde bulunan YAML dosyalar\u0131 olarak tan\u0131mlan\u0131r. Her bir YAML dosyas\u0131, belirli bir olaya (\u00f6rne\u011fin, bir push veya pull request) yan\u0131t olarak \u00e7al\u0131\u015facak bir dizi i\u015f (job) ve ad\u0131m (step) i\u00e7erir. Bu yap\u0131, geli\u015ftiricilere s\u00fcre\u00e7lerini inan\u0131lmaz derecede esnek bir \u015fekilde yap\u0131land\u0131rma imkan\u0131 sunar.<\/p>\n<p>Bir i\u015f ak\u0131\u015f\u0131 dosyas\u0131n\u0131n temel yap\u0131s\u0131 \u015fu \u015fekildedir:<\/p>\n<pre><code>\n# .github\/workflows\/main.yml\nname: CI\/CD Pipeline\n\non:\n  push:\n    branches:\n      - main\n      - develop\n  pull_request:\n    branches:\n      - main\n      - develop\n\njobs:\n  build_and_test:\n    name: Build & Test on Node.js ${{ matrix.node-version }}\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [18.x, 20.x] # Farkl\u0131 Node.js versiyonlar\u0131nda test et\n\n    steps:\n      - name: Git deposunu \u00e7ek\n        uses: actions\/checkout@v4\n\n      - name: Node.js ${{ matrix.node-version }} kur\n        uses: actions\/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n\n      - name: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle\n        run: npm ci\n\n      - name: Jasmine testlerini \u00e7al\u0131\u015ft\u0131r\n        run: npm test\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnek YAML dosyas\u0131n\u0131 detayland\u0131ral\u0131m:<\/p>\n<ul>\n<li><code>name<\/code>: \u0130\u015f ak\u0131\u015f\u0131n\u0131n g\u00f6r\u00fcnen ad\u0131d\u0131r. GitHub aray\u00fcz\u00fcnde bu isimle g\u00f6r\u00fcn\u00fcr.<\/li>\n<li><code>on<\/code>: \u0130\u015f ak\u0131\u015f\u0131n\u0131n ne zaman tetiklenece\u011fini belirtir. Burada, <code>main<\/code> veya <code>develop<\/code> dallar\u0131na yap\u0131lan <code>push<\/code>'larda veya bu dallara a\u00e7\u0131lan <code>pull_request<\/code>'lerde \u00e7al\u0131\u015faca\u011f\u0131 belirtilmi\u015ftir. Di\u011fer tetikleyiciler aras\u0131nda <code>schedule<\/code> (belirli aral\u0131klarla), <code>workflow_dispatch<\/code> (manuel tetikleme) ve <code>issue_comment<\/code> gibi se\u00e7enekler de bulunur.<\/li>\n<li><code>jobs<\/code>: \u0130\u015f ak\u0131\u015f\u0131n\u0131n i\u00e7indeki i\u015f gruplar\u0131n\u0131 tan\u0131mlar. Her i\u015f ba\u011f\u0131ms\u0131z olarak veya di\u011fer i\u015flere ba\u011fl\u0131 olarak \u00e7al\u0131\u015fabilir.<\/li>\n<li><code>build_and_test<\/code>: Bu, i\u015flerden birinin ad\u0131d\u0131r. Her i\u015fin kendine ait bir ad\u0131 ve yap\u0131land\u0131rmas\u0131 olmal\u0131d\u0131r.<\/li>\n<li><code>name<\/code> (job seviyesinde): Bu i\u015fin GitHub aray\u00fcz\u00fcnde g\u00f6r\u00fcnecek ad\u0131n\u0131 \u00f6zelle\u015ftirir.<\/li>\n<li><code>runs-on<\/code>: \u0130\u015fin hangi i\u015fletim sistemi \u00fczerinde \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. <code>ubuntu-latest<\/code>, <code>windows-latest<\/code> veya <code>macos-latest<\/code> gibi se\u00e7enekler mevcuttur. Bu, test ortam\u0131n\u0131z\u0131n kontrol\u00fcn\u00fc size verir.<\/li>\n<li><code>strategy<\/code>: Matrix stratejileri, ayn\u0131 i\u015fi farkl\u0131 konfig\u00fcrasyonlarla (\u00f6rne\u011fin, farkl\u0131 Node.js versiyonlar\u0131, i\u015fletim sistemleri) paralel olarak \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Bu sayede uygulaman\u0131z\u0131n farkl\u0131 ortamlardaki uyumlulu\u011funu test edebilirsiniz.<\/li>\n<li><code>steps<\/code>: Bir i\u015fin i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131lacak s\u0131ral\u0131 g\u00f6revleri tan\u0131mlar. Her ad\u0131m, belirli bir eylemi ger\u00e7ekle\u015ftirir.<\/li>\n<li><code>uses<\/code>: Topluluk taraf\u0131ndan olu\u015fturulmu\u015f veya GitHub taraf\u0131ndan sa\u011flanan bir \"action\"\u0131 kullan\u0131r. \u00d6rne\u011fin, <code>actions\/checkout@v4<\/code> deponuzu klonlar, <code>actions\/setup-node@v4<\/code> ise belirtilen Node.js versiyonunu kurar. Bu action'lar, genel g\u00f6revleri h\u0131zla yerine getirmenizi sa\u011flar.<\/li>\n<li><code>with<\/code>: Kullan\u0131lan action'a parametreler (girdi de\u011ferleri) iletmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>run<\/code>: Do\u011frudan terminal komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r. Burada <code>npm ci<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar y\u00fcklenir (<code>npm install<\/code>'a benzer ancak <code>package-lock.json<\/code>'\u0131 temel al\u0131r, bu da daha tutarl\u0131 buildler sa\u011flar) ve ard\u0131ndan <code>npm test<\/code> ile Jasmine testleri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/li>\n<\/ul>\n<p>GitHub Actions, sunucusuz bir model \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, her i\u015f ayr\u0131 bir sanal makinede y\u00fcr\u00fct\u00fcl\u00fcr ve i\u015f bittikten sonra bu sanal makine silinir. Bu sayede, testleriniz her zaman temiz bir ortamda \u00e7al\u0131\u015f\u0131r ve \u00f6nceki \u00e7al\u0131\u015ft\u0131rmalar\u0131n kal\u0131nt\u0131lar\u0131 sorun yaratmaz. Ayr\u0131ca, GitHub Actions, halka a\u00e7\u0131k depolarda \u00fccretsiz dakikalar sunarak a\u00e7\u0131k kaynak projeler i\u00e7in ideal bir \u00e7\u00f6z\u00fcm haline gelirken, \u00f6zel depolar i\u00e7in de rekabet\u00e7i fiyatland\u0131rma se\u00e7enekleri sunar. Sonu\u00e7 olarak, bu g\u00fc\u00e7l\u00fc altyap\u0131, geli\u015ftirme s\u00fcre\u00e7lerinizi otomatikle\u015ftirmek ve projelerinizin kalitesini s\u00fcrekli k\u0131lmak i\u00e7in m\u00fckemmel bir platform sunar.<\/p>\n<h2 id=\"adim-adim-uygulama-jasmine-testlerini-github-actions-ile-otomatikletirmek\">Ad\u0131m Ad\u0131m Uygulama: Jasmine Testlerini GitHub Actions ile Otomatikle\u015ftirmek<\/h2>\n<p>\u015eimdiye kadar Jasmine'in temellerini ve GitHub Actions'\u0131n genel yap\u0131s\u0131n\u0131 ele ald\u0131k. Bu b\u00f6l\u00fcmde, bu iki teknolojiyi bir araya getirerek, Jasmine testlerinizi GitHub Actions ile nas\u0131l otomatikle\u015ftirece\u011finizi ad\u0131m ad\u0131m uygulayaca\u011f\u0131z. Bu s\u00fcre\u00e7, projenizin her kod de\u011fi\u015fikli\u011finde testlerin otomatik olarak \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacak, b\u00f6ylece potansiyel hatalar\u0131 h\u0131zla tespit edip d\u00fczeltebileceksiniz. Bu, s\u00fcrekli entegrasyonun temel ta\u015flar\u0131ndan biridir.<\/p>\n<h3 id=\"projenizi-hazirlamak-jasmine-ve-test-scriptleri\">Projenizi Haz\u0131rlamak: Jasmine ve Test Scriptleri<\/h3>\n<p>\u00d6ncelikle, daha \u00f6nce bahsetti\u011fimiz gibi, projenizin Jasmine testlerini \u00e7al\u0131\u015ft\u0131rmaya haz\u0131r oldu\u011fundan emin olmal\u0131s\u0131n\u0131z. E\u011fer hen\u00fcz yapmad\u0131ysan\u0131z, projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak Jasmine'i kurun ve yap\u0131land\u0131r\u0131n:<\/p>\n<pre><code>\nnpm init -y\nnpm install --save-dev jasmine\n.\/node_modules\/.bin\/jasmine init\n    <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, <code>package.json<\/code> dosyan\u0131zda test scriptinizin do\u011fru ayarland\u0131\u011f\u0131ndan emin olun. Bu, GitHub Actions'\u0131n testleri nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131 belirleyecektir. \u00d6rne\u011fin:<\/p>\n<pre><code>\n\/\/ package.json\n{\n    \"name\": \"my-js-project\",\n    \"version\": \"1.0.0\",\n    \"description\": \"A simple JavaScript project with Jasmine tests\",\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"test\": \"jasmine\",\n        \"lint\": \"eslint .\"\n    },\n    \"keywords\": [],\n    \"author\": \"Your Name\",\n    \"license\": \"MIT\",\n    \"devDependencies\": {\n        \"jasmine\": \"^5.1.0\",\n        \"eslint\": \"^8.0.0\"\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>npm test<\/code> komutunu yerel ortam\u0131n\u0131zda \u00e7al\u0131\u015ft\u0131rarak testlerinizin sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. Bu \u00f6n do\u011frulama, GitHub Actions'ta kar\u015f\u0131la\u015fabilece\u011finiz olas\u0131 hatalar\u0131 en aza indirecektir. Ayr\u0131ca, testlerinizi <code>src<\/code> klas\u00f6r\u00fcndeki kodlar\u0131 i\u00e7erecek \u015fekilde d\u00fczenledi\u011finizden emin olun, b\u00f6ylece do\u011fru test kapsam\u0131n\u0131 sa\u011flars\u0131n\u0131z. Ek olarak, test klas\u00f6r\u00fcn\u00fcz\u00fcn (genellikle <code>spec<\/code>) do\u011fru \u015fekilde yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan emin olmak da \u00f6nemlidir. Aksi takdirde, Jasmine test dosyalar\u0131n\u0131 bulamayabilir.<\/p>\n<h3 id=\"github-actions-is-akisi-workflow-olusturmak\">GitHub Actions \u0130\u015f Ak\u0131\u015f\u0131 (Workflow) Olu\u015fturmak<\/h3>\n<p>\u015eimdi as\u0131l otomasyon k\u0131sm\u0131na ge\u00e7elim. GitHub deponuzun k\u00f6k dizininde <code>.github\/workflows\/<\/code> ad\u0131nda bir klas\u00f6r olu\u015fturun. Bu klas\u00f6r\u00fcn i\u00e7ine, \u00f6rne\u011fin <code>jasmine-ci.yml<\/code> ad\u0131nda bir YAML dosyas\u0131 olu\u015fturun. Bu dosya, GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131z\u0131 tan\u0131mlayacakt\u0131r.<\/p>\n<pre><code>\n# .github\/workflows\/jasmine-ci.yml\nname: Jasmine Testleri CI\n\non:\n  push:\n    branches:\n      - main\n      - develop\n  pull_request:\n    branches:\n      - main\n      - develop\n\njobs:\n  run_jasmine_tests:\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [18.x, 20.x] # Farkl\u0131 Node.js versiyonlar\u0131nda test et\n\n    steps:\n      - name: Kodu \u00c7ek\n        uses: actions\/checkout@v4\n\n      - name: Node.js ${{ matrix.node-version }} Kur\n        uses: actions\/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n\n      - name: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckle\n        run: npm ci\n\n      - name: Jasmine Testlerini \u00c7al\u0131\u015ft\u0131r\n        run: npm test\n\n      - name: Ba\u015far\u0131l\u0131 Test Mesaj\u0131\n        if: success()\n        run: echo \"T\u00fcm Jasmine testleri ba\u015far\u0131yla ge\u00e7ti! \ud83c\udf89\"\n\n      - name: Ba\u015far\u0131s\u0131z Test Mesaj\u0131\n        if: failure()\n        run: echo \"Baz\u0131 Jasmine testleri ba\u015far\u0131s\u0131z oldu. L\u00fctfen hatalar\u0131 kontrol edin. \u274c\"\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu YAML dosyas\u0131 \u015funlar\u0131 yapar:<\/p>\n<ul>\n<li><code>name: Jasmine Testleri CI<\/code>: \u0130\u015f ak\u0131\u015f\u0131n\u0131za a\u00e7\u0131klay\u0131c\u0131 bir ad verir.<\/li>\n<li><code>on: push \/ pull_request<\/code>: Kodunuz <code>main<\/code> veya <code>develop<\/code> dallar\u0131na itildi\u011finde veya bu dallara bir \u00e7ekme iste\u011fi (pull request) a\u00e7\u0131ld\u0131\u011f\u0131nda i\u015f ak\u0131\u015f\u0131n\u0131 tetikler. Bu, her kod de\u011fi\u015fikli\u011finin otomatik olarak test edilmesini garanti eder.<\/li>\n<li><code>jobs: run_jasmine_tests<\/code>: Tek bir i\u015f tan\u0131mlar. Bu i\u015f, Jasmine testlerini \u00e7al\u0131\u015ft\u0131rmaktan sorumludur.<\/li>\n<li><code>runs-on: ubuntu-latest<\/code>: \u0130\u015fin en son Ubuntu sanal makinesinde \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. GitHub Actions, farkl\u0131 i\u015fletim sistemleri ve donan\u0131m se\u00e7enekleri sunar.<\/li>\n<li><code>strategy: matrix: node-version: [18.x, 20.x]<\/code>: Testlerin hem Node.js 18.x hem de 20.x versiyonlar\u0131nda paralel olarak \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu, uygulaman\u0131z\u0131n farkl\u0131 Node.js ortamlar\u0131ndaki uyumlulu\u011funu test etmek i\u00e7in harikad\u0131r.<\/li>\n<li><code>steps<\/code>: \u0130\u015fin i\u00e7inde s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131lacak ad\u0131mlar\u0131 listeler.\n<ul>\n<li><code>Kodu \u00c7ek (actions\/checkout@v4)<\/code>: Deponuzdaki kodu GitHub Actions sanal makinesine klonlar.<\/li>\n<li><code>Node.js Kur (actions\/setup-node@v4)<\/code>: Belirtilen Node.js versiyonunu (matristen gelen) kurar.<\/li>\n<li><code>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckle (npm ci)<\/code>: <code>package-lock.json<\/code> dosyan\u0131z\u0131 kullanarak projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar. <code>npm install<\/code> yerine <code>npm ci<\/code> kullanmak, genellikle daha h\u0131zl\u0131 ve tutarl\u0131 build'ler sa\u011flar.<\/li>\n<li><code>Jasmine Testlerini \u00c7al\u0131\u015ft\u0131r (npm test)<\/code>: <code>package.json<\/code> dosyan\u0131zdaki <code>test<\/code> beti\u011fini \u00e7al\u0131\u015ft\u0131r\u0131r, bu da Jasmine testlerinizi ba\u015flat\u0131r.<\/li>\n<li><code>Ba\u015far\u0131l\u0131\/Ba\u015far\u0131s\u0131z Test Mesaj\u0131<\/code>: <code>if: success()<\/code> ve <code>if: failure()<\/code> ko\u015fullar\u0131yla, test sonu\u00e7lar\u0131na g\u00f6re farkl\u0131 mesajlar yazd\u0131r\u0131r. Bu, i\u015f ak\u0131\u015f\u0131 \u00f6zetinde test durumunu g\u00f6rsel olarak daha belirgin hale getirir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bu YAML dosyas\u0131n\u0131 GitHub deponuza ittikten sonra, her <code>push<\/code> veya <code>pull request<\/code> ile Jasmine testleriniz otomatik olarak \u00e7al\u0131\u015fmaya ba\u015flayacakt\u0131r. GitHub aray\u00fcz\u00fcnde \"Actions\" sekmesinden i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n ilerlemesini ve sonu\u00e7lar\u0131n\u0131 ger\u00e7ek zamanl\u0131 olarak takip edebilirsiniz. Bir testin ba\u015far\u0131s\u0131z olmas\u0131 durumunda, GitHub size bildirim g\u00f6nderecek (e\u011fer yap\u0131land\u0131rd\u0131ysan\u0131z) ve ba\u015far\u0131s\u0131z olan ad\u0131m\u0131 ve nedenini g\u00f6rebileceksiniz. Bu otomasyon, geli\u015ftirme ekibinizin daha h\u0131zl\u0131 geri bildirim almas\u0131n\u0131, hatalar\u0131 erkenden yakalamas\u0131n\u0131 ve daha g\u00fcvenilir kod teslim etmesini sa\u011flar. Ayr\u0131ca, her bir de\u011fi\u015fiklikten sonra tam bir regresyon testi paketi \u00e7al\u0131\u015ft\u0131rman\u0131n getirdi\u011fi y\u00fck\u00fc de ortadan kald\u0131r\u0131r. B\u00f6ylece, geli\u015ftiriciler ana odaklar\u0131n\u0131 kod yazmaya ve yeni \u00f6zellikler geli\u015ftirmeye ay\u0131rabilirler.<\/p>\n<h2 id=\"gelismis-senaryolar-ve-en-iyi-uygulamalar-test-raporlari-ve-paralel-calistirma\">Geli\u015fmi\u015f Senaryolar ve En \u0130yi Uygulamalar: Test Raporlar\u0131 ve Paralel \u00c7al\u0131\u015ft\u0131rma<\/h2>\n<p>Jasmine testlerini GitHub Actions ile otomatikle\u015ftirmek, geli\u015ftirme s\u00fcrecinizde b\u00fcy\u00fck bir ad\u0131md\u0131r. Ancak bu entegrasyonu daha da g\u00fc\u00e7l\u00fc hale getirecek geli\u015fmi\u015f teknikler ve en iyi uygulamalar bulunmaktad\u0131r. Bu b\u00f6l\u00fcmde, test raporlar\u0131n\u0131n olu\u015fturulmas\u0131, \u00f6nbellekleme (caching) stratejileri, matris stratejileriyle paralel \u00e7al\u0131\u015ft\u0131rma ve di\u011fer \u00f6nemli ipu\u00e7lar\u0131n\u0131 ele alaca\u011f\u0131z. Bu ileri d\u00fczey yakla\u015f\u0131mlar, CI\/CD pipeline'\u0131n\u0131z\u0131n performans\u0131n\u0131 ve verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<h3>Test Raporlar\u0131n\u0131 G\u00f6r\u00fcnt\u00fcleme ve Payla\u015fma<\/h3>\n<p>Testlerin sadece ge\u00e7ip ge\u00e7medi\u011fini bilmek yeterli olmayabilir. \u00d6zellikle b\u00fcy\u00fck projelerde, hangi testlerin ba\u015far\u0131s\u0131z oldu\u011funu, ne kadar s\u00fcrd\u00fc\u011f\u00fcn\u00fc ve test kapsam\u0131n\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde g\u00f6rmek istersiniz. Jasmine, bu t\u00fcr detayl\u0131 raporlar olu\u015fturmak i\u00e7in farkl\u0131 \"reporter\"lar kullanman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, JUnit XML format\u0131nda raporlar olu\u015fturarak bunlar\u0131 GitHub Actions'ta \"artifact\" olarak yay\u0131mlayabilir ve daha sonra CI\/CD ara\u00e7lar\u0131 veya di\u011fer sistemlerle entegre edebilirsiniz.<\/p>\n<p><code>jasmine-xml-reporter<\/code> gibi bir paket kurarak ba\u015flayabilirsiniz:<\/p>\n<pre><code>\nnpm install --save-dev jasmine-xml-reporter\n    <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, Jasmine yap\u0131land\u0131rma dosyan\u0131zda (genellikle <code>jasmine.json<\/code>) veya do\u011frudan test beti\u011finizde bu raporlay\u0131c\u0131y\u0131 kullanabilirsiniz. <code>package.json<\/code> i\u00e7indeki test scriptinizi rapor olu\u015fturacak \u015fekilde g\u00fcncelleyelim:<\/p>\n<pre><code>\n\/\/ package.json (eklenmi\u015f veya g\u00fcncellenmi\u015f k\u0131s\u0131m)\n{\n    \"scripts\": {\n        \"test\": \"jasmine JASMINE_CONFIG_PATH=spec\/support\/jasmine.json --reporter=jasmine-xml-reporter --out=test-results.xml\"\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Ve <code>.github\/workflows\/jasmine-ci.yml<\/code> dosyan\u0131za, olu\u015fturulan test raporunu bir \"artifact\" olarak y\u00fcklemek i\u00e7in bir ad\u0131m ekleyin:<\/p>\n<pre><code>\n# .github\/workflows\/jasmine-ci.yml (artifact y\u00fckleme ad\u0131m\u0131)\n...\n      - name: Jasmine Testlerini \u00c7al\u0131\u015ft\u0131r\n        run: npm test\n\n      - name: Test Raporlar\u0131n\u0131 Y\u00fckle\n        uses: actions\/upload-artifact@v4\n        if: always() # Testler ba\u015far\u0131s\u0131z olsa bile raporu y\u00fckle\n        with:\n          name: jasmine-test-results\n          path: test-results.xml\n...\n    <\/pre>\n<p><\/code><\/p>\n<p><code>actions\/upload-artifact<\/code> action'\u0131, i\u015f ak\u0131\u015f\u0131 tamamland\u0131\u011f\u0131nda dosyalar\u0131 kaydetmenizi sa\u011flar. Bu sayede, GitHub Actions aray\u00fcz\u00fcnden test raporlar\u0131n\u0131z\u0131 indirebilir ve inceleyebilirsiniz. <code>if: always()<\/code> ko\u015fulu, testler ba\u015far\u0131s\u0131z olsa bile raporlar\u0131n her zaman y\u00fcklenmesini sa\u011flar, bu da hata ay\u0131klama i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Test kapsam\u0131 raporlar\u0131 (code coverage) da s\u00fcrekli entegrasyonun \u00f6nemli bir par\u00e7as\u0131d\u0131r. Istanbul (nyc) gibi ara\u00e7lar\u0131 Jasmine ile entegre ederek, kodunuzun ne kadar\u0131n\u0131n testler taraf\u0131ndan kapsand\u0131\u011f\u0131n\u0131 \u00f6l\u00e7ebilir ve raporlayabilirsiniz. Bu sayede test stratejinizi daha bilin\u00e7li bir \u015fekilde geli\u015ftirebilirsiniz.\n    <\/div>\n<h3>Paralel \u00c7al\u0131\u015ft\u0131rma ve \u00d6nbellekleme (Caching) ile H\u0131z Optimizasyonu<\/h3>\n<p>B\u00fcy\u00fck projelerde binlerce test olabilir ve bunlar\u0131n tek tek \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 olduk\u00e7a zaman alabilir. GitHub Actions, bu sorunu \u00e7\u00f6zmek i\u00e7in matris stratejileri ve \u00f6nbellekleme gibi g\u00fc\u00e7l\u00fc \u00f6zellikler sunar.<\/p>\n<div class=\"mobile-first-tip\">\n        Mobil Uyumluluk \u0130pucu: Taray\u0131c\u0131lar aras\u0131 testler, \u00f6zellikle mobil cihazlar i\u00e7in \u00f6nemlidir. E\u011fer Jasmine testleriniz DOM manip\u00fclasyonu i\u00e7eriyorsa, GitHub Actions'ta headless Chrome (Karma ile) kullanarak farkl\u0131 ekran boyutlar\u0131 ve taray\u0131c\u0131 ortamlar\u0131nda test yapabilirsiniz. Bu, CSS medya sorgular\u0131n\u0131z\u0131n ve duyarl\u0131 tasar\u0131mlar\u0131n\u0131z\u0131n beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frular.\n    <\/div>\n<ul>\n<li>\n            <strong>Matris Stratejileriyle Paralel Testler<\/strong>: Daha \u00f6nce Node.js versiyonlar\u0131 i\u00e7in bahsetti\u011fimiz <code>strategy.matrix<\/code> \u00f6zelli\u011fini kullanarak testlerinizi farkl\u0131 Node.js versiyonlar\u0131 veya hatta farkl\u0131 test dosyalar\u0131 \u00fczerinde paralel olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u00d6rne\u011fin, testlerinizi birden fazla par\u00e7aya b\u00f6lebilir ve her par\u00e7ay\u0131 ayr\u0131 bir GitHub Actions i\u015finde paralel olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz. Bu, toplam test s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.\n        <\/li>\n<li>\n            <strong>Ba\u011f\u0131ml\u0131l\u0131k \u00d6nbellekleme<\/strong>: <code>npm install<\/code> veya <code>npm ci<\/code> ad\u0131m\u0131, her i\u015f ak\u0131\u015f\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131nda t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 yeniden indirmek anlam\u0131na gelir ki bu da zaman al\u0131c\u0131d\u0131r. GitHub Actions'\u0131n <code>actions\/cache@v4<\/code> action'\u0131n\u0131 kullanarak Node.js mod\u00fcllerini (<code>node_modules<\/code>) \u00f6nbelle\u011fe alabilir ve sonraki \u00e7al\u0131\u015ft\u0131rmalarda indirme s\u00fcresini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde k\u0131saltabilirsiniz.<\/p>\n<pre><code>\n# .github\/workflows\/jasmine-ci.yml (\u00f6nbellekleme ad\u0131m\u0131)\n...\n      - name: Kodu \u00c7ek\n        uses: actions\/checkout@v4\n\n      - name: \u00d6nbelle\u011fi Y\u00fckle (node_modules)\n        uses: actions\/cache@v4\n        with:\n          path: ~\/.npm\n          key: ${{ runner.os }}-node-${{ hashFiles('**\/package-lock.json') }}\n          restore-keys: |\n            ${{ runner.os }}-node-\n\n      - name: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckle\n        run: npm ci\n...\n            <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6nbellek ad\u0131m\u0131, <code>package-lock.json<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fine g\u00f6re bir anahtar olu\u015fturur. E\u011fer <code>package-lock.json<\/code> de\u011fi\u015fmediyse, \u00f6nbelle\u011fe al\u0131nm\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar geri y\u00fcklenir; aksi takdirde yeniden y\u00fcklenir. Bu sayede gereksiz indirme i\u015flemleri \u00f6nlenir.<\/p>\n<\/li>\n<\/ul>\n<p>Bu geli\u015fmi\u015f stratejiler, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde CI\/CD pipeline'\u0131n\u0131z\u0131n daha h\u0131zl\u0131 ve daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Her bir kod de\u011fi\u015fikli\u011finin h\u0131zl\u0131 bir \u015fekilde test edilmesi, geli\u015ftiricilerin geri bildirim d\u00f6ng\u00fcs\u00fcn\u00fc k\u0131salt\u0131r ve hatalar\u0131n \u00fcretim ortam\u0131na ula\u015fmadan \u00f6nce yakalanma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Sonu\u00e7 olarak, bu otomasyon s\u00fcre\u00e7leri, yaz\u0131l\u0131m kalitesini art\u0131rmakla kalmaz, ayn\u0131 zamanda geli\u015ftirici deneyimini de \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<h2 id=\"gercek-dunya-vaka-analizi-buyuk-olcekli-bir-uygulamada-otomasyonun-etkisi\">Ger\u00e7ek D\u00fcnya Vaka Analizi: B\u00fcy\u00fck \u00d6l\u00e7ekli Bir Uygulamada Otomasyonun Etkisi<\/h2>\n<p>Bir an i\u00e7in \"Y\u0131ld\u0131z Seyahatleri\" ad\u0131n\u0131 verdi\u011fimiz hayali bir e-ticaret platformunu ele alal\u0131m. Bu platform, milyonlarca kullan\u0131c\u0131s\u0131 olan, s\u00fcrekli yeni \u00f6zelliklerin eklendi\u011fi ve mevcut mod\u00fcllerin g\u00fcncellendi\u011fi b\u00fcy\u00fck bir JavaScript\/Node.js uygulamas\u0131d\u0131r. Ba\u015flang\u0131\u00e7ta, Y\u0131ld\u0131z Seyahatleri ekibi manuel test s\u00fcre\u00e7lerine ve nadiren \u00e7al\u0131\u015ft\u0131r\u0131lan CI sistemlerine g\u00fcveniyordu. Bu durum, geli\u015ftirme d\u00f6ng\u00fclerini yava\u015flat\u0131yor, s\u0131k s\u0131k \"\u00fcretimdeki hata\" raporlar\u0131na yol a\u00e7\u0131yor ve geli\u015ftiriciler aras\u0131nda kod entegrasyonu korkusu yarat\u0131yordu. Yeni bir \u00f6zellik geli\u015ftirildi\u011finde veya k\u00fc\u00e7\u00fck bir hata giderildi\u011finde bile, t\u00fcm sistemin kararl\u0131l\u0131\u011f\u0131ndan emin olmak haftalar s\u00fcren manuel testler gerektirebiliyordu. Bu durum, ekipleri inovasyon yerine hata ay\u0131klamaya odaklanmaya zorluyordu.<\/p>\n<p>Ekip, bu sorunlar\u0131 \u00e7\u00f6zmek i\u00e7in Jasmine birim testleri ve GitHub Actions tabanl\u0131 s\u00fcrekli entegrasyon pipeline'\u0131 kurmaya karar verdi. \u0130lk olarak, kritik mod\u00fcller i\u00e7in (\u00f6deme sistemi, kullan\u0131c\u0131 kimlik do\u011frulamas\u0131, sepet y\u00f6netimi) kapsaml\u0131 Jasmine birim testleri yaz\u0131ld\u0131. Ard\u0131ndan, her kod de\u011fi\u015fikli\u011finde bu testleri otomatik olarak \u00e7al\u0131\u015ft\u0131ran bir GitHub Actions i\u015f ak\u0131\u015f\u0131 yap\u0131land\u0131r\u0131ld\u0131. Bu, kodun ana dalla birle\u015ftirilmeden \u00f6nce testlerden ge\u00e7mesini zorunlu k\u0131ld\u0131.<\/p>\n<p>Otomasyonun getirdi\u011fi de\u011fi\u015fiklikler \u00e7arp\u0131c\u0131 oldu:<\/p>\n<ul>\n<li>\n            <strong>H\u0131zland\u0131r\u0131lm\u0131\u015f Geli\u015ftirme D\u00f6ng\u00fcs\u00fc:<\/strong> Geli\u015ftiriciler, kod de\u011fi\u015fikliklerini ittikten dakikalar sonra otomatik test sonu\u00e7lar\u0131n\u0131 alabiliyorlard\u0131. Bu, hatalar\u0131 an\u0131nda yakalamalar\u0131n\u0131 ve d\u00fczeltmelerini sa\u011flayarak, birle\u015ftirme \u00f6ncesi hata ay\u0131klama s\u00fcresini %60 oran\u0131nda azaltt\u0131.\n        <\/li>\n<li>\n            <strong>Azalan \u00dcretim Hatalar\u0131:<\/strong> Otomatik testlerin devreye girmesiyle birlikte, \u00fcretim ortam\u0131na ula\u015fan hata say\u0131s\u0131 %40 d\u00fc\u015ft\u00fc. \u00d6zellikle entegrasyon kaynakl\u0131 sorunlar, CI pipeline'\u0131nda erkenden tespit edildi.\n        <\/li>\n<li>\n            <strong>Geli\u015fmi\u015f Kod Kalitesi:<\/strong> Test kapsam\u0131 raporlar\u0131 sayesinde ekip, kodlar\u0131n\u0131n hangi b\u00f6lgelerinin yeterince test edilmedi\u011fini g\u00f6rebildi ve bu alanlara odaklanarak genel kod kalitesini art\u0131rd\u0131. Ayr\u0131ca, herkesin ayn\u0131 standartlarda test yazmas\u0131, kod incelemelerini de kolayla\u015ft\u0131rd\u0131.\n        <\/li>\n<li>\n            <strong>Artan Geli\u015ftirici G\u00fcveni:<\/strong> Geli\u015ftiriciler, yapt\u0131klar\u0131 de\u011fi\u015fikliklerin mevcut sistem \u00fczerinde olumsuz bir etki yaratmayaca\u011f\u0131ndan daha emindiler. Bu g\u00fcven, yeni \u00f6zelliklerin daha h\u0131zl\u0131 ve daha cesurca geli\u015ftirilmesine olanak tan\u0131d\u0131, inovasyonu te\u015fvik etti.\n        <\/li>\n<li>\n            <strong>Paralel Geli\u015ftirme Yetene\u011fi:<\/strong> Matris stratejileriyle, farkl\u0131 Node.js versiyonlar\u0131 ve test par\u00e7alar\u0131 \u00fczerinde paralel testler \u00e7al\u0131\u015ft\u0131r\u0131larak, toplam test s\u00fcresi \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131ld\u0131. 15 dakikay\u0131 bulan t\u00fcm test paketi \u00e7al\u0131\u015ft\u0131rma s\u00fcresi, 5 dakikaya indirildi.\n        <\/li>\n<\/ul>\n<p>Y\u0131ld\u0131z Seyahatleri \u00f6rne\u011fi, Jasmine testleri ve GitHub Actions'\u0131n birlikte nas\u0131l bir sinerji yaratabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6steriyor. Ba\u015flang\u0131\u00e7taki yat\u0131r\u0131m, uzun vadede zaman tasarrufu, maliyet azalmas\u0131, daha y\u00fcksek kaliteli yaz\u0131l\u0131m ve daha mutlu bir geli\u015ftirme ekibi olarak geri d\u00f6nd\u00fc. Bu vaka analizi, sadece teorik bilginin \u00f6tesine ge\u00e7erek, ger\u00e7ek bir projenin nas\u0131l olumlu y\u00f6nde etkilenebilece\u011fini g\u00f6zler \u00f6n\u00fcne seriyor. K\u00fc\u00e7\u00fck veya b\u00fcy\u00fck, her \u00f6l\u00e7ekteki proje i\u00e7in test otomasyonu ve s\u00fcrekli entegrasyonun faydalar\u0131 yads\u0131namaz. Bu sistemler, adeta projenizin arka plan\u0131ndaki g\u00f6r\u00fcnmez kahramanlar gibi \u00e7al\u0131\u015farak, kalitenizi s\u00fcrekli y\u00fcksek tutar.<\/p>\n<h2 id=\"sonuc-gelistirme-sureclerinizi-donusturun-ve-sikca-sorulan-sorular\">Sonu\u00e7: Geli\u015ftirme S\u00fcre\u00e7lerinizi D\u00f6n\u00fc\u015ft\u00fcr\u00fcn ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 makale boyunca, Jasmine testlerini GitHub Actions ile otomatikle\u015ftirmenin inceliklerini derinlemesine ele ald\u0131k. Geli\u015ftirme s\u00fcre\u00e7lerinde test otomasyonu ve s\u00fcrekli entegrasyonun neden bu kadar kritik oldu\u011funu, Jasmine ile etkili birim testleri yazman\u0131n temellerini ve GitHub Actions ile sa\u011flam CI\/CD i\u015f ak\u0131\u015flar\u0131 olu\u015fturman\u0131n ad\u0131m ad\u0131m yollar\u0131n\u0131 \u00f6\u011frendik. Ayr\u0131ca, test raporlama, \u00f6nbellekleme ve paralel \u00e7al\u0131\u015ft\u0131rma gibi geli\u015fmi\u015f tekniklerle performans\u0131 nas\u0131l optimize edebilece\u011finizi inceledik. Y\u0131ld\u0131z Seyahatleri vaka analizi ise, bu pratiklerin ger\u00e7ek d\u00fcnya projelerine sa\u011flad\u0131\u011f\u0131 somut faydalar\u0131 g\u00f6zler \u00f6n\u00fcne serdi.<\/p>\n<p>Jasmine ve GitHub Actions ikilisi, geli\u015ftirme ekiplerine daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha kaliteli yaz\u0131l\u0131mlar sunma yetene\u011fi kazand\u0131r\u0131r. Kod de\u011fi\u015fikliklerinin otomatik olarak test edilmesi, hatalar\u0131n erken a\u015famada yakalanmas\u0131n\u0131 sa\u011flar, bu da hata ay\u0131klama maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve \u00fcretim ortam\u0131na ula\u015fan sorunlar\u0131 en aza indirir. Dahas\u0131, otomatik testler sayesinde geli\u015ftiriciler, kodlar\u0131nda daha g\u00fcvenle de\u011fi\u015fiklik yapabilir, b\u00f6ylece inovasyon ve verimlilik artar. Unutmay\u0131n ki, s\u00fcrekli entegrasyon sadece bir ara\u00e7 seti de\u011fil, ayn\u0131 zamanda yaz\u0131l\u0131m geli\u015ftirme k\u00fclt\u00fcr\u00fcn\u00fcn ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Bu uygulamalar\u0131 benimsemek, ekibinizin \u00e7evikli\u011fini art\u0131racak ve modern yaz\u0131l\u0131m m\u00fchendisli\u011finin temelini olu\u015fturacakt\u0131r. Dolay\u0131s\u0131yla, bug\u00fcn att\u0131\u011f\u0131n\u0131z bu otomasyon ad\u0131mlar\u0131, yar\u0131n \u00e7ok daha sa\u011flam ve s\u00fcrd\u00fcr\u00fclebilir bir geli\u015ftirme s\u00fcrecinin kap\u0131lar\u0131n\u0131 aralayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n            <strong>Jasmine yerine ba\u015fka bir test framework'\u00fc kullanabilir miyim?<\/strong><\/p>\n<p>Evet, kesinlikle. GitHub Actions, Node.js tabanl\u0131 herhangi bir test framework'\u00fc (\u00f6rne\u011fin Jest, Mocha) ile \u00e7al\u0131\u015fabilir. \u00d6nemli olan, <code>package.json<\/code> dosyan\u0131zda testleri \u00e7al\u0131\u015ft\u0131ran bir beti\u011fin (genellikle <code>\"test\": \"your-test-command\"<\/code>) tan\u0131ml\u0131 olmas\u0131d\u0131r. GitHub Actions, bu beti\u011fi \u00e7a\u011f\u0131rarak testlerinizi \u00e7al\u0131\u015ft\u0131racakt\u0131r. \u0130\u015f ak\u0131\u015f\u0131 ad\u0131mlar\u0131n\u0131 buna g\u00f6re ayarlaman\u0131z yeterlidir.<\/p>\n<\/li>\n<li>\n            <strong>GitHub Actions \u00fccretsiz mi?<\/strong><\/p>\n<p>GitHub Actions, halka a\u00e7\u0131k (public) depolar i\u00e7in \u00fccretsizdir ve belirli bir kullan\u0131m s\u0131n\u0131r\u0131na kadar \u00f6zel (private) depolar i\u00e7in de \u00fccretsiz dakikalar sunar. S\u0131n\u0131rlar\u0131 a\u015fan kullan\u0131m i\u00e7in ek \u00fccretler ge\u00e7erlidir. Genellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in \u00fccretsiz katman yeterli olmaktad\u0131r.<\/p>\n<\/li>\n<li>\n            <strong>Test sonu\u00e7lar\u0131n\u0131 GitHub aray\u00fcz\u00fcnde nas\u0131l g\u00f6rselle\u015ftirebilirim?<\/strong><\/p>\n<p>JUnit XML format\u0131nda test raporlar\u0131 olu\u015fturup bunlar\u0131 GitHub Actions'ta bir \"artifact\" olarak y\u00fckleyebilirsiniz. Baz\u0131 GitHub Marketplace action'lar\u0131 veya \u00fc\u00e7\u00fcnc\u00fc taraf entegrasyonlar, bu XML raporlar\u0131n\u0131 ayr\u0131\u015ft\u0131rarak daha g\u00f6rsel ve etkile\u015fimli raporlar sunabilir. Ayr\u0131ca, GitHub'\u0131n kendi \"Checks\" \u00f6zelli\u011fi, do\u011frudan PR sayfas\u0131nda test sonu\u00e7lar\u0131n\u0131 \u00f6zetleyebilir.<\/p>\n<\/li>\n<li>\n            <strong>Sadece bir dala push yap\u0131ld\u0131\u011f\u0131nda de\u011fil, her PR a\u00e7\u0131ld\u0131\u011f\u0131nda testleri \u00e7al\u0131\u015ft\u0131rmak istiyorum. Nas\u0131l yapar\u0131m?<\/strong><\/p>\n<p>\u0130\u015f ak\u0131\u015f\u0131 YAML dosyan\u0131z\u0131n <code>on:<\/code> b\u00f6l\u00fcm\u00fcn\u00fc \u015fu \u015fekilde g\u00fcncelleyebilirsiniz:<\/p>\n<pre><code>\non:\n  push:\n    branches:\n      - main\n      - develop\n  pull_request:\n    branches:\n      - main\n      - develop\n            <\/pre>\n<p><\/code><br \/>\n            Bu yap\u0131land\u0131rma, hem belirli dallara yap\u0131lan <code>push<\/code>'larda hem de bu dallara a\u00e7\u0131lan <code>pull_request<\/code>'lerde testlerin \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu sayede, kod birle\u015ftirilmeden \u00f6nce her zaman test edilmi\u015f olur.<\/p>\n<\/li>\n<li>\n            <strong>Taray\u0131c\u0131 tabanl\u0131 Jasmine testlerimi GitHub Actions'ta nas\u0131l \u00e7al\u0131\u015ft\u0131r\u0131r\u0131m?<\/strong><\/p>\n<p>Taray\u0131c\u0131 tabanl\u0131 Jasmine testleri i\u00e7in Karma Test Runner'\u0131 kullanabilir ve bunu headless Chrome ile GitHub Actions ortam\u0131nda \u00e7al\u0131\u015ft\u0131rabilirsiniz. Karma yap\u0131land\u0131rman\u0131za headless Chrome'u ekledikten sonra, GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131zda Karma'y\u0131 \u00e7al\u0131\u015ft\u0131ran bir betik tan\u0131mlaman\u0131z yeterlidir. Bu, sanal bir taray\u0131c\u0131 ortam\u0131nda testlerinizi \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Jasmine ve GitHub Actions ile Test Otomasyonu: S\u00fcrekli Entegrasyon Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz&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-32185","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>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo...<\/title>\n<meta name=\"description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyonu ve s\u00fcrekli entegrasyon (CI) uygulamalar\u0131d\u0131r. Peki, JavaScript projelerinizde Jasmine testlerinizi GitHub Actions ile otomatikle\u015ftirerek geli\u015ftirme s\u00fcre\u00e7lerinizi nas\u0131l devrim niteli\u011finde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz? Bu kapsaml\u0131 rehber, bu soruya ad\u0131m ad\u0131m yan\u0131t veriyor ve size u\u00e7tan uca bir \u00e7\u00f6z\u00fcm sunuyor.\" \/>\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\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo...\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyonu ve s\u00fcrekli entegrasyon (CI) uygulamalar\u0131d\u0131r. Peki, JavaScript projelerinizde Jasmine testlerinizi GitHub Actions ile otomatikle\u015ftirerek geli\u015ftirme s\u00fcre\u00e7lerinizi nas\u0131l devrim niteli\u011finde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz? Bu kapsaml\u0131 rehber, bu soruya ad\u0131m ad\u0131m yan\u0131t veriyor ve size u\u00e7tan uca bir \u00e7\u00f6z\u00fcm sunuyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-18T16:31:22+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=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo&#8230;\",\"datePublished\":\"2025-10-18T16:31:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/\"},\"wordCount\":4186,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/\",\"name\":\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo...\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-18T16:31:22+00:00\",\"description\":\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyonu ve s\u00fcrekli entegrasyon (CI) uygulamalar\u0131d\u0131r. Peki, JavaScript projelerinizde Jasmine testlerinizi GitHub Actions ile otomatikle\u015ftirerek geli\u015ftirme s\u00fcre\u00e7lerinizi nas\u0131l devrim niteli\u011finde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz? Bu kapsaml\u0131 rehber, bu soruya ad\u0131m ad\u0131m yan\u0131t veriyor ve size u\u00e7tan uca bir \u00e7\u00f6z\u00fcm sunuyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo&#8230;\"}]},{\"@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":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo...","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyonu ve s\u00fcrekli entegrasyon (CI) uygulamalar\u0131d\u0131r. Peki, JavaScript projelerinizde Jasmine testlerinizi GitHub Actions ile otomatikle\u015ftirerek geli\u015ftirme s\u00fcre\u00e7lerinizi nas\u0131l devrim niteli\u011finde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz? Bu kapsaml\u0131 rehber, bu soruya ad\u0131m ad\u0131m yan\u0131t veriyor ve size u\u00e7tan uca bir \u00e7\u00f6z\u00fcm sunuyor.","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\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/","og_locale":"tr_TR","og_type":"article","og_title":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo...","og_description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyonu ve s\u00fcrekli entegrasyon (CI) uygulamalar\u0131d\u0131r. Peki, JavaScript projelerinizde Jasmine testlerinizi GitHub Actions ile otomatikle\u015ftirerek geli\u015ftirme s\u00fcre\u00e7lerinizi nas\u0131l devrim niteli\u011finde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz? Bu kapsaml\u0131 rehber, bu soruya ad\u0131m ad\u0131m yan\u0131t veriyor ve size u\u00e7tan uca bir \u00e7\u00f6z\u00fcm sunuyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-18T16:31:22+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo&#8230;","datePublished":"2025-10-18T16:31:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/"},"wordCount":4186,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/","url":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/","name":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo...","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-18T16:31:22+00:00","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyonu ve s\u00fcrekli entegrasyon (CI) uygulamalar\u0131d\u0131r. Peki, JavaScript projelerinizde Jasmine testlerinizi GitHub Actions ile otomatikle\u015ftirerek geli\u015ftirme s\u00fcre\u00e7lerinizi nas\u0131l devrim niteli\u011finde d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz? Bu kapsaml\u0131 rehber, bu soruya ad\u0131m ad\u0131m yan\u0131t veriyor ve size u\u00e7tan uca bir \u00e7\u00f6z\u00fcm sunuyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/modern-yazilim-gelistirme-sureclerinde-kalitenin-ve-hizin-anahtari-suphesiz-test-otomasyo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kalitenin ve h\u0131z\u0131n anahtar\u0131, \u015f\u00fcphesiz test otomasyo&#8230;"}]},{"@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\/32185","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=32185"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32185\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}