{"id":3881,"date":"2021-12-01T19:19:36","date_gmt":"2021-12-01T18:19:36","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=3881"},"modified":"2021-12-01T22:51:27","modified_gmt":"2021-12-01T21:51:27","slug":"calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/","title":{"rendered":".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek"},"content":{"rendered":"<\/p>\r\n\r\n<p>Code coverage metri\u011fi, projemizin sa\u011fl\u0131kl\u0131 ve g\u00fcvenilir oldu\u011fu ve ayr\u0131ca de\u011fi\u015fimlere kar\u015f\u0131 ne derece h\u0131zl\u0131 ayak uydurabilece\u011fimizin \u00f6nemli bir g\u00f6stergesidir.<\/p>\r\n\r\n\r\n\r\n<p>Code coverage temelinde, yazm\u0131\u015f oldu\u011fumuz kod sat\u0131rlar\u0131n\u0131n ne kadar\u0131n\u0131n test yaz\u0131larak do\u011fruland\u0131\u011f\u0131n\u0131 belirlemektedir. Tabii ki burada sadece code coverage metri\u011fini artt\u0131rabilmek i\u00e7in yazabilece\u011fimiz happy-path test senaryolar\u0131ndan bahsetmiyoruz. \u00c7\u00fcnk\u00fc code coverage metri\u011finin %100 olmas\u0131, t\u00fcm edge case&#8217;leri cover etti\u011fimiz anlam\u0131na gelmiyor maalesef. Kolay maintain edilebilir ve s\u00fcrd\u00fcr\u00fclebilir bir \u00fcr\u00fcn i\u00e7in, olabildi\u011fince t\u00fcm functional senaryolar\u0131 her a\u00e7\u0131dan unit test&#8217;ler yazarak cover ediyor olmam\u0131z gerekmektedir.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\">\r\n<figure class=\"aligncenter\"><a href=\"\/wp-content\/uploads\/2021\/10\/test-green.jpeg\"><img decoding=\"async\" width=\"1200\" height=\"1035\" class=\"wp-image-3885 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/10\/test-green.jpeg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/10\/test-green.jpeg 1200w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/10\/test-green-300x259.jpeg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/10\/test-green-1024x883.jpeg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/10\/test-green-768x662.jpeg 768w\" data-sizes=\"(max-width: 1200px) 100vw, 1200px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1200px; --smush-placeholder-aspect-ratio: 1200\/1035;\" \/><\/a>\r\n<figcaption>https:\/\/geek-and-poke.com\/geekandpoke\/2017\/2\/18\/50-shades-part-2<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Ayr\u0131ca unit test&#8217;lere sahip olmak, otomatik olarak bizleri daha <strong>clean<\/strong> ve <strong>loosely coupled<\/strong> bir codebase&#8217;ine sahip olmaya do\u011fru da itmektedir. \u00c7\u00fcnk\u00fc unit test&#8217;ini yazaca\u011f\u0131m\u0131z bir function\/method her ne kadar b\u00fcy\u00fck ve kompleks ise, test&#8217;ini yazabilmek de bi o kadar zorlay\u0131c\u0131 ve kompleks olacakt\u0131r.<\/p>\r\n\r\n\r\n\r\n<p>Code coverage metrikleri ile birlikte de unit test&#8217;ler yazarken g\u00f6z\u00fcm\u00fczden ka\u00e7an \u00f6nemli kod blok&#8217;lar\u0131n\u0131 belirleyebilir, onlar\u0131 da test yazarak cover edebiliriz.<\/p>\r\n\r\n\r\n\r\n<p>Ayr\u0131ca ilgili ekipler i\u00e7erisinde baz\u0131 code coverage kurallar\u0131 da belirleyerek unit test yazma k\u00fclt\u00fcr\u00fcn\u00fc de sa\u011flayabilir, ilgili projeler \u00fczerindeki g\u00fcven oranlar\u0131m\u0131z\u0131 da artt\u0131rabiliriz.<\/p>\r\n\r\n\r\n\r\n<p>Bu makale kapsam\u0131nda ise k\u0131saca <em><strong>.NET<\/strong><\/em> uygulamalar\u0131m\u0131z i\u00e7in <strong>code coverage&#8217;\u0131<\/strong> nas\u0131l hesaplayabilece\u011fimizi ve <em><strong>Azure DevOps<\/strong><\/em> \u00fczerinde <strong>Continuous Integration\u00a0<\/strong>s\u00fcre\u00e7lerimize nas\u0131l entegre edebilece\u011fimizi g\u00f6stermeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Code Coverage<\/h2>\r\n\r\n\r\n\r\n<p>Code coverage&#8217;\u0131 hesaplayabilmek i\u00e7in cross-platform code coverage framework&#8217;\u00fc olan <strong>coverlet&#8217;i<\/strong> kullanaca\u011f\u0131z. Coverlet, <em><strong>.NET Core<\/strong><\/em> ve <em><strong>.NET 5<\/strong><\/em> <strong>xUnit<\/strong> <strong>Test <\/strong>projeleri i\u00e7in default <strong>VSTest<\/strong> entegre <strong>data collector<\/strong> olarak gelmektedir.<\/p>\r\n\r\n\r\n\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n<p>Data collector&#8217;ler test execution i\u015flemleri s\u0131ras\u0131nda code coverage metriklerinin toplanmas\u0131 gibi farkl\u0131 monitoring i\u015flemlerini ger\u00e7ekle\u015ftirmektedirler.<\/p>\r\n<\/blockquote>\r\n\r\n\r\n\r\n<p>Code coverage metriklerini toplayabilmek i\u00e7in tek yapmam\u0131z gereken, <em>&#8211;collect=&#8221;XPlat Code Coverage<\/em>&#8221;\u00a0parametresi ile <strong>dotnet test<\/strong> i\u015flemini \u00e7al\u0131\u015ft\u0131rmak.<\/p>\r\n\r\n\r\n\r\n<p>\u00d6rnek ama\u00e7l\u0131 olu\u015fturdu\u011fum test projesi \u00fczerinde (buradan ula\u015fabilece\u011finiz) code coverage metriklerini toplayabilmek i\u00e7in yukar\u0131daki komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131mda, coverlet a\u015fa\u011f\u0131daki gibi default format\u0131 olan <strong>Cobertura<\/strong> format\u0131nda metrikleri toplamaktad\u0131r.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><a href=\"\/wp-content\/uploads\/2021\/11\/cobertura-dotnet5.jpg\"><img decoding=\"async\" width=\"1024\" height=\"247\" class=\"wp-image-3894 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/11\/cobertura-dotnet5-1024x247.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/cobertura-dotnet5-1024x247.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/cobertura-dotnet5-300x72.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/cobertura-dotnet5-768x185.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/cobertura-dotnet5.jpg 1229w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/247;\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<p>Ayr\u0131ca a\u015fa\u011f\u0131daki gibi <em>coverlet.runsettings<\/em> isminde bir dosyaya sahip olarak, metrik toplama i\u015flemini \u00f6zelle\u015ftirebilmek de m\u00fcmk\u00fcnd\u00fcr.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?&gt;\r\n&lt;RunSettings&gt;\r\n  &lt;DataCollectionRunSettings&gt;\r\n    &lt;DataCollectors&gt;\r\n      &lt;DataCollector friendlyName=\"XPlat Code Coverage\"&gt;\r\n        &lt;Configuration&gt;\r\n          &lt;Format&gt;cobertura&lt;\/Format&gt;\r\n          &lt;ExcludeByFile&gt;**\/MyTodoApp.API\/Startup.cs&lt;\/ExcludeByFile&gt;\r\n        &lt;\/Configuration&gt;\r\n      &lt;\/DataCollector&gt;\r\n    &lt;\/DataCollectors&gt;\r\n  &lt;\/DataCollectionRunSettings&gt;\r\n&lt;\/RunSettings&gt;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>dotnet test --settings coverlet.runsettings<\/code><\/pre>\r\n\r\n\r\n\r\n<p>\u00d6rne\u011fin yukar\u0131daki configuration ile &#8220;<em>MyTodoApp.API<\/em>&#8221; klas\u00f6r\u00fc alt\u0131ndaki &#8220;<em>Startup.cs<\/em>&#8221; dosyas\u0131n\u0131n code coverage metri\u011fi i\u00e7in dikkate al\u0131nmamas\u0131n\u0131 ve metrik format\u0131n\u0131n &#8220;<em>cobertura<\/em>&#8221; format\u0131nda olmas\u0131n\u0131 sa\u011flad\u0131k.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Azure Pipeline<\/h2>\r\n\r\n\r\n\r\n<p><em>Azure<\/em> \u00fczerinde <em>CI<\/em> s\u00fcre\u00e7lerimize code coverage ve test sonu\u00e7lar\u0131n\u0131 dahil edebilmek i\u00e7in, a\u015fa\u011f\u0131daki gibi basit bir pipeline olu\u015ftural\u0131m.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code># Starter pipeline\r\n# Start with a minimal pipeline that you can customize to build and deploy your code.\r\n# Add steps that build, run tests, deploy, and more:\r\n# https:\/\/aka.ms\/yaml\r\n\r\ntrigger:\r\n- master\r\n\r\npool:\r\n  vmImage: ubuntu-latest\r\n  \r\nvariables:\r\n  testProjectName: 'MyTodoApp.Tests'\r\n\r\nsteps:\r\n- task: DotNetCoreCLI@2\r\n  displayName: \"Run dotnet restore\"\r\n  inputs:\r\n    command: 'restore'\r\n    projects: '**\/$(testProjectName).csproj'\r\n- task: DotNetCoreCLI@2\r\n  displayName: \"Run dotnet test\"\r\n  inputs:\r\n    command: 'test'\r\n    projects: '**\/$(testProjectName).csproj'\r\n    publishTestResults: false\r\n    arguments: '--settings $(Build.Repository.LocalPath)\/$(testProjectName)\/coverlet.runsettings --logger trx'\r\n- task: PublishTestResults@2\r\n  displayName: \"Publish test results\"\r\n  inputs:\r\n    testResultsFormat: 'VSTest'\r\n    testResultsFiles: '$(System.DefaultWorkingDirectory)\/$(testProjectName)\/TestResults\/**\/*.trx'\r\n- task: PublishCodeCoverageResults@1\r\n  displayName: \"Publish code coverage results\"\r\n  inputs:\r\n    codeCoverageTool: 'Cobertura'\r\n    summaryFileLocation: '$(System.DefaultWorkingDirectory)\/$(testProjectName)\/TestResults\/*\/coverage.cobertura.xml'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Bu pipeline tan\u0131mlamas\u0131nda,<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- task: DotNetCoreCLI@2\r\n  displayName: \"Run dotnet test\"\r\n  inputs:\r\n    command: 'test'\r\n    projects: '**\/$(testProjectName).csproj'\r\n    publishTestResults: false\r\n    arguments: '--settings $(Build.Repository.LocalPath)\/$(testProjectName)\/coverlet.runsettings --logger trx'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>ilk olarak <em>NuGet<\/em> paketlerini &#8220;<em>restore<\/em>&#8221; ediyoruz ve sonra &#8220;<em>dotnet test<\/em>&#8221; komutunu, projemize g\u00f6re tan\u0131mlam\u0131\u015f oldu\u011fumuz &#8220;<em>coverlet.runsettings<\/em>&#8221; dosyas\u0131 ile \u00e7al\u0131\u015ft\u0131r\u0131yoruz. Bu noktada ben ilgili sonu\u00e7lar\u0131n agent i\u00e7erisinde bir temp klas\u00f6rde olu\u015fturulmas\u0131n\u0131 istemedi\u011fim i\u00e7in, &#8220;<em>publishTestResults<\/em>&#8221; parametresini &#8220;<em>false<\/em>&#8221; olarak set ettim. B\u00f6ylece ilgili sonu\u00e7lar, proje path&#8217;i alt\u0131nda &#8220;<em>TestResults<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisinde olu\u015fturuluyor olacak.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- task: PublishTestResults@2\r\n  displayName: \"Publish test results\"\r\n  inputs:\r\n    testResultsFormat: 'VSTest'\r\n    testResultsFiles: '$(System.DefaultWorkingDirectory)\/$(testProjectName)\/TestResults\/**\/*.trx'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Bir \u00f6nceki a\u015famada test sonu\u00e7lar\u0131n\u0131 otomatik olarak publish ettirmedi\u011fimiz i\u00e7in, bu a\u015famada proje path&#8217;i alt\u0131nda olu\u015fturulan test sonu\u00e7lar\u0131n\u0131 &#8220;<em>VSTest<\/em>&#8221; format\u0131nda <em>Azure<\/em> Pipeline&#8217;a publish ediyoruz. B\u00f6ylece detayl\u0131 test sonu\u00e7lar\u0131n\u0131 da pipeline \u00fczerinden g\u00f6rebilece\u011fiz.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- task: PublishCodeCoverageResults@1\r\n  displayName: \"Publish code coverage results\"\r\n  inputs:\r\n    codeCoverageTool: 'Cobertura'\r\n    summaryFileLocation: '$(System.DefaultWorkingDirectory)\/$(testProjectName)\/TestResults\/*\/coverage.cobertura.xml'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Son a\u015fama olarak ise cobertura format\u0131nda olu\u015fturttu\u011fumuz code coverage sonu\u00e7lar\u0131n\u0131, &#8220;PublishCodeCoverageResults&#8221; task&#8217;\u0131n\u0131 kullanarak Azure Pipeline&#8217;a publish ediyoruz.<\/p>\r\n\r\n\r\n\r\n<p>Hepsi bu kadar!<\/p>\r\n\r\n\r\n\r\n<p>Pipeline&#8217;\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda, a\u015fa\u011f\u0131daki gibi <strong>Summary<\/strong> k\u0131sm\u0131nda projenin <strong>test<\/strong> ve <strong>coverage<\/strong> bilgilerine <strong>h\u0131zl\u0131<\/strong> bir \u015fekilde g\u00f6z atabilece\u011fiz.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-full\"><a href=\"\/wp-content\/uploads\/2021\/11\/test_win_1.jpg\"><img decoding=\"async\" width=\"797\" height=\"657\" class=\"wp-image-3900 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/11\/test_win_1.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/test_win_1.jpg 797w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/test_win_1-300x247.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/test_win_1-768x633.jpg 768w\" data-sizes=\"(max-width: 797px) 100vw, 797px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 797px; --smush-placeholder-aspect-ratio: 797\/657;\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<p>Dilersek ilgili tab&#8217;lara t\u0131klayarak, daha detayl\u0131 bilgiler de edinebiliriz.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-full\"><a href=\"\/wp-content\/uploads\/2021\/11\/win_4.jpg\"><img decoding=\"async\" width=\"924\" height=\"697\" class=\"wp-image-3903 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/11\/win_4.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/win_4.jpg 924w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/win_4-300x226.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/win_4-768x579.jpg 768w\" data-sizes=\"(max-width: 924px) 100vw, 924px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 924px; --smush-placeholder-aspect-ratio: 924\/697;\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-full\"><a href=\"\/wp-content\/uploads\/2021\/11\/win_report_3.jpg\"><img decoding=\"async\" width=\"977\" height=\"938\" class=\"wp-image-3902 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/11\/win_report_3.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/win_report_3.jpg 977w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/win_report_3-300x288.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/win_report_3-768x737.jpg 768w\" data-sizes=\"(max-width: 977px) 100vw, 977px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 977px; --smush-placeholder-aspect-ratio: 977\/938;\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<p>Yukar\u0131daki sonu\u00e7lardan da g\u00f6rebildi\u011fimiz gibi uygulaman\u0131n hangi k\u0131s\u0131mlar\u0131 i\u00e7erisinde ne kadar bir code coverage oran\u0131na sahip oldu\u011fumuzu veya olabilece\u011fimizi buradan detayl\u0131 bir \u015fekilde g\u00f6rebiliyoruz.<\/p>\r\n\r\n\r\n\r\n<p>B\u00f6ylece iyi test edilmemi\u015f veya g\u00f6z\u00fcm\u00fczden ka\u00e7an k\u0131s\u0131mlar\u0131 kolay bir \u015fekilde adresleyebilir, onlar\u0131 da cover edebiliriz. Ayr\u0131ca bir tak\u0131m olarak belirli bir code coverage oran\u0131n\u0131 kendimize kalite hedefi olarak da belirleyebiliriz. B\u00f6ylece proje codebase&#8217;ini daha temiz bir noktaya getirirken, bizlerinde proje \u00fczerindeki g\u00fcven oranlar\u0131n\u0131 y\u00fckseltebiliriz.<\/p>\r\n\r\n\r\n\r\n<p>Code coverage kalite hedefini <em>CI<\/em> s\u00fcrecine dahil edebilmek i\u00e7in ise, <em><a title=\"https:\/\/marketplace.visualstudio.com\/items?itemName=mspremier.BuildQualityChecks\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=mspremier.BuildQualityChecks\" target=\"_blank\" rel=\"noreferrer noopener\">Build Quality Checks<\/a> <\/em>task&#8217;\u0131ndan yararlanabiliriz.<\/p>\r\n\r\n\r\n\r\n<p>\u00d6rne\u011fin %95 lik bir kalite oran\u0131 belirleyebilmek i\u00e7in, yaml pipeline&#8217;a a\u015fa\u011f\u0131daki gibi bir task ekleyebiliriz.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>- task: BuildQualityChecks@8\r\n  displayName: \"Code coverage quality check\"\r\n  inputs:\r\n    checkCoverage: true\r\n    coverageFailOption: 'fixed'\r\n    coverageType: 'lines'\r\n    coverageThreshold: '95'<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Bu task k\u0131saca hesaplanan &#8220;<em>line coverage<\/em>&#8221; ve &#8220;<em>threshold<\/em>&#8221; oranlar\u0131na bakarak, build&#8217;in ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z olmas\u0131n\u0131 sa\u011flamaktad\u0131r.<\/p>\r\n\r\n\r\n\r\n<p>\u00d6rne\u011fin,<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-full\"><a href=\"\/wp-content\/uploads\/2021\/11\/failed_coverage_gate.jpg\"><img decoding=\"async\" width=\"909\" height=\"852\" class=\"wp-image-3916 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/11\/failed_coverage_gate.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/failed_coverage_gate.jpg 909w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/failed_coverage_gate-300x281.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/11\/failed_coverage_gate-768x720.jpg 768w\" data-sizes=\"(max-width: 909px) 100vw, 909px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 909px; --smush-placeholder-aspect-ratio: 909\/852;\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<p>makale i\u00e7in kulland\u0131\u011f\u0131m test projesindeki code coverage de\u011feri %95&#8217;in alt\u0131nda kald\u0131\u011f\u0131 i\u00e7in, build ba\u015far\u0131s\u0131z bir \u015fekilde sonu\u00e7land\u0131. B\u00f6ylece ekip i\u00e7erisindeki test yazma k\u00fclt\u00fcr\u00fcn\u00fc artt\u0131rabilir veya sahip olmaya zorlayabilir, codebase&#8217;in daima iyi bir \u015fekilde test edilmi\u015f ve temiz olmas\u0131n\u0131 sa\u011flayabiliriz.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Toparlayal\u0131m<\/h2>\r\n\r\n\r\n\r\n<p>Code coverage metri\u011fine sahip olman\u0131n \u00f6nemi, projenin sa\u011fl\u0131\u011f\u0131 ve ekip olarak projeye olan g\u00fcven oran\u0131n\u0131n artt\u0131r\u0131lmas\u0131 konusunda olduk\u00e7a y\u00fcksektir. Bu g\u00fcven oran\u0131n\u0131n daha ger\u00e7ek\u00e7i bir oran olabilmesi i\u00e7in de, test case&#8217;lerine sahip olurken olabildi\u011fince edge case&#8217;leri de dikkate alarak hareket ediyor olmam\u0131z gerekmektedir.<\/p>\r\n\r\n\r\n\r\n<p>Bu makale kapsam\u0131nda ise code coverage metriklerini <em>Coverlet <\/em>ile nas\u0131l toplayabilece\u011fimizi ve <em>Azure <\/em>\u00fczerinde <em>CI <\/em>s\u00fcre\u00e7lerimize nas\u0131l dahil edebilece\u011fimizi g\u00f6stermeye \u00e7al\u0131\u015ft\u0131m.<\/p>\r\n<p>Github: <em>https:\/\/github.com\/GokGokalp\/dotnet5codecoverage<\/em><\/p>\r\n<h2>Referanslar<\/h2>\r\n<p><em>https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/tasks\/test\/publish-code-coverage-results?view=azure-devops<\/em><br \/><em>https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/tasks\/test\/publish-test-results?view=azure-devops&amp;tabs=trx%2Cyaml<\/em><br \/><em>https:\/\/github.com\/coverlet-coverage\/coverlet\/blob\/master\/Documentation\/VSTestIntegration.md<\/em><\/p>\r\n\r\n<p>","protected":false},"excerpt":{"rendered":"<p>Code coverage metri\u011fi, projemizin sa\u011fl\u0131kl\u0131 ve g\u00fcvenilir oldu\u011fu ve ayr\u0131ca de\u011fi\u015fimlere kar\u015f\u0131 ne derece h\u0131zl\u0131 ayak uydurabilece\u011fimizin \u00f6nemli bir g\u00f6stergesidir. Code coverage temelinde, yazm\u0131\u015f oldu\u011fumuz kod sat\u0131rlar\u0131n\u0131n ne kadar\u0131n\u0131n test yaz\u0131larak do\u011fruland\u0131\u011f\u0131n\u0131 belirlemektedir. Tabii ki burada sadece code coverage metri\u011fini artt\u0131rabilmek i\u00e7in yazabilece\u011fimiz happy-path test&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">.NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":3933,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[505,418,375,457],"tags":[621,618,619,617,620],"class_list":["post-3881","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-azure","category-ci-continuous-integration","category-dotnet","tag-net-core-code-coverage","tag-azure-pipeline","tag-azure-yaml-pipeline","tag-code-coverage","tag-quality-gates","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>.NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-01T18:19:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-01T21:51:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/12\/code-coverage-dotnet-gokhan-gokalp.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek\",\"datePublished\":\"2021-12-01T18:19:36+00:00\",\"dateModified\":\"2021-12-01T21:51:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/\"},\"wordCount\":2033,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/code-coverage-dotnet-gokhan-gokalp.jpg\",\"keywords\":[\".net core code coverage\",\"azure pipeline\",\"azure yaml pipeline\",\"code coverage\",\"quality gates\"],\"articleSection\":[\".NET Core\",\"Azure\",\"CI (Continuous Integration)\",\"dotnet\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/\",\"name\":\".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/code-coverage-dotnet-gokhan-gokalp.jpg\",\"datePublished\":\"2021-12-01T18:19:36+00:00\",\"dateModified\":\"2021-12-01T21:51:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/code-coverage-dotnet-gokhan-gokalp.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/code-coverage-dotnet-gokhan-gokalp.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Calculating Code Coverage Metrics in .NET Applications and Integrating with CI Processes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek - G\u00f6khan G\u00f6kalp","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:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/","og_locale":"tr_TR","og_type":"article","og_title":".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2021-12-01T18:19:36+00:00","article_modified_time":"2021-12-01T21:51:27+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/12\/code-coverage-dotnet-gokhan-gokalp.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek","datePublished":"2021-12-01T18:19:36+00:00","dateModified":"2021-12-01T21:51:27+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/"},"wordCount":2033,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/12\/code-coverage-dotnet-gokhan-gokalp.jpg","keywords":[".net core code coverage","azure pipeline","azure yaml pipeline","code coverage","quality gates"],"articleSection":[".NET Core","Azure","CI (Continuous Integration)","dotnet"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/","url":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/","name":".NET Uygulamalar\u0131nda Code Coverage Metriklerini Hesaplama ve CI S\u00fcre\u00e7lerine Dahil Etmek - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/12\/code-coverage-dotnet-gokhan-gokalp.jpg","datePublished":"2021-12-01T18:19:36+00:00","dateModified":"2021-12-01T21:51:27+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/12\/code-coverage-dotnet-gokhan-gokalp.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/12\/code-coverage-dotnet-gokhan-gokalp.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/calculating-code-coverage-metrics-in-dotnet-applications-and-integrating-with-ci-processes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Calculating Code Coverage Metrics in .NET Applications and Integrating with CI Processes"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=3881"}],"version-history":[{"count":5,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3881\/revisions"}],"predecessor-version":[{"id":3935,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3881\/revisions\/3935"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/3933"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=3881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=3881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=3881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}