<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Tobias Hoffmann</title>
    <description>The latest articles on Forem by Tobias Hoffmann (@tobiass_hoffmann).</description>
    <link>https://forem.com/tobiass_hoffmann</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821706%2Ff492b371-6da6-45b8-a3b5-dc8326f72f8c.png</url>
      <title>Forem: Tobias Hoffmann</title>
      <link>https://forem.com/tobiass_hoffmann</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tobiass_hoffmann"/>
    <language>en</language>
    <item>
      <title>Test Amaçlı API Mocklama: Uygulamalı Rehber</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:37:36 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/test-amacli-api-mocklama-uygulamali-rehber-27fh</link>
      <guid>https://forem.com/tobiass_hoffmann/test-amacli-api-mocklama-uygulamali-rehber-27fh</guid>
      <description>&lt;p&gt;Canlı bir API'ye bağlı testler, kodunuz doğru olsa bile yanlış nedenlerle başarısız olabilir: hazırlık sunucusu çöker, üçüncü taraf hız limiti devreye girer veya bir ekip arkadaşı test verisini değiştirir. API taklidi, gerçek uç noktayı kontrollü bir yedekle değiştirerek testlerinize deterministik yanıtlar verir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu rehberde bir API'yi test için nasıl taklit edeceğinizi adım adım uygulayacağız: şema tanımlama, taklit yanıt üretme, taklit sunucu çalıştırma, testleri bu sunucuya yönlendirme ve hata yollarını doğrulama. Örnek olarak küçük bir sipariş yönetimi API'sindeki &lt;code&gt;GET /orders/{id}&lt;/code&gt; uç noktasını kullanacağız; aynı yaklaşım REST ve GraphQL servisleri için de geçerlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  API'yi ne zaman taklit etmelisiniz?
&lt;/h2&gt;

&lt;p&gt;Ağ katmanını değil, kendi kodunuzu test etmek istiyorsanız API'yi taklit edin. Bu özellikle birim testleri ve çoğu entegrasyon testi için uygundur.&lt;/p&gt;

&lt;p&gt;Örneğin istemcinizin şunları doğru yaptığını doğrulamak için gerçek sunucuya ihtiyacınız yoktur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt; yanıtını ayrıştırmak&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt; için anlamlı hata göstermek&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;429&lt;/code&gt; veya &lt;code&gt;503&lt;/code&gt; durumlarında yeniden denemek&lt;/li&gt;
&lt;li&gt;Bozuk JSON geldiğinde çökmemek&lt;/li&gt;
&lt;li&gt;Yavaş yanıt geldiğinde zaman aşımına düşmek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gerçek API'yi tamamen bırakmayın. Canlı servise karşı küçük bir sözleşme testi ve uçtan uca test katmanı tutun. Amaç, taklitlerin hâlâ gerçek API sözleşmesiyle uyumlu olduğunu doğrulamaktır.&lt;/p&gt;

&lt;p&gt;Kısaca:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hız ve izolasyon için taklit kullanın.&lt;/li&gt;
&lt;li&gt;Sözleşmeyi doğrulamak için gerçek API kullanın.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Daha fazla bağlam için &lt;a href="http://apidog.com/blog/api-mocking-use-cases?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API taklidinin işe yaradığı senaryolara&lt;/a&gt; ve &lt;a href="http://apidog.com/blog/mock-server-vs-real-server?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;taklit sunucu ile gerçek sunucu arasındaki farka&lt;/a&gt; bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beş adımlı iş akışı
&lt;/h2&gt;

&lt;p&gt;Bir API'yi test için taklit ederken süreç genellikle aynıdır:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gerçek yanıt şeklini yansıtmak için &lt;strong&gt;şemayı tanımlayın&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Bu şemadan &lt;strong&gt;statik veya dinamik taklit yanıtlar oluşturun&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Yanıtları bir URL üzerinden sunan &lt;strong&gt;taklit sunucuyu çalıştırın&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Test kodunuzdaki temel URL'yi değiştirerek &lt;strong&gt;testleri taklit sunucuya yönlendirin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Gerçek sunucunun isteğe bağlı üretmeyeceği &lt;strong&gt;hata yollarını test edin&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aşağıdaki örneklerde &lt;code&gt;GET /orders/{id}&lt;/code&gt; uç noktasını kullanacağız.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adım 1: Şemayı tanımlayın
&lt;/h2&gt;

&lt;p&gt;Taklit yanıt, gerçek API yanıtıyla aynı yapıda değilse testiniz yanıltıcı olur. Bu yüzden önce şema tanımlayın.&lt;/p&gt;

&lt;p&gt;API'nizin zaten bir &lt;a href="https://spec.openapis.org/oas/latest.html" rel="noopener noreferrer"&gt;OpenAPI&lt;/a&gt; belgesi varsa onu kullanın. Yoksa en azından test ettiğiniz uç nokta için küçük bir şema yazın.&lt;/p&gt;

&lt;p&gt;Örnek &lt;code&gt;GET /orders/{id}&lt;/code&gt; tanımı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/orders/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order found&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
                &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;status&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;total&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;items&lt;/span&gt;
                &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                    &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pending&lt;/span&gt;
                      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;shipped&lt;/span&gt;
                      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;delivered&lt;/span&gt;
                  &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;number&lt;/span&gt;
                  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;array&lt;/span&gt;
                    &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;404'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu şema iki şey sağlar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Taklit sunucunun hangi alanları döndüreceğini belirler.&lt;/li&gt;
&lt;li&gt;API sözleşmesi için tek doğruluk kaynağı oluşturur.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Arka uç sözleşmeyi değiştirdiğinde şemayı güncellersiniz. Şemadan türetilen taklitler de bu değişikliği takip eder. Bu yaklaşım, &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API sözleşme testini&lt;/a&gt; güvenilir tutar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adım 2: Taklit yanıtları oluşturun
&lt;/h2&gt;

&lt;p&gt;Taklit yanıt üretmek için iki ana yöntem vardır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Statik yanıt
&lt;/h3&gt;

&lt;p&gt;Statik yanıt, değişmeyen sabit JSON'dur. Özellikle deterministik birim testleri için uygundur.&lt;/p&gt;

&lt;p&gt;Örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order_8842"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shipped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;149.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku_456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bunu şu durumlarda kullanın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beklenen yanıtı birebir doğrulamak istiyorsanız&lt;/li&gt;
&lt;li&gt;Snapshot benzeri testler yazıyorsanız&lt;/li&gt;
&lt;li&gt;Testin her çalıştırmada aynı veriyle koşmasını istiyorsanız&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dinamik yanıt
&lt;/h3&gt;

&lt;p&gt;Dinamik yanıt, her istek için gerçekçi değerlerle oluşturulur. Örneğin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; için UUID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt; için enum içinden geçerli bir değer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;total&lt;/code&gt; için makul bir para değeri&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;items&lt;/code&gt; için farklı uzunlukta diziler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dinamik veri, tek bir sabit yükün kaçırabileceği hataları yakalamanıza yardım eder. Örneğin istemciniz boş dizi, uzun metin veya beklenmeyen ama geçerli enum değeriyle bozuluyorsa bunu daha erken görürsünüz.&lt;/p&gt;

&lt;p&gt;Çoğu ekip iki yaklaşımı birlikte kullanır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kritik doğrulamalar için statik yanıt&lt;/li&gt;
&lt;li&gt;Daha geniş kapsama için dinamik yanıt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, şemayı okuyarak taklit uç noktası oluşturabilir. &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt; veya &lt;code&gt;avatar&lt;/code&gt; gibi alan adlarını uygun veri türleriyle eşleştirip geçerli yanıtlar döndürebilir. Böylece tarayıcıdan veya test kodundan taklit URL'sini çağırarak hızlıca yanıt alabilirsiniz.&lt;/p&gt;

&lt;p&gt;Elle yük yazıyorsanız gerçekçi veri kullanın. Aşağıdaki gibi aşırı basit yükler hataları gizleyebilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bunun yerine üretime daha yakın veri kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order_8842"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shipped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;149.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"keyboard-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.99&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mouse-wireless"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adım 3: Taklit sunucuyu çalıştırın
&lt;/h2&gt;

&lt;p&gt;Taklit yanıt ancak bir sunucu üzerinden sunulduğunda testler tarafından kullanılabilir. İki seçeneğiniz vardır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yerel taklit sunucu
&lt;/h3&gt;

&lt;p&gt;Yerel taklit sunucu makinenizde çalışır. Genellikle &lt;code&gt;localhost&lt;/code&gt; veya &lt;code&gt;127.0.0.1&lt;/code&gt; üzerinde bir port dinler.&lt;/p&gt;

&lt;p&gt;Örneğin &lt;a href="https://github.com/stoplightio/prism" rel="noopener noreferrer"&gt;Prism&lt;/a&gt; ile OpenAPI dosyasından taklit sunucu başlatabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prism mock openapi.yaml
&lt;span class="c"&gt;# Mock server listening on http://127.0.0.1:4010&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yerel taklit sunucu şunlar için uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Birim testleri&lt;/li&gt;
&lt;li&gt;Entegrasyon testleri&lt;/li&gt;
&lt;li&gt;CI içinde izole test çalıştırmaları&lt;/li&gt;
&lt;li&gt;Çevrimdışı geliştirme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avantajları:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hızlıdır.&lt;/li&gt;
&lt;li&gt;Ağ gecikmesi minimumdur.&lt;/li&gt;
&lt;li&gt;Paylaşılan durum olmadığı için testler birbirini etkilemez.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bulut taklit sunucu
&lt;/h3&gt;

&lt;p&gt;Bulut taklit sunucunun genel bir URL'si vardır. Şu durumlarda kullanışlıdır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobil uygulama fiziksel cihazdan test ediliyorsa&lt;/li&gt;
&lt;li&gt;CI çalıştırıcısının yerel makinenize erişimi yoksa&lt;/li&gt;
&lt;li&gt;Harici bir ekip arkadaşı aynı taklite erişmek istiyorsa&lt;/li&gt;
&lt;li&gt;Demo veya ürün incelemesi yapılıyorsa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog, projeler için barındırılan Bulut Taklit URL'si sağlayabilir. Böylece farklı ağlardaki ekip üyeleri aynı taklit uç noktaya erişebilir.&lt;/p&gt;

&lt;p&gt;Genel kural:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Otomatik testlerde yerel taklit kullanın.&lt;/li&gt;
&lt;li&gt;Demo, cihaz testi ve ekip paylaşımı için bulut taklit kullanın.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Adım 4: Testlerinizi taklit sunucuya yönlendirin
&lt;/h2&gt;

&lt;p&gt;Test kodunuz üretim URL'sine sabitlenmiş olmamalıdır. Temel URL'yi yapılandırılabilir yapın.&lt;/p&gt;

&lt;p&gt;Örnek istemci:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// orderClient.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/orders/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Order not found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Request failed with status &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testte temel URL'yi ortam değişkeninden okuyun:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// orderClient.test.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getOrder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./orderClient.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://127.0.0.1:4010&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped durumundaki siparişi ayrıştırır&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_8842&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CI içinde testleri taklit sunucuya yönlendirmek için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:4010 npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu desenin avantajı şudur: uygulama kodu taklit sunucudan haberdar olmaz. Sadece farklı bir temel URL alır.&lt;/p&gt;

&lt;p&gt;Aynı yaklaşım, &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD içinde API testlerini otomatikleştirirken&lt;/a&gt; de geçerlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adım 5: Hata yollarını test edin
&lt;/h2&gt;

&lt;p&gt;Gerçek sunucu istediğiniz anda &lt;code&gt;500&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt; veya yavaş yanıt üretmez. Taklit sunucu ise bunu kontrollü şekilde yapabilir.&lt;/p&gt;

&lt;p&gt;Aşağıdaki senaryoları özellikle test edin:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Senaryo&lt;/th&gt;
&lt;th&gt;Taklit ne döndürür?&lt;/th&gt;
&lt;th&gt;Ne doğrulanır?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kayıp kayıt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;404&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;İstemci açık bir "bulunamadı" hatası üretir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunucu hatası&lt;/td&gt;
&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;İstemci yeniden dener veya geri dönüş davranışı uygular&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hız limiti&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;429&lt;/code&gt; ve &lt;code&gt;Retry-After&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;İstemci doğru süre bekler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yavaş yanıt&lt;/td&gt;
&lt;td&gt;5 sn gecikmeden sonra &lt;code&gt;200&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;İstemci zaman aşımını doğru yönetir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bozuk gövde&lt;/td&gt;
&lt;td&gt;Bozuk JSON ile &lt;code&gt;200&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;İstemci çökmek yerine kontrollü hata üretir&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Örnek Jest testi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;404 geldiğinde anlamlı hata fırlatır&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_404&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;rejects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toThrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Order not found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yeniden deneme davranışı test ediyorsanız istemcinizde retry mantığını izole edin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getOrderWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;lastError&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;lastError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;lastError&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;geçici hata durumunda yeniden dener&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getOrderWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog'un gelişmiş taklit kuralları, isteğe göre farklı yanıtlar döndürmenizi sağlar. Örneğin &lt;code&gt;order_404&lt;/code&gt; için yapılan istek &lt;code&gt;404&lt;/code&gt; dönerken diğer kimlikler normal &lt;code&gt;200&lt;/code&gt; yanıtı alabilir. Bunu &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API doğrulama&lt;/a&gt; ile birleştirerek yalnızca durum kodlarını değil, davranışı da doğrulayabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Büyüyen test paketinde taklitleri düzenleme
&lt;/h2&gt;

&lt;p&gt;Tek bir taklit uç nokta kolay yönetilir. Ancak test paketi büyüdükçe taklitler hızla dağılabilir. Bunu önlemek için birkaç kural uygulayın.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taklitleri teste göre değil, servise göre gruplayın
&lt;/h3&gt;

&lt;p&gt;Kötü yapı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tests/
  checkout/
    mock-order.json
  profile/
    mock-order.json
  admin/
    mock-order.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha sürdürülebilir yapı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mocks/
  orders/
    order-shipped.json
    order-not-found.json
    order-rate-limited.json
  payments/
    payment-success.json
    payment-declined.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ödeme API'si değiştiğinde yirmi test dosyası yerine tek bir servis klasörünü güncellersiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Senaryoya göre adlandırın
&lt;/h3&gt;

&lt;p&gt;Dosya veya fixture adları niyeti açık göstermelidir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;order-shipped.json
order-pending.json
order-not-found.json
order-rate-limited.json
order-malformed-response.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Böylece başarısız test çıktısı daha okunabilir olur.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ortak temel yanıt kullanın
&lt;/h3&gt;

&lt;p&gt;Her test için tamamen ayrı JSON yazmayın. Temel bir sipariş tanımlayıp yalnızca gerekli alanı değiştirin.&lt;/p&gt;

&lt;p&gt;Örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_8842&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;149.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyboard-pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;89.99&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pendingOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;baseOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expensiveOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;baseOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;999.99&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yaklaşım, sözleşme değişikliğinde tek bir temel yapıyı güncellemenizi sağlar.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/test-suites-api-test-automation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API otomasyonu için test paketi&lt;/a&gt; tasarlarken uyguladığınız disiplin, taklit veriler için de geçerlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taklitleri gerçek sözleşmeyle senkron tutma
&lt;/h2&gt;

&lt;p&gt;Taklitlerin en büyük riski sözleşmeden sapmasıdır. Arka uç &lt;code&gt;total&lt;/code&gt; alanını &lt;code&gt;amount&lt;/code&gt; olarak değiştirir, enum'a yeni değer ekler veya zorunlu alan çıkarır; taklit eski yanıtı döndürmeye devam eder. Testler geçer, üretim bozulur.&lt;/p&gt;

&lt;p&gt;Bunu önlemek için iki pratik alışkanlık edinin.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Taklitleri aynı şemadan üretin
&lt;/h3&gt;

&lt;p&gt;Taklitleri arka ucun kullandığı OpenAPI belgesinden üretin. Şema değiştiğinde taklit de güncellenir.&lt;/p&gt;

&lt;p&gt;Elle yazılmış taklitlerde bu bağlantı yoktur. Bu yüzden manuel fixture kullanıyorsanız bile şemaya karşı doğrulama çalıştırın.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gerçek API'ye karşı küçük sözleşme testleri çalıştırın
&lt;/h3&gt;

&lt;p&gt;Taklit testleri hızlı ve izole olmalıdır. Ancak düzenli olarak gerçek API'ye karşı küçük bir sözleşme testi seti çalıştırın.&lt;/p&gt;

&lt;p&gt;Amaç şu soruyu yanıtlamaktır:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Canlı API yanıtı hâlâ şemayla uyumlu mu?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu testler başarısız olursa taklitlerinizin de güncellenmesi gerekir.&lt;/p&gt;

&lt;p&gt;Örnek ayrım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run test:mock       # Her commit'te hızlı taklit testleri
npm run test:contract   # Belirli aralıklarla veya deploy öncesi gerçek API sözleşme testleri
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Kod incelemede taklitleri de kontrol edin
&lt;/h3&gt;

&lt;p&gt;Bir pull request API yanıtını değiştiriyorsa, ilgili taklitlerin de güncellenip güncellenmediği kontrol edilmelidir. Taklitleri geçici test yardımcısı değil, sözleşmenin parçası olarak değerlendirin.&lt;/p&gt;

&lt;p&gt;Şema, taklit sunucu ve test paketini aynı akışta tutmak istiyorsanız &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u İndirin&lt;/a&gt;. Daha geniş araç karşılaştırması için &lt;a href="http://apidog.com/blog/rest-api-mocking-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST API taklit araçları&lt;/a&gt; listesini inceleyebilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Her test için API'yi taklit etmeli miyim?
&lt;/h3&gt;

&lt;p&gt;Hayır. Birim ve entegrasyon testlerinde taklit kullanın. Bunun yanında gerçek API'ye giden küçük bir sözleşme ve uçtan uca test grubu bulundurun. Her şeyi taklit etmek sözleşme sapmasını gizleyebilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Statik ve dinamik taklit yanıt arasındaki fark nedir?
&lt;/h3&gt;

&lt;p&gt;Statik yanıt, değişmeyen sabit JSON yüküdür. Tahmin edilebilir doğrulamalar için uygundur.&lt;/p&gt;

&lt;p&gt;Dinamik yanıt, her istek için gerçekçi değerlerle üretilir. Tek bir sabit yükün yakalayamayacağı ayrıştırma ve sınır durum hatalarını bulmaya yardımcı olur.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taklitimin doğru kaldığından nasıl emin olurum?
&lt;/h3&gt;

&lt;p&gt;Takliti arka ucun kullandığı aynı şemadan, ideal olarak OpenAPI belgesinden üretin. Ardından gerçek API'ye karşı düzenli sözleşme testleri çalıştırarak canlı yanıtların hâlâ bu şemayla eşleştiğini doğrulayın.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taklit sunucu yavaş veya başarısız yanıtları simüle edebilir mi?
&lt;/h3&gt;

&lt;p&gt;Evet. Taklit sunucuyu &lt;code&gt;500&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt; ve &lt;code&gt;Retry-After&lt;/code&gt; başlığı veya gecikmeli &lt;code&gt;200&lt;/code&gt; döndürecek şekilde yapılandırabilirsiniz. Bu, yeniden deneme, geri çekilme ve zaman aşımı mantığını güvenli şekilde test etmenizi sağlar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test için yerel taklit sunucu mu, bulut taklit sunucu mu?
&lt;/h3&gt;

&lt;p&gt;Otomatik test çalıştırmaları için yerel taklit sunucu kullanın. Daha hızlıdır ve paylaşılan durum riskini azaltır.&lt;/p&gt;

&lt;p&gt;Mobil cihaz, CI ortamı veya harici ekip üyesi yerel makinenize erişemiyorsa bulut taklit sunucu kullanın.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Insomnia ile API Testi Nasıl Yapılır</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:37:16 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/insomnia-ile-api-testi-nasil-yapilir-20b6</link>
      <guid>https://forem.com/tobiass_hoffmann/insomnia-ile-api-testi-nasil-yapilir-20b6</guid>
      <description>&lt;p&gt;Insomnia, Kong tarafından geliştirilen hafif bir API istemcisidir. HTTP, REST, GraphQL, gRPC, SOAP ve WebSocket isteklerini tek arayüzden göndermenizi, yanıtları incelemenizi ve test paketleriyle doğrulama yapmanızı sağlar. Bu rehberde Insomnia ile bir API isteği oluşturacak, ortam değişkenleri kullanacak, assertion yazacak ve testleri komut satırından çalıştıracaksınız.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Insomnia'yı kurun ve ilk isteği oluşturun
&lt;/h2&gt;

&lt;p&gt;Insomnia'yı &lt;a href="https://insomnia.rest/download" rel="noopener noreferrer"&gt;resmi Kong sitesinden&lt;/a&gt; indirin ve işletim sisteminize kurun. İlk açılışta oturum açmanız istenebilir. Bulut senkronizasyonu kullanmak istemiyorsanız yerel çalışma seçeneğini tercih edebilirsiniz.&lt;/p&gt;

&lt;p&gt;Insomnia'da çalışmalar genellikle &lt;strong&gt;koleksiyonlar&lt;/strong&gt; altında düzenlenir.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ana ekranda &lt;strong&gt;Create / Oluştur&lt;/strong&gt; seçeneğine tıklayın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request Collection / İstek Koleksiyonu&lt;/strong&gt; oluşturun.&lt;/li&gt;
&lt;li&gt;Koleksiyona örneğin &lt;code&gt;Kullanıcı API testleri&lt;/code&gt; adını verin.&lt;/li&gt;
&lt;li&gt;Koleksiyon içinde &lt;strong&gt;+&lt;/strong&gt; düğmesine tıklayın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Request / HTTP İsteği&lt;/strong&gt; seçin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;İlk test için &lt;code&gt;GET&lt;/code&gt; metodunu kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Send / Gönder&lt;/strong&gt; düğmesine tıkladığınızda Insomnia sağ panelde şunları gösterir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yanıt gövdesi&lt;/li&gt;
&lt;li&gt;HTTP durum kodu&lt;/li&gt;
&lt;li&gt;Yanıt süresi&lt;/li&gt;
&lt;li&gt;Yanıt boyutu&lt;/li&gt;
&lt;li&gt;JSON biçimlendirilmiş çıktı&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JSON yanıt büyükse JSONPath veya XPath filtreleriyle sadece ihtiyacınız olan alanları görüntüleyebilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metot, parametre, gövde ve kimlik doğrulama ayarlayın
&lt;/h2&gt;

&lt;p&gt;Basit &lt;code&gt;GET&lt;/code&gt; isteklerinden sonra genellikle gövde, header, query parametresi veya auth bilgisi eklemeniz gerekir. Insomnia bu ayarları URL alanının altındaki sekmelerde toplar.&lt;/p&gt;

&lt;h3&gt;
  
  
  JSON gövdeyle POST isteği gönderin
&lt;/h3&gt;

&lt;p&gt;Yeni bir istek oluşturun ve metodu &lt;code&gt;POST&lt;/code&gt; yapın. &lt;strong&gt;Body / Gövde&lt;/strong&gt; sekmesinde &lt;code&gt;JSON&lt;/code&gt; seçin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Daniel Okafor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"daniel.okafor@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON gövde seçtiğinizde Insomnia genellikle &lt;code&gt;Content-Type: application/json&lt;/code&gt; başlığını otomatik ekler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Query parametreleri ekleyin
&lt;/h3&gt;

&lt;p&gt;URL'yi elle uzatmak yerine &lt;strong&gt;Query&lt;/strong&gt; sekmesini kullanın.&lt;/p&gt;

&lt;p&gt;Örneğin şu URL yerine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://api.example.com/users?page=1&amp;amp;limit=20&amp;amp;active=true
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;parametreleri tablo halinde ekleyebilirsiniz:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parametre&lt;/th&gt;
&lt;th&gt;Değer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;active&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bu yöntem uzun URL'leri okunabilir tutar ve parametreleri tek tek etkinleştirip devre dışı bırakmanızı sağlar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Header ekleyin
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Headers / Başlıklar&lt;/strong&gt; sekmesinde API'nizin beklediği özel başlıkları tanımlayın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Accept: application/json
X-Request-Id: test-123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hangi durum kodlarını beklemeniz gerektiğinden emin değilseniz, &lt;a href="http://apidog.com/blog/which-http-status-codes-rest-apis-should-use?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST API'lerinin kullanması gereken HTTP durum kodları&lt;/a&gt; referansı yardımcı olabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bearer Token ile kimlik doğrulama yapın
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Auth / Kimlik Doğrulama&lt;/strong&gt; sekmesinde API'nizin kullandığı yöntemi seçin. Insomnia şu şemaları destekler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bearer Token&lt;/li&gt;
&lt;li&gt;Basic Auth&lt;/li&gt;
&lt;li&gt;API Key&lt;/li&gt;
&lt;li&gt;OAuth 1.0 / 2.0&lt;/li&gt;
&lt;li&gt;AWS IAM&lt;/li&gt;
&lt;li&gt;Diğer yaygın auth türleri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bearer token kullanan bir API için:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Auth&lt;/strong&gt; sekmesini açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bearer Token&lt;/strong&gt; seçin.&lt;/li&gt;
&lt;li&gt;Token değerini girin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ancak token'ı doğrudan isteğe yazmak yerine ortam değişkeni kullanmak daha güvenlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ortamları ve değişkenleri kullanın
&lt;/h2&gt;

&lt;p&gt;Ortamlar, aynı koleksiyonu farklı hedeflerde çalıştırmanızı sağlar. Örneğin &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt; ve &lt;code&gt;production&lt;/code&gt; için ayrı base URL veya token değerleri kullanabilirsiniz.&lt;/p&gt;

&lt;p&gt;Yan çubuğun üst kısmındaki ortam menüsünden &lt;strong&gt;Manage Environments / Ortamları Yönet&lt;/strong&gt; bölümünü açın.&lt;/p&gt;

&lt;p&gt;Temel bir ortam şu şekilde olabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://jsonplaceholder.typicode.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-token-here"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;İstek URL'sinde değişkeni şu sözdizimiyle kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {{ _.base_url }}/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authorization header içinde token değişkeni kullanmak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{ _.auth_token }}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aktif ortamı değiştirdiğinizde bu değişkenleri kullanan tüm istekler otomatik olarak yeni değerlere göre çalışır.&lt;/p&gt;

&lt;h2&gt;
  
  
  İstekleri şablon etiketleriyle zincirleyin
&lt;/h2&gt;

&lt;p&gt;Insomnia, alanlara dinamik değerler eklemek için &lt;strong&gt;template tags / şablon etiketleri&lt;/strong&gt; destekler. Bunlarla şunları üretebilir veya alabilirsiniz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UUID&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Ortam değişkeni&lt;/li&gt;
&lt;li&gt;Önceki bir isteğin yanıtından değer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örneğin login isteğiniz şu yanıtı dönüyorsa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc.def.ghi"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;korumalı isteklerde bu token'ı elle kopyalamak yerine yanıt şablon etiketiyle &lt;code&gt;$.token&lt;/code&gt; JSONPath değerini çekebilirsiniz.&lt;/p&gt;

&lt;p&gt;Kullanım mantığı:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login isteğini oluşturun.&lt;/li&gt;
&lt;li&gt;Yanıttaki token alanını JSONPath ile hedefleyin: &lt;code&gt;$.token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Korumalı isteklerde &lt;code&gt;Authorization&lt;/code&gt; başlığına bu değeri bağlayın.&lt;/li&gt;
&lt;li&gt;Insomnia gerekirse login isteğini çalıştırır, token'ı alır ve sonraki istekte kullanır.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bu yaklaşım, test zincirini betik yazmadan yönetmenizi sağlar. Test senaryolarını gruplama fikri için &lt;a href="http://apidog.com/blog/api-test-case-example?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API test durumu örneği&lt;/a&gt; rehberine de bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assertion içeren test paketleri yazın
&lt;/h2&gt;

&lt;p&gt;İstek göndermek yanıtı görmenizi sağlar; ancak yanıtın doğru olup olmadığını otomatik kontrol etmek için &lt;strong&gt;test paketleri&lt;/strong&gt; kullanmanız gerekir. Insomnia'da bu bölüm bazı sürümlerde &lt;strong&gt;Tests&lt;/strong&gt; veya &lt;strong&gt;Unit Tests&lt;/strong&gt; olarak görünür.&lt;/p&gt;

&lt;p&gt;Bir test paketi oluşturmak için:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Koleksiyonunuzu açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests / Testler&lt;/strong&gt; görünümüne geçin.&lt;/li&gt;
&lt;li&gt;Yeni bir test paketi oluşturun.&lt;/li&gt;
&lt;li&gt;Pakete testler ekleyin.&lt;/li&gt;
&lt;li&gt;Her testi koleksiyondaki ilgili isteğe bağlayın.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Insomnia testleri JavaScript ile yazılır ve Chai tarzı &lt;code&gt;expect&lt;/code&gt; assertion kullanır.&lt;/p&gt;

&lt;p&gt;Basit durum kodu testi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yanıt gövdesini kontrol eden daha kapsamlı bir test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;daniel.okafor@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Header kontrolü örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hata senaryosu testi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testleri çalıştırmak için &lt;strong&gt;Run Tests / Testleri Çalıştır&lt;/strong&gt; düğmesine basın. Insomnia her testin geçip geçmediğini ve ne kadar sürdüğünü gösterir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test paketlerini düzenli tutun
&lt;/h2&gt;

&lt;p&gt;Test sayısı arttıkça paket yapısı önem kazanır. Uygulanabilir bir düzen şu şekildedir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User API tests
├── Kullanıcı detayını getirir
├── Olmayan kullanıcı için 404 döner
├── Geçersiz email için doğrulama hatası döner

Article API tests
├── Makale listesini getirir
├── Makale oluşturur
├── Yetkisiz istekte 401 döner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Her test tek davranışı doğrulamalıdır. Böylece bir test başarısız olduğunda test adından neyin bozulduğunu anlayabilirsiniz.&lt;/p&gt;

&lt;p&gt;İyi assertion yazma konusunda daha fazla örnek için &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API onaylamaları&lt;/a&gt; rehberine, paketleri büyüdükçe yapılandırmak için ise &lt;a href="http://apidog.com/blog/test-suites-api-test-automation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API test otomasyonu için test paketleri&lt;/a&gt; makalesine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inso ile testleri komut satırından çalıştırın
&lt;/h2&gt;

&lt;p&gt;GUI geliştirme sırasında kullanışlıdır; ancak CI/CD için testleri başsız şekilde çalıştırmanız gerekir. Insomnia bunun için &lt;strong&gt;Inso&lt;/strong&gt; adlı komut satırı aracını sağlar.&lt;/p&gt;

&lt;p&gt;Koleksiyonunuzu dışa aktardıktan veya senkronize ettikten sonra test paketini terminalden çalıştırabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inso run &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"User API tests"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir test başarısız olursa Inso sıfır olmayan exit code döndürür. Bu davranış CI sistemleri için idealdir çünkü derlemeyi otomatik olarak başarısız işaretleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Basit bir CI akışı şu şekilde olabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; inso
inso run &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"User API tests"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub Actions veya benzer bir çalıştırıcıda bu komutu her push veya pull request için çalıştırabilirsiniz. Böylece bozuk bir endpoint üretime ulaşmadan yakalanır.&lt;/p&gt;

&lt;p&gt;Inso ayrıca API spesifikasyonlarını lint etmek ve test raporları üretmek için de kullanılabilir. Genel yaklaşım için &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD'de API testlerini otomatikleştirmek&lt;/a&gt; yazısındaki kalıp Insomnia testlerine de uygulanabilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Insomnia 8'deki bulut değişikliği ve alternatif yaklaşım
&lt;/h2&gt;

&lt;p&gt;Insomnia 8 ile ürün, bulut öncelikli bir modele doğru ilerledi. Varsayılan akış kullanıcıları Kong hesabı oluşturmaya ve projeleri bulutta saklamaya yönlendirdi. Önceki sürümlerin yerel ve çevrimdışı çalışmaya daha yakın olması nedeniyle bu değişiklik topluluğun bir kısmında tepki oluşturdu.&lt;/p&gt;

&lt;p&gt;Daha sonraki sürümlerde sadece yerel çalışma veya “Scratch Pad” gibi seçenekler daha belirgin hale getirildi. Yine de bazı ekipler, özellikle API verilerinin şirket dışına çıkmaması gereken ortamlarda alternatif araçları değerlendirmeye başladı.&lt;/p&gt;

&lt;p&gt;Bu senaryo sizin için geçerliyse &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; değerlendirilebilir. Apidog; API tasarımı, hata ayıklama, mock server, test ve dokümantasyonu tek platformda birleştirir. Insomnia dışa aktarımlarını içe aktarabildiği için mevcut koleksiyonları sıfırdan oluşturmanız gerekmez.&lt;/p&gt;

&lt;p&gt;Apidog ayrıca JavaScript yazmadan görsel assertion oluşturmayı destekler; ihtiyaç duyduğunuzda komut dosyaları da kullanabilirsiniz. API spesifikasyonu, test verileri ve mock server aynı proje içinde tutulduğunda testlerin gerçek sözleşmeden kopması daha zor olur.&lt;/p&gt;

&lt;p&gt;Denemek için &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirebilir&lt;/a&gt; ve mevcut bir Insomnia koleksiyonunu içe aktararak yan yana karşılaştırabilirsiniz. Daha fazla seçenek için &lt;a href="http://apidog.com/blog/online-api-testing-tools-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ücretsiz çevrimiçi API test araçları&lt;/a&gt; listesine de bakabilirsiniz.&lt;/p&gt;

&lt;p&gt;Insomnia hâlâ sade arayüzü, hızlı başlangıcı ve odaklı istemci deneyimiyle tek geliştiriciler ve küçük ekipler için güçlü bir seçenektir. Doğru araç seçimi, ekibinizin API yaşam döngüsünün ne kadarını tek yerde yönetmek istediğine bağlıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Insomnia ücretsiz mi?
&lt;/h3&gt;

&lt;p&gt;Evet. Insomnia'nın bireysel kullanım için yeterli olan ücretsiz bir katmanı vardır. İstek gönderme ve test paketlerini yerel olarak çalıştırma gibi temel özellikleri kullanabilirsiniz. Ücretli planlar daha çok ekip işbirliği ve bulut senkronizasyon limitleriyle ilgilidir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insomnia hangi protokolleri destekler?
&lt;/h3&gt;

&lt;p&gt;Insomnia HTTP, REST, GraphQL, gRPC, SOAP ve WebSocket destekler. İstek yapılandırması protokole göre değişebilir; ancak yanıt inceleme ve HTTP tabanlı test akışları benzer şekilde çalışır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insomnia'da assertion nasıl yazılır?
&lt;/h3&gt;

&lt;p&gt;Koleksiyonda &lt;strong&gt;Tests&lt;/strong&gt; görünümünü açın, bir test paketi oluşturun ve JavaScript testleri ekleyin. Test içinde &lt;code&gt;insomnia.send()&lt;/code&gt; ile isteği çalıştırın, ardından Chai tarzı &lt;code&gt;expect&lt;/code&gt; ifadeleriyle durum kodunu, header'ları veya gövde alanlarını kontrol edin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Insomnia 8'de ne değişti?
&lt;/h3&gt;

&lt;p&gt;Insomnia 8, bulut öncelikli bir varsayılan modele geçti ve kullanıcıları Kong hesabıyla oturum açmaya ve projeleri buluta senkronize etmeye yönlendirdi. Bu değişiklik, tamamen yerel çalışmayı tercih eden bazı kullanıcılar tarafından olumsuz karşılandı. Sonraki güncellemelerde yerel çalışma seçenekleri daha görünür hale getirildi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insomnia testlerini CI hattında çalıştırabilir miyim?
&lt;/h3&gt;

&lt;p&gt;Evet. Inso komut satırı aracını kullanabilirsiniz. Koleksiyonunuzu dışa aktarın veya senkronize edin, ardından CI hattınızda şu komutu çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inso run &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;paket adı&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testlerden biri başarısız olursa Inso sıfır olmayan exit code döndürür ve CI derlemesi otomatik olarak başarısız olabilir.&lt;/p&gt;

</description>
      <category>api</category>
      <category>testing</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Pytest API Otomatik Test Framework'ü: Uygulamalı Eğitim</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:35:40 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/pytest-api-otomatik-test-frameworku-uygulamali-egitim-4j51</link>
      <guid>https://forem.com/tobiass_hoffmann/pytest-api-otomatik-test-frameworku-uygulamali-egitim-4j51</guid>
      <description>&lt;p&gt;Python geliştiricileri pytest'i tercih eder çünkü API testlerini az kalıp kodla yazmayı sağlar: test fonksiyonu &lt;code&gt;test_&lt;/code&gt; ile başlar, doğrulama için düz &lt;code&gt;assert&lt;/code&gt; kullanılır ve çalıştırmayı pytest yönetir. &lt;code&gt;requests&lt;/code&gt; ile birlikte kullandığınızda, API testleri için pratik, kod-öncelikli ve otomasyona uygun bir temel elde edersiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu rehberde gerçekçi bir pytest API test paketi kuracağız. Projeyi hazırlayacak, ilk istek testini yazacak, ortak kurulumu fixture'lara taşıyacak, &lt;code&gt;parametrize&lt;/code&gt; ile aynı testi farklı girdilerle çalıştıracak ve yanıt durumunu, gövdesini ve JSON Şemasını doğrulayacağız.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projenin Kurulumu
&lt;/h2&gt;

&lt;p&gt;Önce sanal ortam oluşturun ve gerekli paketleri yükleyin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install &lt;/span&gt;pytest requests jsonschema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows kullanıyorsanız aktivasyon komutu şu şekilde olur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basit ve sürdürülebilir bir klasör yapısı kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api-tests/
  conftest.py        # ortak fixture'lar
  test_users.py      # users endpoint testleri
  test_orders.py     # orders endpoint testleri
  pytest.ini         # pytest yapılandırması
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pytest testleri otomatik keşfeder. Şu kurallara uymanız yeterlidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test dosyaları &lt;code&gt;test_&lt;/code&gt; ile başlamalı veya &lt;code&gt;_test.py&lt;/code&gt; ile bitmelidir.&lt;/li&gt;
&lt;li&gt;Test fonksiyonları &lt;code&gt;test_&lt;/code&gt; ile başlamalıdır.&lt;/li&gt;
&lt;li&gt;Test sınıfları &lt;code&gt;Test&lt;/code&gt; ile başlamalı ve &lt;code&gt;__init__&lt;/code&gt; içermemelidir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek &lt;code&gt;pytest.ini&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[pytest]&lt;/span&gt;
&lt;span class="py"&gt;testpaths&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
&lt;span class="py"&gt;python_files&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;test_*.py *_test.py&lt;/span&gt;
&lt;span class="py"&gt;python_functions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;test_*&lt;/span&gt;
&lt;span class="py"&gt;addopts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otomatik test disiplini sizin için yeniyse, &lt;a href="http://apidog.com/blog/what-is-automated-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;otomatik testin ne olduğu&lt;/a&gt; hakkındaki başlangıç rehberi iyi bir bağlam sağlar.&lt;/p&gt;

&lt;p&gt;API testi için pytest kullanmanın pratik nedeni şudur: &lt;code&gt;requests&lt;/code&gt; HTTP isteklerini yönetir, pytest ise test keşfi, okunabilir hata çıktısı, fixture tabanlı kurulum, veri odaklı testler ve raporlama tarafını çözer. Testler uygulama koduyla aynı depoda yaşadığında, API değişiklikleri ve bozulan testler aynı pull request içinde görünür hale gelir.&lt;/p&gt;

&lt;h2&gt;
  
  
  İlk API Testinizi Yazma
&lt;/h2&gt;

&lt;p&gt;Bir pytest API testi genellikle üç adımdan oluşur:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HTTP isteği gönder.&lt;/li&gt;
&lt;li&gt;Yanıtı parse et.&lt;/li&gt;
&lt;li&gt;Durum kodunu ve gövdeyi doğrula.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_user_returns_200&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/users/42&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_user_returns_expected_fields&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/users/42&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;active&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testleri çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Başarısız bir &lt;code&gt;assert&lt;/code&gt;, beklenen ve gerçek değerleri okunabilir şekilde gösterir. Özel assertion helper'ları yazmanız gerekmez; pytest düz &lt;code&gt;assert&lt;/code&gt; ifadelerini zengin hata çıktısı üretecek şekilde işler.&lt;/p&gt;

&lt;p&gt;API yanıtlarında kontrol etmeniz gereken alanlar hakkında daha fazla örnek için &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API doğrulamaları&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kurulumu Fixture'lar ile Paylaşma
&lt;/h2&gt;

&lt;p&gt;Her testte &lt;code&gt;BASE_URL&lt;/code&gt;, header veya HTTP session tekrar etmek sürdürülebilir değildir. Bu tür ortak kurulumu fixture'a taşıyın.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;conftest.py&lt;/code&gt; dosyası, tüm test dosyaları tarafından otomatik kullanılabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# conftest.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@pytest.fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;

    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@pytest.fixture&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;auth_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/auth/login&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qa@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test-pass&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;scope="session"&lt;/code&gt; session nesnesinin tüm test çalıştırması boyunca bir kez oluşturulmasını sağlar.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;yield&lt;/code&gt; öncesi kurulum, sonrası temizlik adımıdır.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auth_token&lt;/code&gt;, ihtiyaç duyan testlere token sağlar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test içinde fixture'ları parametre olarak çağırmanız yeterlidir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_create_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fixture'lar, &lt;code&gt;setup_function&lt;/code&gt; ve &lt;code&gt;teardown_function&lt;/code&gt; yaklaşımına göre daha esnektir. Bağımlılıkları açık hale getirir, farklı kapsamları destekler ve kolayca birleştirilebilir. Detaylar için resmi &lt;a href="https://docs.pytest.org/en/stable/how-to/fixtures.html" rel="noopener noreferrer"&gt;pytest fixture'lar dokümantasyonu&lt;/a&gt; incelenebilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bir Testi Birçok Girdiyle Çalıştırma
&lt;/h2&gt;

&lt;p&gt;API endpoint'leri genellikle farklı girdilerle test edilmelidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geçerli değerler&lt;/li&gt;
&lt;li&gt;Geçersiz değerler&lt;/li&gt;
&lt;li&gt;Sınır değerler&lt;/li&gt;
&lt;li&gt;Bulunamayan kaynaklar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aynı test fonksiyonunu farklı girdilerle çalıştırmak için &lt;code&gt;@pytest.mark.parametrize&lt;/code&gt; kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;

&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@pytest.mark.parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id, expected_status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;99999&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_user_status_codes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expected_status&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/users/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;expected_status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu tek fonksiyon dört ayrı test case üretir. Her biri bağımsız raporlanır; bir girdinin başarısız olması diğerlerini gizlemez.&lt;/p&gt;

&lt;p&gt;Girdi seti büyüdüğünde test verisini CSV veya JSON dosyasından yüklemek daha okunabilir olabilir. Bu desen için &lt;a href="http://apidog.com/blog/data-driven-api-testing-tool-csv-json?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CSV ve JSON ile veri odaklı API testi&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;p&gt;Beklenen durum kodlarını seçerken tutarlı olmak için &lt;a href="http://apidog.com/blog/which-http-status-codes-rest-apis-should-use?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST API'lerinin kullanması gereken HTTP durum kodları&lt;/a&gt; referansı da yararlıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yanıt Gövdesi ve Şeması Üzerine Doğrulama
&lt;/h2&gt;

&lt;p&gt;Durum kodu tek başına yeterli değildir. &lt;code&gt;200 OK&lt;/code&gt; dönen ama eksik veya hatalı gövde içeren bir yanıt hâlâ hatadır.&lt;/p&gt;

&lt;p&gt;Örnek gövde doğrulaması:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_order_response_shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;total_seconds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu test şunları kontrol eder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yanıtın başarılı oluşturma kodu dönmesi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; alanının integer olması&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;quantity&lt;/code&gt; değerinin istekle uyumlu olması&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;total&lt;/code&gt; değerinin pozitif olması&lt;/li&gt;
&lt;li&gt;Yanıt süresinin belirlenen sınırın altında kalması&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Daha güçlü yapısal kontrol için JSON Şeması kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;jsonschema&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt;

&lt;span class="n"&gt;order_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_order_matches_schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;

    &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;order_schema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şema doğrulaması, tek tek alan kontrolüne göre daha iyi ölçeklenir. Eksik alan, yeniden adlandırılmış alan veya yanlış veri tipi gibi sözleşme bozulmalarını daha erken yakalar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jsonschema&lt;/code&gt; kullanımı için &lt;a href="https://python-jsonschema.readthedocs.io/" rel="noopener noreferrer"&gt;doğrulama dokümantasyonu&lt;/a&gt; desteklenen anahtar kelimeleri açıklar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paketi CI'da Çalıştırma
&lt;/h2&gt;

&lt;p&gt;Pytest başarısız testlerde sıfır olmayan çıkış kodu döndürür. Bu, CI sisteminin build'i başarısız sayması için yeterlidir.&lt;/p&gt;

&lt;p&gt;JUnit raporu üretmek için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--junitxml&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;results.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutu GitHub Actions, GitLab CI veya başka bir pipeline adımına ekleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Örnek GitHub Actions adımı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api-tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Python&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.12"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;python -m pip install --upgrade pip&lt;/span&gt;
          &lt;span class="s"&gt;pip install pytest requests jsonschema&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API tests&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://staging.example.com/v1&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;pytest -v --junitxml=results.xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CI/CD kurulumu, secret enjeksiyonu ve ortam seçimi için &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD pipeline'larındaki API testleri&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ortam Değişkeni Kullanın
&lt;/h3&gt;

&lt;p&gt;Token, parola veya ortam URL'sini test dosyalarına sabit kodlamayın. Bunun yerine ortam değişkeni okuyun:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://staging.example.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Token için de aynı yaklaşımı kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;AUTH_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API_AUTH_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sayede aynı test paketi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yerelde&lt;/li&gt;
&lt;li&gt;Staging ortamında&lt;/li&gt;
&lt;li&gt;CI pipeline içinde&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;kod değişikliği yapmadan çalışabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paralel Çalıştırmayı Düşünün
&lt;/h3&gt;

&lt;p&gt;Testler bağımsızsa &lt;code&gt;pytest-xdist&lt;/code&gt; ile paralel çalıştırabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pytest-xdist
pytest &lt;span class="nt"&gt;-n&lt;/span&gt; auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pytest -n auto&lt;/code&gt;, testleri CPU çekirdeklerine dağıtır. Ancak paralel çalışma için testlerinizin ortak duruma bağımlı olmaması gerekir. Çalıştırma sırasına bağlı testler paralel ortamda kararsız şekilde başarısız olur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bir pytest Paketini Sürdürülebilir Tutmak
&lt;/h2&gt;

&lt;p&gt;Küçük bir test paketi kolay yönetilir. Paket büyüdükçe yapılandırma ve organizasyon önem kazanır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testleri Modüllere Ayırın
&lt;/h3&gt;

&lt;p&gt;Endpoint veya domain bazlı dosyalar kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test_users.py
test_orders.py
test_payments.py
test_auth.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sınıfları yalnızca gerçekten ortak kurulum paylaşıyorsanız kullanın. Sadece gruplama amacıyla sınıf eklemek genellikle gereksizdir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Marker Kullanın
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pytest.ini&lt;/code&gt; içinde marker'ları kaydedin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[pytest]&lt;/span&gt;
&lt;span class="py"&gt;markers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="err"&gt;smoke:&lt;/span&gt; &lt;span class="err"&gt;hızlı&lt;/span&gt; &lt;span class="err"&gt;temel&lt;/span&gt; &lt;span class="err"&gt;kontroller&lt;/span&gt;
    &lt;span class="err"&gt;slow:&lt;/span&gt; &lt;span class="err"&gt;uzun&lt;/span&gt; &lt;span class="err"&gt;süren&lt;/span&gt; &lt;span class="err"&gt;testler&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testlerde kullanın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;

&lt;span class="nd"&gt;@pytest.mark.smoke&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_user_returns_200&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/users/42&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alt küme çalıştırmak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pytest &lt;span class="nt"&gt;-m&lt;/span&gt; smoke
pytest &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"not slow"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pratik bir CI stratejisi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Her commit'te &lt;code&gt;smoke&lt;/code&gt; testleri çalıştırın.&lt;/li&gt;
&lt;li&gt;Gecelik pipeline'da tam paketi çalıştırın.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Yapılandırmayı Merkezileştirin
&lt;/h3&gt;

&lt;p&gt;Temel URL'ler, ortak header'lar, şemalar ve fixture'lar tek yerde durmalıdır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;conftest.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;schemas/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;helpers/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aynı kodu ikinci kez yazıyorsanız, fixture veya yardımcı fonksiyona taşıyın. Bu modüler yaklaşım, &lt;a href="http://apidog.com/blog/how-to-write-automated-test-scripts?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;otomatik test betikleri yazma&lt;/a&gt; rehberinde anlatılan disiplinle aynıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bunun Yerine Ne Zaman Bir Platforma Başvurmalı
&lt;/h2&gt;

&lt;p&gt;Pytest, ekibiniz Python yazıyorsa ve testlerin uygulama koduyla aynı depoda yaşamasını istiyorsanız güçlü bir seçenektir.&lt;/p&gt;

&lt;p&gt;Ancak şu durumlarda tek başına pytest daha fazla bakım gerektirebilir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QA veya ürün ekibi kod yazmadan test katkısı yapmak istiyorsa&lt;/li&gt;
&lt;li&gt;Test tasarımı, mocking ve yürütme tek yerde yönetilmek isteniyorsa&lt;/li&gt;
&lt;li&gt;OpenAPI sözleşmesine göre otomatik şema doğrulaması merkezi bir ihtiyaçsa&lt;/li&gt;
&lt;li&gt;Veri odaklı testleri arayüz üzerinden yönetmek daha pratikse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; bu boşluğu kapatır. Görsel test oluşturma, OpenAPI spesifikasyonuna karşı şema doğrulaması, CSV ve JSON'dan veri odaklı çalıştırmalar ve CI için CLI çalıştırıcısı sunar; bunlar fixture ve doğrulama kodunu manuel yazmadan yapılabilir.&lt;/p&gt;

&lt;p&gt;Birçok ekip iki yaklaşımı birlikte kullanır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mantık ağırlıklı, kodla sıkı bağlı senaryolar için pytest&lt;/li&gt;
&lt;li&gt;Daha geniş kapsam, API tasarımı, mocking ve sözleşme doğrulaması için &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirebilir&lt;/a&gt; ve aynı endpoint üzerinde iki yaklaşımı karşılaştırabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça Sorulan Sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  API Testi İçin Python'ın Yerleşik unittest'i Yerine Neden pytest Kullanılmalı?
&lt;/h3&gt;

&lt;p&gt;Pytest daha az kalıp kod gerektirir. Testler düz fonksiyonlardır, doğrulamalar düz &lt;code&gt;assert&lt;/code&gt; ifadeleridir ve fixture'lar kurulumu &lt;code&gt;unittest&lt;/code&gt; sınıf metotlarından daha esnek şekilde yönetir.&lt;/p&gt;

&lt;p&gt;Ayrıca pytest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geniş eklenti ekosistemine sahiptir.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parametrize&lt;/code&gt; ile veri odaklı testleri yerleşik destekler.&lt;/li&gt;
&lt;li&gt;Mevcut &lt;code&gt;unittest&lt;/code&gt; tarzı testleri de çalıştırabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu nedenle geçiş riski düşüktür.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixture ve Parametrize Arasındaki Fark Nedir?
&lt;/h3&gt;

&lt;p&gt;Fixture, yeniden kullanılabilir kaynak sağlar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP session&lt;/li&gt;
&lt;li&gt;Auth token&lt;/li&gt;
&lt;li&gt;Test verisi&lt;/li&gt;
&lt;li&gt;Geçici kaynak oluşturma/temizleme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;parametrize&lt;/code&gt; ise aynı test gövdesini farklı girdilerle birden fazla kez çalıştırır.&lt;/p&gt;

&lt;p&gt;Kısa fark:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixture kurulumu paylaşır.&lt;/li&gt;
&lt;li&gt;Parametrize test senaryolarını çoğaltır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Birlikte de kullanılabilirler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@pytest.mark.parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/users/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pytest API Testlerinde Yanıt Süresini Doğrulamalı mıyım?
&lt;/h3&gt;

&lt;p&gt;Evet, temel regresyonları yakalamak için kullanabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;total_seconds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak pytest bir yük testi aracı değildir. Gerçek performans veya kapasite testi için özel yük testi araçları kullanılmalıdır.&lt;/p&gt;

&lt;p&gt;Zamanlama doğrulamalarını çok sıkı yazmayın. Ağ değişkenliği, aksi halde kararsız testlere neden olabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pytest'te API Testlerini Nasıl Bağımsız Tutarım?
&lt;/h3&gt;

&lt;p&gt;Her test kendi verisini oluşturmalı ve gerekiyorsa temizlemelidir. Bunu fixture'larla yapabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@pytest.fixture&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;created_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;

    &lt;span class="n"&gt;api_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/orders/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test yürütme sırasına güvenmeyin. Bağımsız testler paralel çalışabilir, izole başarısız olur ve hata ayıklaması daha kolaydır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pytest Yanıtları Bir OpenAPI Spesifikasyonuna Göre Doğrulayabilir mi?
&lt;/h3&gt;

&lt;p&gt;Pytest bunu tek başına yapmaz. Ancak &lt;code&gt;jsonschema&lt;/code&gt; ile JSON Şeması doğrulaması yapabilirsiniz ve OpenAPI belgesine göre yanıt kontrol eden eklentiler de mevcuttur.&lt;/p&gt;

&lt;p&gt;Şema doğrulaması iş akışınızın merkezindeyse, OpenAPI spesifikasyonuna karşı otomatik doğrulama yapan Apidog gibi bir platform eklenti ve bakım yükünü azaltabilir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Postman ve JMeter Arasındaki Farklar</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:35:12 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/postman-ve-jmeter-arasindaki-farklar-4ph</link>
      <guid>https://forem.com/tobiass_hoffmann/postman-ve-jmeter-arasindaki-farklar-4ph</guid>
      <description>&lt;p&gt;İnsanlar genellikle Postman ve JMeter'ı rakip gibi karşılaştırır. Bu doğru bir model değil: Postman, API'nin doğru yanıt verip vermediğini doğrular; JMeter ise API'nin yük altında ayakta kalıp kalmadığını ölçer. Kısaca Postman “bu endpoint doğru veriyi döndürüyor mu?”, JMeter ise “2.000 kullanıcı aynı anda istek gönderirse sistem ne olur?” sorusuna cevap verir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu ayrımı yanlış yapmak üretim hatalarına yol açar. Bir ekip Postman koleksiyonundaki tüm testleri yeşil görüp API'yi üretime hazır sanabilir; ancak eşzamanlı kullanıcı altında yanıt süresini hiç ölçmemiş olabilir. Tersi de geçerlidir: JMeter ile yük testi yapmak, bozuk bir JSON alanını otomatik olarak yakalayacağınız anlamına gelmez. Bu yazı, hangi durumda hangi aracı kullanmanız gerektiğini pratik olarak netleştirir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman ne için kullanılır?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; bir API istemcisi ve işbirliği platformudur. İstek oluşturur, koleksiyonlara ayırır, ortam değişkenleri tanımlar ve her yanıt sonrasında çalışan JavaScript testleri yazarsınız.&lt;/p&gt;

&lt;p&gt;Postman'ın ana kullanım alanı işlevsel API testidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP durum kodunu doğrulama&lt;/li&gt;
&lt;li&gt;Yanıt gövdesindeki alanları kontrol etme&lt;/li&gt;
&lt;li&gt;Header doğrulama&lt;/li&gt;
&lt;li&gt;JSON şema veya sözleşme kontrolü&lt;/li&gt;
&lt;li&gt;Regresyon testlerini CI içinde çalıştırma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek bir Postman test betiği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status is 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response has a user id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu test şunu doğrular:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Endpoint &lt;code&gt;200 OK&lt;/code&gt; dönüyor mu?&lt;/li&gt;
&lt;li&gt;Yanıt içinde &lt;code&gt;id&lt;/code&gt; alanı var mı?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; sayısal mı?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bu, tek istekli ve doğrulama odaklı bir testtir. Collection Runner aynı koleksiyonu veri dosyalarıyla döngüye alabilir. Postman CLI veya Newman ile bu koleksiyonları CI/CD hattında çalıştırabilirsiniz. Ancak temel amaç değişmez: API'nin beklenen davranışı üretip üretmediğini kontrol etmek.&lt;/p&gt;

&lt;p&gt;API yanıtlarını daha sistematik doğrulamak için &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API doğrulamaları&lt;/a&gt; rehberine de bakabilirsiniz.&lt;/p&gt;

&lt;p&gt;Postman özellikle şu aşamalarda kullanışlıdır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yeni endpoint geliştirirken hızlı deneme yapmak&lt;/li&gt;
&lt;li&gt;Pull request başına regresyon testi çalıştırmak&lt;/li&gt;
&lt;li&gt;API sözleşmesini doğrulamak&lt;/li&gt;
&lt;li&gt;QA ve backend ekiplerinin ortak koleksiyon kullanmasını sağlamak&lt;/li&gt;
&lt;li&gt;API dokümantasyonu ve örnek yanıtları yönetmek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ancak Postman'ın asıl hedefi performans ölçümü değildir.&lt;/p&gt;

&lt;h2&gt;
  
  
  JMeter ne için kullanılır?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;Apache JMeter&lt;/a&gt; yük ve performans testi aracıdır. Bir Thread Group tanımlarsınız; bu grup simüle edilmiş kullanıcıları temsil eder. Ardından şu parametreleri ayarlarsınız:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kaç sanal kullanıcı çalışacak?&lt;/li&gt;
&lt;li&gt;Kullanıcılar ne kadar sürede artacak?&lt;/li&gt;
&lt;li&gt;Test kaç kez dönecek?&lt;/li&gt;
&lt;li&gt;Hangi endpoint'lere istek gönderilecek?&lt;/li&gt;
&lt;li&gt;Yanıt süreleri, hata oranları ve throughput nasıl ölçülecek?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JMeter'ın cevapladığı sorular şunlardır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 kullanıcı aktifken 95. yüzdelik dilim yanıt süresi nedir?&lt;/li&gt;
&lt;li&gt;Hata oranı hangi istek hızında %1'i geçiyor?&lt;/li&gt;
&lt;li&gt;300 eşzamanlı oturumda veritabanı bağlantı havuzu darboğaz oluyor mu?&lt;/li&gt;
&lt;li&gt;Sistem saatlerce süren trafik altında bellek sızdırıyor mu?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunlar tek tek istek gönderen bir araçla güvenilir şekilde ölçülemez.&lt;/p&gt;

&lt;p&gt;JMeter yalnızca HTTP için kullanılmaz. Şunları da test edebilir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JDBC veritabanı sorguları&lt;/li&gt;
&lt;li&gt;JMS mesajlaşma&lt;/li&gt;
&lt;li&gt;FTP&lt;/li&gt;
&lt;li&gt;SMTP&lt;/li&gt;
&lt;li&gt;TCP&lt;/li&gt;
&lt;li&gt;HTTP/HTTPS servisleri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu nedenle JMeter, tek bir REST endpoint'inden çok daha geniş sistem yüklerini modellemek için kullanılır.&lt;/p&gt;

&lt;p&gt;Performans testi metriklerine yeni başlıyorsanız, &lt;a href="http://apidog.com/blog/performance-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;performans testi genel bakışı&lt;/a&gt; temel kavramları açıklar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman ve JMeter karşılaştırması
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Yön&lt;/th&gt;
&lt;th&gt;Postman&lt;/th&gt;
&lt;th&gt;JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Birincil amaç&lt;/td&gt;
&lt;td&gt;İşlevsel ve entegrasyon API testi&lt;/td&gt;
&lt;td&gt;Yük, stres ve performans testi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temel soru&lt;/td&gt;
&lt;td&gt;Yanıt doğru mu?&lt;/td&gt;
&lt;td&gt;API yük altında dayanıyor mu?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eşzamanlılık modeli&lt;/td&gt;
&lt;td&gt;Tek seferde bir istek; Runner sıralı döngü yapar&lt;/td&gt;
&lt;td&gt;Paralel çalışan çok sayıda sanal kullanıcı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protokoller&lt;/td&gt;
&lt;td&gt;HTTP, HTTPS, GraphQL, WebSocket, gRPC&lt;/td&gt;
&lt;td&gt;HTTP, JDBC, JMS, FTP, SMTP, TCP ve daha fazlası&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Betikleme&lt;/td&gt;
&lt;td&gt;JavaScript test betikleri&lt;/td&gt;
&lt;td&gt;Groovy, BeanShell, Java örnekleyicileri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Çıktı&lt;/td&gt;
&lt;td&gt;İstek başına başarılı/başarısız doğrulamalar&lt;/td&gt;
&lt;td&gt;Gecikme yüzdelikleri, throughput, hata oranı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Öğrenme eğrisi&lt;/td&gt;
&lt;td&gt;Başlangıç dostu&lt;/td&gt;
&lt;td&gt;Daha dik; performans mühendisliğine daha yakın&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En uygun aşama&lt;/td&gt;
&lt;td&gt;Geliştirme, entegrasyon, regresyon&lt;/td&gt;
&lt;td&gt;Yayın öncesi kapasite ve stres doğrulama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raporlama&lt;/td&gt;
&lt;td&gt;Test sonuçları, Postman CLI çıktıları&lt;/td&gt;
&lt;td&gt;HTML raporları, grafikler, yüzdelikler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;En kritik fark eşzamanlılık modelidir. Postman Collection Runner döngü yapar, ancak yüzlerce veya binlerce kullanıcının aynı anda endpoint'e istek göndermesini gerçekçi şekilde simüle etmez. JMeter'ın mimarisi tam olarak bu iş için tasarlanmıştır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman ne zaman kullanılmalı?
&lt;/h2&gt;

&lt;p&gt;Postman'ı doğruluk sorularını cevaplamak için kullanın.&lt;/p&gt;

&lt;p&gt;Örnek senaryolar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yeni bir endpoint geliştiriyorsunuz.&lt;/li&gt;
&lt;li&gt;Yanıt gövdesinde zorunlu alanları doğrulamak istiyorsunuz.&lt;/li&gt;
&lt;li&gt;Her pull request'te regresyon testi çalıştırmak istiyorsunuz.&lt;/li&gt;
&lt;li&gt;API'nin yayınlanmış şemayla uyumlu kalmasını istiyorsunuz.&lt;/li&gt;
&lt;li&gt;QA ekibi kod yazmadan API davranışını test etmeli.&lt;/li&gt;
&lt;li&gt;Mock servis veya örnek yanıtlarla geliştirme hızlanmalı.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örneğin bir kullanıcı oluşturma endpoint'i için şu kontrolleri yazabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User is created&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response contains email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu test, endpoint'in işlevsel olarak doğru çalıştığını gösterir. Ancak aynı endpoint'in 1.000 eşzamanlı kullanıcıda ne yapacağını göstermez.&lt;/p&gt;

&lt;p&gt;Postman'ı CI içinde kullanmak için tipik akış şudur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;postman collection run ./collection.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;veya Newman ile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run ./collection.json &lt;span class="nt"&gt;-e&lt;/span&gt; ./environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir doğrulama başarısız olursa pipeline'ı durdurabilirsiniz. Bu yük testi değildir; işlevsel regresyon testidir ve mümkünse her commit veya pull request içinde çalışmalıdır.&lt;/p&gt;

&lt;p&gt;API sözleşmesi kontrolleri için &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;sözleşme testi&lt;/a&gt; yaklaşımını da kullanabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  JMeter sonucu nasıl okunur?
&lt;/h2&gt;

&lt;p&gt;JMeter çıktısı yalnızca “başarılı” veya “başarısız” değildir. Sayıları doğru yorumlamanız gerekir.&lt;/p&gt;

&lt;p&gt;En önemli metrikler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Yüzdelik dilim gecikmeleri&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hata oranı&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eşzamanlı kullanıcı sayısı&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test süresi&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ortalama yanıt süresi tek başına yeterli değildir. Birkaç hızlı istek, yavaş isteklerin etkisini gizleyebilir. Bu yüzden özellikle şu değerlere bakın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;90. yüzdelik dilim&lt;/li&gt;
&lt;li&gt;95. yüzdelik dilim&lt;/li&gt;
&lt;li&gt;99. yüzdelik dilim&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örneğin:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;yüzdelik dilim yanıt süresi 1.8 saniye ise, isteklerin %5'i 1.8 saniyeden daha uzun sürüyor demektir.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu, ortalama iyi görünse bile kullanıcı deneyimi açısından sorun olabilir.&lt;/p&gt;

&lt;p&gt;Throughput, sistemin saniyede tamamladığı istek sayısıdır. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Throughput: 850 req/sec
Error rate: 0.3%
P95 latency: 420 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sonuç genellikle sağlıklı görünebilir. Ancak şu sonuç farklı yorumlanır:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Throughput: 900 req/sec
Error rate: 6%
P95 latency: 380 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yanıt süresi düşük olsa bile %6 hata oranı kabul edilemez. Sistem hızlı yanıt veriyor olabilir, ancak isteklerin önemli bir kısmını başarısız döndürüyor.&lt;/p&gt;

&lt;p&gt;Bu nedenle JMeter sonucunu her zaman birlikte okuyun:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;P95/P99 gecikme&lt;/li&gt;
&lt;li&gt;Throughput&lt;/li&gt;
&lt;li&gt;Hata oranı&lt;/li&gt;
&lt;li&gt;Uygulanan eşzamanlı kullanıcı sayısı&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;50 kullanıcıyla yapılan test, 1.000 kullanıcılı gerçek davranış hakkında yeterli bilgi vermez.&lt;/p&gt;

&lt;h2&gt;
  
  
  JMeter ne zaman kullanılmalı?
&lt;/h2&gt;

&lt;p&gt;JMeter'ı ölçeklenebilirlik ve kapasite sorularını cevaplamak için kullanın.&lt;/p&gt;

&lt;p&gt;Uygun senaryolar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yayın öncesi API kapasitesini ölçmek&lt;/li&gt;
&lt;li&gt;Bir lansman öncesi beklenen trafiği simüle etmek&lt;/li&gt;
&lt;li&gt;Otomatik ölçeklendirme kurallarını doğrulamak&lt;/li&gt;
&lt;li&gt;Bellek sızıntısı veya bağlantı tükenmesi aramak&lt;/li&gt;
&lt;li&gt;Uzun süreli soak test çalıştırmak&lt;/li&gt;
&lt;li&gt;Ani trafik artışlarını spike test ile modellemek&lt;/li&gt;
&lt;li&gt;Veritabanı veya cache darboğazlarını görmek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek bir test planı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread Group:
- Number of Threads: 1000
- Ramp-up Period: 300 seconds
- Loop Count: 10

HTTP Request:
- GET /api/search?q=laptop

Assertions:
- Status code is 200
- Response time &amp;lt; 1000 ms

Listeners:
- Summary Report
- Aggregate Report
- HTML Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ciddi JMeter çalıştırmalarını GUI yerine komut satırından çalıştırmak daha doğrudur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jmeter &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; search-load-test.jmx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-l&lt;/span&gt; results.jtl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; ./report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-n&lt;/code&gt;: GUI dışı mod&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: test planı dosyası&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-l&lt;/code&gt;: sonuç dosyası&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: HTML rapor üret&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-o&lt;/code&gt;: rapor klasörü&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kapasite planlama için JMeter sonuçları doğrudan kullanılabilir. Örneğin 1.000 eşzamanlı kullanıcıda P95 gecikme 400 ms altında kalıyor, ancak 1.500 kullanıcıda 2 saniyeyi geçiyorsa kapasite sınırınıza yaklaşmışsınız demektir.&lt;/p&gt;

&lt;p&gt;Daha yapılandırılmış bir akış için &lt;a href="http://apidog.com/blog/api-performance-testing-tutorial?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API performans testi eğitimi&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rakip değiller, tamamlayıcılar
&lt;/h2&gt;

&lt;p&gt;Olgun bir API test stratejisinde iki test türü de bulunur:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;İşlevsel testler:&lt;/strong&gt; API doğru yanıt veriyor mu?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performans testleri:&lt;/strong&gt; API beklenen trafik altında doğru ve hızlı yanıt veriyor mu?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Postman genellikle geliştirme ve regresyon aşamasında kullanılır. JMeter ise yayın öncesi kapasite ve stres doğrulamasında kullanılır.&lt;/p&gt;

&lt;p&gt;Sağlıklı bir pipeline şöyle görünebilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Commit / Pull Request
        ↓
Postman veya Apidog ile işlevsel testler
        ↓
Build ve deploy
        ↓
Staging ortamı
        ↓
JMeter veya performans testi
        ↓
Release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Her commit'te tam yük testi çalıştırmak çoğu ekip için pahalı ve yavaştır. Ancak işlevsel testleri sık çalıştırmak gerekir. Yük testleri ise genellikle şu zamanlarda çalıştırılır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Büyük release öncesi&lt;/li&gt;
&lt;li&gt;Altyapı değişikliği sonrası&lt;/li&gt;
&lt;li&gt;Veritabanı veya cache değişikliği sonrası&lt;/li&gt;
&lt;li&gt;Haftalık veya periyodik kapasite kontrolünde&lt;/li&gt;
&lt;li&gt;Büyük kampanya/lansman öncesi&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pratik örnek: arama endpoint'i
&lt;/h2&gt;

&lt;p&gt;Bir ekip &lt;code&gt;/search&lt;/code&gt; endpoint'i yayınlıyor olsun.&lt;/p&gt;

&lt;p&gt;Postman testleri şunları doğrular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geçerli sorgu &lt;code&gt;200 OK&lt;/code&gt; dönüyor.&lt;/li&gt;
&lt;li&gt;Yanıt içinde sonuç listesi var.&lt;/li&gt;
&lt;li&gt;Sayfalama doğru çalışıyor.&lt;/li&gt;
&lt;li&gt;Boş veya hatalı sorgular doğru hata kodu dönüyor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek Postman testi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Search returns results&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;items&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;an&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;array&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu testler yeşilse endpoint işlevsel olarak doğru görünebilir.&lt;/p&gt;

&lt;p&gt;Ancak iki hafta sonra bir pazarlama kampanyası trafiği 10 kat artırırsa ve her arama indekslenmemiş bir veritabanı taramasına neden olursa, yanıt süreleri 8 saniyeye çıkabilir. Postman bunu yakalayamaz çünkü tekil ve sıralı isteklerle çalışır.&lt;/p&gt;

&lt;p&gt;JMeter ile aynı endpoint için şu test yapılabilirdi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1000 sanal kullanıcı
5 dakikalık ramp-up
/search endpoint'ine sürekli istek
P95 latency hedefi: &amp;lt; 800 ms
Error rate hedefi: &amp;lt; 1%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu test, eksik veritabanı indeksini yayın öncesinde ortaya çıkarabilirdi.&lt;/p&gt;

&lt;p&gt;Tersi de mümkündür. Bir API 5.000 kullanıcıyı kaldırabilir, ancak cache hatası nedeniyle yanlış fiyat döndürebilir. Yük testi bunu otomatik yakalamaz. Doğruluk olmadan hız, yalnızca hızlı yanlış yanıtlardır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidog nerede devreye giriyor?
&lt;/h2&gt;

&lt;p&gt;İki ayrı aracı kurmak, senkronize etmek ve sürdürmek ağır geliyorsa, &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; API tasarımı, hata ayıklama, otomatik işlevsel test ve mock sunucuları tek platformda birleştirir.&lt;/p&gt;

&lt;p&gt;Apidog ile şunları aynı çalışma alanında yapabilirsiniz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API şeması tasarlama&lt;/li&gt;
&lt;li&gt;İstek gönderme ve debug etme&lt;/li&gt;
&lt;li&gt;Görsel doğrulamalarla test senaryosu oluşturma&lt;/li&gt;
&lt;li&gt;Test adımlarını zincirleme&lt;/li&gt;
&lt;li&gt;Otomatik test paketleri hazırlama&lt;/li&gt;
&lt;li&gt;Mock sunucu kullanma&lt;/li&gt;
&lt;li&gt;Performans testiyle kayıtlı API senaryolarını sanal kullanıcılar altında çalıştırma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yaklaşım, Postman ve JMeter benzeri ayrı araçlar arasında dışa aktarma, senkronizasyon ve bağlam değiştirme ihtiyacını azaltır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirebilir&lt;/a&gt; ve test özelliklerini deneyebilirsiniz. Alternatifleri karşılaştırmak isterseniz, &lt;a href="http://apidog.com/blog/best-postman-alternatives-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API testi için en iyi Postman alternatifleri&lt;/a&gt; özetine de bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Postman yük testi yapabilir mi?
&lt;/h3&gt;

&lt;p&gt;Anlamlı ölçekte değil. Collection Runner koleksiyonu sıralı olarak döngüye alır. Postman masaüstü uygulamasında temel performans özellikleri bulunsa da gerçekçi eşzamanlılık, ramp-up kontrolü ve ayrıntılı gecikme yüzdelikleri için JMeter, k6, Gatling veya Apidog'un performans testi modülü gibi araçlar daha uygundur.&lt;/p&gt;

&lt;h3&gt;
  
  
  JMeter işlevsel API testi yapabilir mi?
&lt;/h3&gt;

&lt;p&gt;Evet, Response Assertion ile durum kodu ve yanıt içeriği kontrol edilebilir. Ancak JMeter'ın güçlü olduğu alan doğrulama yoğun işlevsel testler değil, eşzamanlılık ve performans ölçümüdür. Çoğu ekip işlevsel testleri Postman veya Apidog'da, yük testlerini JMeter'da tutar.&lt;/p&gt;

&lt;h3&gt;
  
  
  JMeter öğrenmek Postman'dan daha mı zor?
&lt;/h3&gt;

&lt;p&gt;Evet. Postman ile birkaç dakika içinde istek gönderebilir ve basit doğrulamalar yazabilirsiniz. JMeter ise Thread Group, sampler, timer, listener, assertion ve GUI dışı çalıştırma gibi kavramlar gerektirir. Performans testi deneyiminiz yoksa öğrenme eğrisi daha diktir.&lt;/p&gt;

&lt;h3&gt;
  
  
  İki araca da ihtiyacım var mı?
&lt;/h3&gt;

&lt;p&gt;Gerçek kullanıcı trafiği alan API'ler yayınlıyorsanız iki test türüne de ihtiyacınız vardır: işlevsel test ve performans testi. Ancak bu mutlaka iki ayrı ürün kullanmanız gerektiği anlamına gelmez. Apidog gibi platformlar, işlevsel test ve performans testini aynı çalışma alanında birleştirebilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yavaş veritabanı sorgusunu hangi araç yakalar?
&lt;/h3&gt;

&lt;p&gt;Yük altında genellikle JMeter yakalar. Boşta duran bir sisteme yapılan tek Postman isteği hızlı dönebilir. Sorun ancak eşzamanlı trafik veritabanı bağlantıları ve indeksler üzerinde baskı oluşturduğunda görünür. JMeter'ın paralel kullanıcı modeli bu darboğazları ortaya çıkarır.&lt;/p&gt;

&lt;h3&gt;
  
  
  k6, Gatling ve Locust nerede devreye giriyor?
&lt;/h3&gt;

&lt;p&gt;Bunlar Postman alternatifi değil, JMeter alternatifi yük testi araçlarıdır. k6, Gatling ve Locust testleri kodla tanımlamayı tercih eden ekipler için uygundur. Ancak işlevsel API testinin yerini almazlar. Postman/JMeter ayrımı burada da geçerlidir: biri doğruluk, diğeri yük davranışı içindir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yük testlerini ne sıklıkla çalıştırmalıyım?
&lt;/h3&gt;

&lt;p&gt;İşlevsel testlerden daha seyrek. İşlevsel kontroller hızlı olduğu için her commit veya pull request'te çalıştırılabilir. Yük testleri ise daha yavaş ve kaynak yoğun olduğundan genellikle release öncesi, büyük altyapı değişikliklerinden sonra veya haftalık periyodik kontrollerde çalıştırılır.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Postman ile API Testi Nasıl Yapılır: Uygulamalı Rehber</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:31:08 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/postman-ile-api-testi-nasil-yapilir-uygulamali-rehber-2d9a</link>
      <guid>https://forem.com/tobiass_hoffmann/postman-ile-api-testi-nasil-yapilir-uygulamali-rehber-2d9a</guid>
      <description>&lt;p&gt;Postman, HTTP istekleri göndermek ve bir API'nin davranışını doğrulamak için en yaygın kullanılan araçlardan biridir. Hızlı bir &lt;code&gt;GET&lt;/code&gt; isteğinden CI’da çalışan test paketlerine kadar birçok API test senaryosunu destekler. API geliştiriyor veya tüketiyorsanız, Postman’i günlük iş akışınızda pratik bir test aracı olarak kullanabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu kılavuzda Postman ile bir API’yi adım adım test edeceksiniz: istek gönderecek, yanıtı inceleyecek, Testler/Betrikler alanında assertion yazacak, ortam değişkenleriyle staging ve production arasında geçiş yapacak ve Collection Runner ile tüm koleksiyonu çalıştıracaksınız. Örneklerde herkese açık JSONPlaceholder API’si kullanıldığı için ön kurulum yapmadan takip edebilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman’i Kurun ve İlk İsteğinizi Gönderin
&lt;/h2&gt;

&lt;p&gt;Postman’i &lt;a href="https://www.postman.com/downloads/" rel="noopener noreferrer"&gt;resmi siteden&lt;/a&gt; indirin ve masaüstü uygulamasını yükleyin. Yerel kullanım için hesap zorunlu değildir; ancak oturum açarsanız koleksiyonlarınızı cihazlar arasında senkronize edebilirsiniz.&lt;/p&gt;

&lt;p&gt;İlk isteği oluşturmak için:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Postman’i açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New / Yeni&lt;/strong&gt; düğmesine tıklayın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Request / HTTP İsteği&lt;/strong&gt; seçeneğini seçin.&lt;/li&gt;
&lt;li&gt;Metodu &lt;code&gt;GET&lt;/code&gt; olarak bırakın.&lt;/li&gt;
&lt;li&gt;Aşağıdaki URL’yi girin:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından &lt;strong&gt;Send / Gönder&lt;/strong&gt; düğmesine tıklayın.&lt;/p&gt;

&lt;p&gt;Yanıt panelinde şunları kontrol edin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Durum kodu: &lt;code&gt;200 OK&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Yanıt süresi&lt;/li&gt;
&lt;li&gt;Yanıt boyutu&lt;/li&gt;
&lt;li&gt;JSON response body&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JSON’u daha okunabilir görmek için gövde görünümünü &lt;strong&gt;Pretty&lt;/strong&gt;, &lt;strong&gt;Raw&lt;/strong&gt; veya &lt;strong&gt;Preview&lt;/strong&gt; arasında değiştirebilirsiniz.&lt;/p&gt;

&lt;p&gt;Bir &lt;code&gt;POST&lt;/code&gt; isteği denemek için:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Metodu &lt;code&gt;POST&lt;/code&gt; yapın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Body / Gövde&lt;/strong&gt; sekmesine geçin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;raw&lt;/strong&gt; seçeneğini seçin.&lt;/li&gt;
&lt;li&gt;Formatı &lt;strong&gt;JSON&lt;/strong&gt; olarak ayarlayın.&lt;/li&gt;
&lt;li&gt;Aşağıdaki gövdeyi ekleyin:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maria Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maria.chen@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON gövde tipi seçildiğinde Postman genellikle &lt;code&gt;Content-Type: application/json&lt;/code&gt; başlığını otomatik ekler. Gerekirse &lt;strong&gt;Headers / Başlıklar&lt;/strong&gt; sekmesinden &lt;code&gt;Authorization&lt;/code&gt;, &lt;code&gt;Accept&lt;/code&gt; veya özel header’lar ekleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;HTTP durum kodlarını nasıl yorumlamanız gerektiğinden emin değilseniz, &lt;a href="http://apidog.com/blog/which-http-status-codes-rest-apis-should-use?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST API’lerinin kullanması gereken HTTP durum kodları&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  İstekleri Koleksiyonlar Halinde Düzenleyin
&lt;/h2&gt;

&lt;p&gt;Tek bir istek hızlı kontrol için yeterlidir. Ancak gerçek API testi genellikle birden fazla isteği kapsar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kullanıcı oluşturma&lt;/li&gt;
&lt;li&gt;Kullanıcıyı getirme&lt;/li&gt;
&lt;li&gt;Kullanıcıyı güncelleme&lt;/li&gt;
&lt;li&gt;Kullanıcıyı silme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postman’de bu istekleri &lt;strong&gt;Collection / Koleksiyon&lt;/strong&gt; altında gruplandırabilirsiniz.&lt;/p&gt;

&lt;p&gt;Koleksiyon oluşturmak için:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sol menüden &lt;strong&gt;Collections / Koleksiyonlar&lt;/strong&gt; sekmesine gidin.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; simgesine tıklayın.&lt;/li&gt;
&lt;li&gt;Koleksiyona açıklayıcı bir ad verin, örneğin: &lt;code&gt;Kullanıcı API duman testleri&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Her isteği &lt;code&gt;Ctrl/Cmd + S&lt;/code&gt; ile bu koleksiyona kaydedin.&lt;/li&gt;
&lt;li&gt;İstekleri anlamlı adlarla kaydedin:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Kullanıcı getir&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Kullanıcı oluştur&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Kullanıcı güncelle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Kullanıcı sil&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Daha düzenli bir yapı için koleksiyon içinde klasörler kullanabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kullanıcı API duman testleri
├── Auth
│   └── Login
├── Users
│   ├── Get user
│   ├── Create user
│   ├── Update user
│   └── Delete user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Koleksiyonlar aynı zamanda paylaşım birimidir. Bir koleksiyonu JSON olarak dışa aktarabilir veya Postman Cloud kullanıyorsanız bağlantı üzerinden paylaşabilirsiniz. Ekip arkadaşlarınız koleksiyonu içe aktardığında sizinle aynı istekleri, değişkenleri ve testleri kullanabilir.&lt;/p&gt;

&lt;p&gt;Koleksiyon düzeyinde ortak davranışlar da tanımlayabilirsiniz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre-request Script / Ön istek betiği&lt;/strong&gt;: Koleksiyondaki her istekten önce çalışır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests / Test betiği&lt;/strong&gt;: Koleksiyondaki her istekten sonra çalışır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örneğin tüm istekler için ortak response time kontrolü ekleyebilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response time is acceptable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseTime&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;below&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yaklaşım, aynı assertion’ı her isteğe tek tek yazmanızı engeller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testler Sekmesinde Assertion Yazın
&lt;/h2&gt;

&lt;p&gt;Bir istek göndermek, API’nin ne döndürdüğünü gösterir. Assertion ise dönen yanıtın doğru olup olmadığını otomatik doğrular.&lt;/p&gt;

&lt;p&gt;Postman, yanıt geldikten sonra JavaScript çalıştırır. Yeni sürümlerde bu alan genellikle &lt;strong&gt;Scripts / Betikler&lt;/strong&gt; altında bulunur; eski sürümlerde &lt;strong&gt;Tests / Testler&lt;/strong&gt; sekmesi olarak geçer.&lt;/p&gt;

&lt;p&gt;Temel yapı şöyledir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Test adı&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// assertion&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sık kullanılan assertion örnekleri:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Durum kodunu kontrol edin&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code is 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Yanıt süresini kontrol edin&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response is under 500ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseTime&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;below&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// JSON gövdesindeki bir alanı kontrol edin&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User has the expected email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;maria.chen@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Bir başlığı kontrol edin&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type is JSON&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman’in assertion sözdizimi Chai tabanlıdır. Bu nedenle aşağıdaki ifadeleri kullanabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expectedValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;above&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;below&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exist&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assertion yazarken şu pratik kuralları kullanın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Her &lt;code&gt;pm.test&lt;/code&gt; bloğunu tek bir beklentiye odaklayın.&lt;/li&gt;
&lt;li&gt;Test adını davranışa göre verin, örneğin: &lt;code&gt;User email is returned&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sadece istemciyi gerçekten etkileyen alanları kontrol edin.&lt;/li&gt;
&lt;li&gt;Rastgele veya sunucu tarafından üretilen değerlerde katı assertion yazmaktan kaçının.&lt;/li&gt;
&lt;li&gt;Önce durum kodunu, sonra response body yapısını doğrulayın.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek response body kontrolü:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User response has required fields&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman editörünün yanındaki &lt;strong&gt;Snippets / Kod Parçacıkları&lt;/strong&gt; paneli, sık kullanılan test kalıplarını hızlıca eklemek için kullanışlıdır.&lt;/p&gt;

&lt;p&gt;Assertion tasarımı hakkında daha detaylı bilgi için &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API onaylamalarının nasıl iyi yazılacağına&lt;/a&gt; dair rehbere bakabilirsiniz. Testleri senaryo bazlı yapılandırmak istiyorsanız &lt;a href="http://apidog.com/blog/api-test-case-example?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API test senaryosu örneği&lt;/a&gt; rehberi de faydalıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ortamları ve Değişkenleri Kullanın
&lt;/h2&gt;

&lt;p&gt;API URL’lerini her isteğe sabit yazmak bakım maliyeti oluşturur. Örneğin staging ortamından production ortamına geçerken tüm URL’leri tek tek değiştirmeniz gerekir.&lt;/p&gt;

&lt;p&gt;Bunun yerine Postman &lt;strong&gt;Environment / Ortam&lt;/strong&gt; değişkenlerini kullanın.&lt;/p&gt;

&lt;p&gt;Örnek ortam değişkeni:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;base_url = https://jsonplaceholder.typicode.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ortam oluşturmak için:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sol menüden &lt;strong&gt;Environments / Ortamlar&lt;/strong&gt; bölümüne gidin.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Hazırlık&lt;/code&gt; adında bir ortam oluşturun.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;base_url&lt;/code&gt; değişkenini ekleyin.&lt;/li&gt;
&lt;li&gt;Değer olarak şunu girin:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://jsonplaceholder.typicode.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Artık isteği şöyle yazabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {{base_url}}/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sağ üstteki ortam seçicisinden aktif ortamı değiştirdiğinizde &lt;code&gt;{{base_url}}&lt;/code&gt; kullanan tüm istekler otomatik olarak yeni hedefe gider.&lt;/p&gt;

&lt;p&gt;Değişkenler, istekler arasında veri taşımak için de kullanılır. Örneğin login isteğinden dönen token’ı kaydedebilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kimlik doğrulama jetonunu kaydet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth_token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sonraki isteklerde bu token’ı header olarak kullanabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{auth_token}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman’de sık kullanılan değişken kapsamları:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kapsam&lt;/th&gt;
&lt;th&gt;Kullanım&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Environment variables&lt;/td&gt;
&lt;td&gt;Staging, production, local gibi ortama göre değişen değerler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collection variables&lt;/td&gt;
&lt;td&gt;Belirli bir koleksiyona ait sabit değerler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global variables&lt;/td&gt;
&lt;td&gt;Tüm workspace genelinde geçerli değerler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local variables&lt;/td&gt;
&lt;td&gt;Sadece mevcut çalıştırma sırasında kullanılan geçici değerler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pratik öneri:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;base_url&lt;/code&gt;, &lt;code&gt;auth_token&lt;/code&gt; gibi hedefe göre değişen değerleri environment değişkeni yapın.&lt;/li&gt;
&lt;li&gt;API’ye özgü ama ortamdan bağımsız değerleri collection değişkeni yapın.&lt;/li&gt;
&lt;li&gt;Global değişkenleri sınırlı kullanın; aksi halde farklı koleksiyonlar arasında beklenmeyen çakışmalar oluşabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tüm Koleksiyonu Collection Runner ile Çalıştırın
&lt;/h2&gt;

&lt;p&gt;Her isteği tek tek &lt;strong&gt;Send / Gönder&lt;/strong&gt; ile çalıştırmak küçük kontroller için yeterlidir. Ancak regresyon testi için tüm koleksiyonu sırayla çalıştırmanız gerekir.&lt;/p&gt;

&lt;p&gt;Bunun için &lt;strong&gt;Collection Runner&lt;/strong&gt; kullanılır.&lt;/p&gt;

&lt;p&gt;Collection Runner ile çalıştırmak için:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Koleksiyonu açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run / Çalıştır&lt;/strong&gt; düğmesine tıklayın.&lt;/li&gt;
&lt;li&gt;Çalıştırılacak istekleri kontrol edin.&lt;/li&gt;
&lt;li&gt;Ortamı seçin.&lt;/li&gt;
&lt;li&gt;Iteration sayısını belirleyin.&lt;/li&gt;
&lt;li&gt;Gerekirse CSV veya JSON veri dosyası ekleyin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run&lt;/strong&gt; düğmesine tıklayın.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Postman istekleri yukarıdan aşağıya çalıştırır ve her isteğin testlerini yürütür.&lt;/p&gt;

&lt;p&gt;Sonuç ekranında şunları görürsünüz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Başarılı assertion sayısı&lt;/li&gt;
&lt;li&gt;Başarısız assertion sayısı&lt;/li&gt;
&lt;li&gt;Hangi istekte neyin bozulduğu&lt;/li&gt;
&lt;li&gt;Response time bilgileri&lt;/li&gt;
&lt;li&gt;Önceki çalıştırmalarla karşılaştırılabilecek run geçmişi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sıralama önemlidir. Örneğin token gerektiren bir akışta koleksiyonu şöyle düzenleyin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Login
2. Kullanıcı oluştur
3. Kullanıcı getir
4. Kullanıcı güncelle
5. Kullanıcı sil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Login&lt;/code&gt; isteği önce çalışır ve &lt;code&gt;auth_token&lt;/code&gt; değişkenini doldurur. Alttaki istekler aynı token’ı kullanır.&lt;/p&gt;

&lt;p&gt;Veri odaklı test için CSV veya JSON dosyası ekleyebilirsiniz. Örneğin login testi için CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username,password,expected_status
valid@example.com,correct-password,200
wrong@example.com,bad-password,401
empty@example.com,,400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test içinde beklenen durum kodunu veri dosyasından okuyabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code matches expected status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iterationData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expected_status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yöntemle aynı isteği kopyalamadan farklı girdi kombinasyonlarını test edebilirsiniz.&lt;/p&gt;

&lt;p&gt;Veri odaklı API testi hakkında daha fazla örnek için &lt;a href="http://apidog.com/blog/data-driven-api-testing-tool-csv-json?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CSV ve JSON ile veri odaklı API testi&lt;/a&gt; rehberine bakabilirsiniz. Aynı koleksiyonu GUI olmadan CI’da çalıştırmak için Postman’in Newman komut satırı aracı kullanılır; detaylar &lt;a href="http://apidog.com/blog/what-is-the-difference-between-newman-and-postman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Newman ile Postman karşılaştırmasında&lt;/a&gt; açıklanmıştır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman’in Ağırlaştığı Noktalar
&lt;/h2&gt;

&lt;p&gt;Postman, keşifsel testler ve küçük-orta ölçekli test paketleri için güçlü bir araçtır. Ancak proje büyüdükçe iki yaygın sorun ortaya çıkar.&lt;/p&gt;

&lt;p&gt;İlk sorun, otomatik assertion’ların JavaScript ile yazılmasıdır. Geliştiriciler için bu çoğu zaman sorun değildir; ancak görsel bir test akışı bekleyen QA ekipleri veya teknik olmayan ekip üyeleri için öğrenme eğrisi oluşturabilir.&lt;/p&gt;

&lt;p&gt;İkinci sorun, API tasarımı, test, mock ve dokümantasyonun ayrı alanlarda yönetilmesidir. Bu durum zamanla API sözleşmesi ile testlerin birbirinden uzaklaşmasına neden olabilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, bu iş akışlarını tek bir platformda birleştiren bir API aracıdır. Postman koleksiyonlarını doğrudan içe aktarabilir. Assertion’lar görsel olarak oluşturulabilir; gerektiğinde betik kullanımı da desteklenir. Tasarım, hata ayıklama, mock, test ve dokümantasyon aynı kaynak üzerinden yönetildiği için API spesifikasyonu ile testler daha kolay senkron kalır.&lt;/p&gt;

&lt;p&gt;Alternatifleri değerlendiriyorsanız &lt;a href="http://apidog.com/blog/best-postman-alternatives-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API testi için Postman alternatifleri&lt;/a&gt; özetine bakabilirsiniz. Ayrıca &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog’u indirebilir&lt;/a&gt; ve mevcut Postman koleksiyonunuzu içe aktararak doğrudan karşılaştırma yapabilirsiniz.&lt;/p&gt;

&lt;p&gt;Bu, Postman’i bırakmanız gerektiği anlamına gelmez. Postman hâlâ hızlı kontroller, manuel testler ve mevcut yatırımı olan ekipler için sağlam bir seçenektir. Önemli olan, aracın güçlü olduğu kullanım alanını doğru belirlemektir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça Sorulan Sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Postman’de API’leri test etmek için kod yazmam gerekiyor mu?
&lt;/h3&gt;

&lt;p&gt;İstek göndermek ve yanıtları incelemek için hayır. Ancak otomatik assertion yazmak için genellikle biraz JavaScript gerekir. Postman’in testleri &lt;code&gt;pm&lt;/code&gt; nesnesi üzerinden çalışır. Hazır kod parçacıklarını kullanarak hızlı başlayabilirsiniz; fakat yine de temel JavaScript bilgisi faydalıdır. Kodsuz, görsel assertion oluşturmak istiyorsanız Apidog gibi araçları değerlendirebilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bir Postman koleksiyonu ile ortam arasındaki fark nedir?
&lt;/h3&gt;

&lt;p&gt;Koleksiyon, gruplanmış API isteklerini ve testlerini tutar. Ortam ise &lt;code&gt;base_url&lt;/code&gt;, &lt;code&gt;auth_token&lt;/code&gt; veya &lt;code&gt;client_id&lt;/code&gt; gibi değişkenleri tutar. Aynı koleksiyonu farklı ortamlarla çalıştırarak staging, production veya local API’leri test edebilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman testlerini CI’da otomatik olarak nasıl çalıştırırım?
&lt;/h3&gt;

&lt;p&gt;Postman’in komut satırı çalıştırıcısı Newman’ı kullanabilirsiniz. Koleksiyonunuzu ve ortamınızı dışa aktarın, ardından şu komutu çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run collection.json &lt;span class="nt"&gt;-e&lt;/span&gt; environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Herhangi bir test başarısız olursa Newman sıfır olmayan exit code döndürür. CI hattınız bu sonucu kullanarak build’i başarısız sayabilir. Daha detaylı akış için &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD’de API testlerini otomatikleştirme&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman REST API’lerinden fazlasını test edebilir mi?
&lt;/h3&gt;

&lt;p&gt;Evet. Postman, HTTP ve REST dışında GraphQL, gRPC, WebSocket ve SOAP isteklerini de destekler. Assertion mantığı çoğu senaryoda kullanılabilir; ancak istek yapılandırması protokole göre değişir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bir istekte kaç assertion olmalı?
&lt;/h3&gt;

&lt;p&gt;Yanıtın doğru olduğunu doğrulamaya yetecek kadar assertion yazın, ancak tek bir küçük değişikliğin onlarca testi bozmasına neden olacak kadar aşırıya kaçmayın. İyi bir başlangıç noktası:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Durum kodu&lt;/li&gt;
&lt;li&gt;Yanıt süresi&lt;/li&gt;
&lt;li&gt;Response body’de zorunlu alanlar&lt;/li&gt;
&lt;li&gt;İstemcinin bağımlı olduğu 2-3 kritik değer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Her &lt;code&gt;pm.test&lt;/code&gt; bloğunu tek bir beklentiye odaklayın. Böylece test kırıldığında hangi davranışın bozulduğunu hızlıca anlarsınız.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SoapUI Nedir? API Test Aracı Pratik Rehberi</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:30:03 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/soapui-nedir-api-test-araci-pratik-rehberi-5bm6</link>
      <guid>https://forem.com/tobiass_hoffmann/soapui-nedir-api-test-araci-pratik-rehberi-5bm6</guid>
      <description>&lt;p&gt;SoapUI, web hizmetlerini ve API'leri test etmek için kullanılan açık kaynaklı bir araçtır. 2005 yılında SOAP hizmetlerini test etmek amacıyla ortaya çıktı ve zamanla REST, GraphQL, JMS ve JDBC desteği ekledi. Bugün hâlâ özellikle WSDL tabanlı SOAP entegrasyonlarını sürdüren kurumsal KG ekipleri için pratik bir test aracıdır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Yalnızca JSON REST API'leriyle çalıştıysanız SoapUI eski görünebilir. Ancak WSDL içe aktarma, SOAP zarfı üretme, XML doğrulama ve XPath/XQuery tabanlı kontroller gibi konularda hâlâ güçlüdür. Bankacılık, sigorta, kamu, sağlık ve telekom gibi alanlarda SOAP servisleri yaşamaya devam ettiği için SoapUI da bu nişte geçerliliğini korur.&lt;/p&gt;

&lt;p&gt;Bu yazıda SoapUI'ın ne işe yaradığını, tipik bir test akışını, hangi durumlarda doğru seçim olduğunu ve modern REST/GraphQL ekipleri için nerede sınırlı kaldığını uygulama odaklı şekilde ele alacağız.&lt;/p&gt;

&lt;h2&gt;
  
  
  SoapUI aslında ne işe yarar?
&lt;/h2&gt;

&lt;p&gt;SoapUI, uygulama kodu yazmadan API istekleri oluşturmanızı, göndermenizi ve doğrulamanızı sağlayan bir masaüstü uygulamasıdır. Temel akış şöyledir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bir servis tanımı içe aktarılır.&lt;/li&gt;
&lt;li&gt;SoapUI bu tanımdan istek şablonları oluşturur.&lt;/li&gt;
&lt;li&gt;İstekler test adımlarına dönüştürülür.&lt;/li&gt;
&lt;li&gt;Yanıtlar assertion’larla doğrulanır.&lt;/li&gt;
&lt;li&gt;Test senaryoları paketler halinde çalıştırılır.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SoapUI'ın en belirgin gücü WSDL içe aktarmadır. WSDL, bir SOAP servisinin operasyonlarını, mesaj formatlarını ve veri tiplerini tanımlayan XML belgesidir. SoapUI'a bir WSDL URL'si verdiğinizde her operasyon için uygun SOAP envelope yapısını otomatik oluşturur.&lt;/p&gt;

&lt;p&gt;Örneğin elle yazmanız gereken tipik bir SOAP isteği şu yapıya benzer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;soapenv:Envelope&lt;/span&gt; &lt;span class="na"&gt;xmlns:soapenv=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;
                  &lt;span class="na"&gt;xmlns:ser=&lt;/span&gt;&lt;span class="s"&gt;"http://example.com/service"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;soapenv:Header/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;soapenv:Body&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ser:GetCustomer&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;ser:customerId&amp;gt;&lt;/span&gt;12345&lt;span class="nt"&gt;&amp;lt;/ser:customerId&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ser:GetCustomer&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WSDL içe aktarma sayesinde SoapUI bu iskeleti sizin için üretir. Siz yalnızca test verilerini girer, gerekli header’ları ekler ve doğrulamaları tanımlarsınız.&lt;/p&gt;

&lt;p&gt;REST tarafında SoapUI, OpenAPI ve WADL tanımlarını içe aktarabilir. Yöntem, URL, parametre, header ve body ile istekler oluşturabilirsiniz. Bu nedenle SOAP’tan REST’e geçiş yapan ekiplerde aynı proje içinde iki API stilini birlikte test etmek mümkündür.&lt;/p&gt;

&lt;p&gt;SoapUI iki sürümle gelir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SoapUI Open Source:&lt;/strong&gt; Ücretsizdir ve temel fonksiyonel testleri kapsar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ReadyAPI:&lt;/strong&gt; SmartBear'ın ticari ürünüdür; yük testi, güvenlik taraması, veri odaklı testler ve daha gelişmiş arayüz özellikleri ekler.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yazıda odak, ücretsiz açık kaynak SoapUI sürümüdür.&lt;/p&gt;

&lt;h2&gt;
  
  
  Temel özellikler
&lt;/h2&gt;

&lt;p&gt;SoapUI test yapısını şu hiyerarşiyle kurar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project
└── Test Suite
    └── Test Case
        └── Test Step
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Projeler
&lt;/h3&gt;

&lt;p&gt;Bir proje, tek bir servis veya ilişkili servis grubu için istekleri, test paketlerini ve yapılandırmaları içerir. Ekip içinde paylaşacağınız ana dosya genellikle bu projedir.&lt;/p&gt;

&lt;p&gt;Pratik kullanım:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Her servis ailesi için ayrı proje oluşturun.&lt;/li&gt;
&lt;li&gt;Ortam değişkenlerini proje seviyesinde saklayın.&lt;/li&gt;
&lt;li&gt;Prod, test ve staging endpoint’lerini ayrı property olarak yönetin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek property yaklaşımı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;baseUrl = https://test.example.com
username = test-user
password = secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;İstek URL’sinde bu property şöyle kullanılabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;${#Project#baseUrl}/customers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Fonksiyonel test paketleri
&lt;/h3&gt;

&lt;p&gt;Bir test suite içinde birden fazla test case bulunur. Her test case, sıralı test adımlarından oluşur.&lt;/p&gt;

&lt;p&gt;Örnek test case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Login
Extract Token
Create Customer
Get Customer
Assert Customer Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yapı, stateful API akışlarını test etmek için kullanışlıdır. Örneğin önce oturum açar, dönen token’ı alır ve sonraki isteklere eklersiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Doğrulamalar
&lt;/h3&gt;

&lt;p&gt;SoapUI, yanıtları kod yazmadan doğrulamak için birçok assertion sunar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP status code kontrolü&lt;/li&gt;
&lt;li&gt;XPath eşleşmesi&lt;/li&gt;
&lt;li&gt;XQuery eşleşmesi&lt;/li&gt;
&lt;li&gt;JSONPath kontrolü&lt;/li&gt;
&lt;li&gt;XML schema uyumluluğu&lt;/li&gt;
&lt;li&gt;Yanıt süresi SLA kontrolü&lt;/li&gt;
&lt;li&gt;İçerik var/yok kontrolü&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek XPath doğrulaması:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xpath"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nt"&gt;customer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'ACTIVE'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örnek JSONPath doğrulaması:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.customer.status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beklenen değer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ACTIVE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;API doğrulama yaklaşımını daha detaylı incelemek için &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API doğrulamaları&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Özellik aktarımı
&lt;/h3&gt;

&lt;p&gt;Property Transfer adımı, bir yanıttan değer alıp sonraki istekte kullanmanızı sağlar.&lt;/p&gt;

&lt;p&gt;Tipik örnek:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login isteği gönderilir.&lt;/li&gt;
&lt;li&gt;Yanıttan &lt;code&gt;sessionId&lt;/code&gt; alınır.&lt;/li&gt;
&lt;li&gt;Bu değer proje veya test case property’sine yazılır.&lt;/li&gt;
&lt;li&gt;Sonraki isteğin header’ında kullanılır.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Örnek kullanım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer ${#TestCase#token}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SOAP veya REST fark etmeksizin çağrıları zincirlemek için bu mekanizma önemlidir.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Groovy betikleri
&lt;/h3&gt;

&lt;p&gt;Yerleşik adımlar yetmediğinde SoapUI Groovy betikleri çalıştırabilir. Groovy ile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dinamik test verisi üretebilirsiniz.&lt;/li&gt;
&lt;li&gt;Yanıtları özel kurallarla doğrulayabilirsiniz.&lt;/li&gt;
&lt;li&gt;Property değerlerini işleyebilirsiniz.&lt;/li&gt;
&lt;li&gt;Harici sistemlere çağrı yapabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek: Yanıttan değer okuyup test case property’sine yazmak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'${Login Request#Response}'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;holder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eviware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;soapui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;support&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;XmlHolder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;holder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNodeValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'//token'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;testRunner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testCase&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPropertyValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'token'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örnek: Basit özel doğrulama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'${Get Customer#Response#//customer/status}'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'ACTIVE'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SoapUI kodsuz testleri desteklese de karmaşık kurumsal senaryolarda Groovy bilmek pratik avantaj sağlar.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Sahte hizmetler
&lt;/h3&gt;

&lt;p&gt;SoapUI, SOAP veya REST servis tanımından mock servis oluşturabilir. Gerçek backend hazır değilken istemci geliştirme veya entegrasyon testi için kullanılabilir.&lt;/p&gt;

&lt;p&gt;Tipik kullanım:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WSDL içe aktarılır.&lt;/li&gt;
&lt;li&gt;Operasyon için örnek yanıt tanımlanır.&lt;/li&gt;
&lt;li&gt;Mock service başlatılır.&lt;/li&gt;
&lt;li&gt;İstemci uygulama bu mock endpoint’e yönlendirilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mocking stratejileri için &lt;a href="http://apidog.com/blog/api-mocking-use-cases?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API sahteleme kullanım senaryoları&lt;/a&gt; yazısına bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipik bir SoapUI iş akışı
&lt;/h2&gt;

&lt;p&gt;SoapUI ile yeni bir servisi test ederken uygulanabilir akış şu şekildedir.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tanımdan proje oluşturun
&lt;/h3&gt;

&lt;p&gt;SOAP için WSDL URL’sini, REST için OpenAPI dosyasını içe aktarın.&lt;/p&gt;

&lt;p&gt;SOAP örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;File &amp;gt; New SOAP Project
Initial WSDL: https://example.com/customer-service?wsdl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;REST/OpenAPI için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;File &amp;gt; New REST Project
URI or OpenAPI definition: https://example.com/openapi.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SoapUI tanımı ayrıştırır ve operasyonları/endpoint’leri proje ağacında listeler.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keşif amaçlı istek gönderin
&lt;/h3&gt;

&lt;p&gt;Oluşturulan örnek isteği açın, zorunlu alanları doldurun ve gönderin.&lt;/p&gt;

&lt;p&gt;Kontrol etmeniz gerekenler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint doğru mu?&lt;/li&gt;
&lt;li&gt;Kimlik doğrulama gerekli mi?&lt;/li&gt;
&lt;li&gt;Yanıt beklenen formatta mı?&lt;/li&gt;
&lt;li&gt;Hata mesajları anlamlı mı?&lt;/li&gt;
&lt;li&gt;Servis dokümantasyonla uyumlu mu?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu aşamada henüz test otomasyonu değil, servis davranışını anlama hedeflenir.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Test suite ve test case oluşturun
&lt;/h3&gt;

&lt;p&gt;Keşif tamamlandıktan sonra istekleri test adımlarına dönüştürün.&lt;/p&gt;

&lt;p&gt;Örnek yapı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CustomerService Tests
└── Create and Read Customer
    ├── Login Request
    ├── Transfer Token
    ├── Create Customer
    ├── Transfer Customer ID
    ├── Get Customer
    └── Validate Customer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yapı hem SOAP hem REST için aynıdır.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Doğrulamalar ekleyin
&lt;/h3&gt;

&lt;p&gt;Her kritik isteğe assertion ekleyin.&lt;/p&gt;

&lt;p&gt;Minimum doğrulama seti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Başarılı HTTP status code&lt;/li&gt;
&lt;li&gt;Yanıt şeması&lt;/li&gt;
&lt;li&gt;Kritik alanların varlığı&lt;/li&gt;
&lt;li&gt;İş kuralı doğrulaması&lt;/li&gt;
&lt;li&gt;Yanıt süresi limiti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek SLA assertion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Response SLA: 1000 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örnek içerik kontrolü:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yanıt içinde "ACTIVE" değeri bulunmalı
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SOAP servislerinde XML schema ve XPath kontrolleri özellikle önemlidir.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Testi çalıştırın ve sonuçları inceleyin
&lt;/h3&gt;

&lt;p&gt;Tek bir test case’i veya tüm test suite’i çalıştırabilirsiniz. SoapUI her adım için geçme/kalma sonucunu gösterir.&lt;/p&gt;

&lt;p&gt;İnceleme sırasında şunlara bakın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hangi adım başarısız oldu?&lt;/li&gt;
&lt;li&gt;Assertion mı hata verdi, servis mi hata döndürdü?&lt;/li&gt;
&lt;li&gt;Önceki adımdan gelen property değeri doğru aktarıldı mı?&lt;/li&gt;
&lt;li&gt;Ortam endpoint’i doğru mu?&lt;/li&gt;
&lt;li&gt;Kimlik doğrulama bilgisi güncel mi?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu döngü, SoapUI ile sürdürülebilir test paketi oluşturmanın temelidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  SoapUI'ın diğer araçlarla karşılaştırılması
&lt;/h2&gt;

&lt;p&gt;SoapUI'ı modern REST istemcileriyle karşılaştırırken temel ayrım SOAP/XML desteği ile REST geliştirici deneyimi arasındadır.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Yön&lt;/th&gt;
&lt;th&gt;SoapUI&lt;/th&gt;
&lt;th&gt;Modern REST istemcileri&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SOAP ve WSDL desteği&lt;/td&gt;
&lt;td&gt;Güçlü, birinci sınıf&lt;/td&gt;
&lt;td&gt;Zayıf veya yok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XML doğrulamaları&lt;/td&gt;
&lt;td&gt;Kapsamlı XPath/XQuery desteği&lt;/td&gt;
&lt;td&gt;Sınırlı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REST ve OpenAPI desteği&lt;/td&gt;
&lt;td&gt;Yeterli&lt;/td&gt;
&lt;td&gt;Birinci sınıf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arayüz&lt;/td&gt;
&lt;td&gt;Yoğun, eski&lt;/td&gt;
&lt;td&gt;Daha akıcı ve modern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Öğrenme eğrisi&lt;/td&gt;
&lt;td&gt;Dik&lt;/td&gt;
&lt;td&gt;Daha yumuşak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ücretsiz sürümde yük testi&lt;/td&gt;
&lt;td&gt;Dahil değil&lt;/td&gt;
&lt;td&gt;Araca göre değişir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kurumsal SOAP testleri&lt;/td&gt;
&lt;td&gt;Güçlü&lt;/td&gt;
&lt;td&gt;Genellikle sınırlı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON REST iş akışı&lt;/td&gt;
&lt;td&gt;Çalışır ama ağır gelebilir&lt;/td&gt;
&lt;td&gt;Daha hızlı ve pratik&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Özet net: SOAP, WSDL ve XML doğrulama öncelikliyse SoapUI güçlüdür. JSON REST, GraphQL ve hızlı geliştirici deneyimi öncelikliyse modern istemciler genellikle daha uygundur.&lt;/p&gt;

&lt;h2&gt;
  
  
  SoapUI ne zaman doğru seçimdir?
&lt;/h2&gt;

&lt;p&gt;SoapUI şu durumlarda mantıklı bir tercihtir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SOAP servisleri sürdürüyor ve gerçek WSDL desteğine ihtiyaç duyuyorsanız.&lt;/li&gt;
&lt;li&gt;XML yanıtlarında XPath veya XQuery ile derin doğrulama yapmanız gerekiyorsa.&lt;/li&gt;
&lt;li&gt;Kurumunuzda mevcut SoapUI/ReadyAPI test varlıkları varsa.&lt;/li&gt;
&lt;li&gt;SOAP envelope, WS-Security ve XML schema doğrulaması önemliyse.&lt;/li&gt;
&lt;li&gt;Ücretsiz fonksiyonel test aracı istiyor ve öğrenme eğrisini kabul ediyorsanız.&lt;/li&gt;
&lt;li&gt;REST’e geçiş sürecinde hem SOAP hem REST servislerini aynı projede test etmek istiyorsanız.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek karar kuralı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Servislerinizin çoğu WSDL tabanlı SOAP ise:
    SoapUI güçlü adaydır.
Servislerinizin çoğu JSON REST veya GraphQL ise:
    Modern API platformlarını değerlendirin.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha geniş test yaklaşımı için &lt;a href="http://apidog.com/blog/what-is-automated-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;otomatik testin ne olduğu&lt;/a&gt; yazısına bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  SoapUI'ın yetersiz kaldığı yerler
&lt;/h2&gt;

&lt;p&gt;SoapUI güçlü olsa da sınırlamaları vardır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Öğrenme eğrisi diktir
&lt;/h3&gt;

&lt;p&gt;Proje, test suite, test case ve test step hiyerarşisi esnektir ancak yeni başlayanlar için sezgisel değildir. Arayüz aynı anda çok fazla seçenek gösterir.&lt;/p&gt;

&lt;p&gt;Pratik öneri:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Önce tek bir istekle başlayın.&lt;/li&gt;
&lt;li&gt;Sonra bunu test step’e dönüştürün.&lt;/li&gt;
&lt;li&gt;En son property transfer ve Groovy ekleyin.&lt;/li&gt;
&lt;li&gt;Tüm akışı baştan karmaşık kurmaya çalışmayın.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Groovy ihtiyacı hızlı ortaya çıkar
&lt;/h3&gt;

&lt;p&gt;Basit doğrulamalar kodsuz yapılabilir. Ancak dinamik veri üretme, özel kontrol yazma veya karmaşık property yönetimi gerektiğinde Groovy gerekir.&lt;/p&gt;

&lt;p&gt;Bu nedenle SoapUI “kodsuz” başlasa da ileri seviye senaryolarda betik yazmaya hazır olmalısınız.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kaynak kullanımı ağır olabilir
&lt;/h3&gt;

&lt;p&gt;SoapUI bir Java masaüstü uygulamasıdır. Büyük projeler, çok sayıda test suite ve yoğun XML yanıtları performansı etkileyebilir.&lt;/p&gt;

&lt;p&gt;Pratik öneriler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Büyük servis ailelerini ayrı projelere bölün.&lt;/li&gt;
&lt;li&gt;Kullanılmayan request ve test case’leri temizleyin.&lt;/li&gt;
&lt;li&gt;Büyük yanıtları gereksiz yere saklamayın.&lt;/li&gt;
&lt;li&gt;Test verisini property dosyalarıyla yönetin.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Açık kaynak sürümde yük testi yoktur
&lt;/h3&gt;

&lt;p&gt;SoapUI Open Source fonksiyonel testlere odaklanır. Performans ve eşzamanlılık testi ReadyAPI tarafındadır.&lt;/p&gt;

&lt;p&gt;Performans testi alternatifleri için &lt;a href="http://apidog.com/blog/software-performance-testing-tool?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;yazılım performans testi araçları&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD entegrasyonu çalışır ama modern hissettirmez
&lt;/h3&gt;

&lt;p&gt;SoapUI testleri komut satırından çalıştırılabilir. Örneğin genel kullanım şu şekildedir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testrunner.sh &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="s2"&gt;"CustomerService Suite"&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="s2"&gt;"Create and Read Customer"&lt;/span&gt; project.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows ortamında:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;testrunner&lt;/span&gt;.bat &lt;span class="na"&gt;-s&lt;/span&gt;&lt;span class="s2"&gt;"CustomerService Suite"&lt;/span&gt; &lt;span class="na"&gt;-c&lt;/span&gt;&lt;span class="s2"&gt;"Create and Read Customer"&lt;/span&gt; &lt;span class="kd"&gt;project&lt;/span&gt;.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CI pipeline içinde kullanılabilir, ancak deneyim baştan pipeline odaklı tasarlanmış modern araçlar kadar akıcı değildir.&lt;/p&gt;

&lt;h3&gt;
  
  
  REST için kullanılabilir ama en güçlü olduğu alan değildir
&lt;/h3&gt;

&lt;p&gt;SoapUI REST destekler. Ancak tüm yığınınız JSON REST API’lerinden oluşuyorsa daha modern ve hafif bir istemciyle daha hızlı ilerlemeniz olasıdır.&lt;/p&gt;

&lt;p&gt;SoapUI'ın en güçlü olduğu yer hâlâ SOAP ve XML ağırlıklı kurumsal testlerdir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modern bir alternatif: Apidog
&lt;/h2&gt;

&lt;p&gt;API'leri ağırlıklı olarak REST, GraphQL veya OpenAPI etrafında inşa edilmiş ekipler için &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, daha modern bir iş akışı sunar. API tasarımı, hata ayıklama, otomatik fonksiyonel test ve mock server özelliklerini tek uygulamada birleştirir.&lt;/p&gt;

&lt;p&gt;Tipik Apidog akışı:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API şeması tasarlanır veya içe aktarılır.&lt;/li&gt;
&lt;li&gt;İstekler gönderilerek endpoint davranışı test edilir.&lt;/li&gt;
&lt;li&gt;Görsel doğrulamalar eklenir.&lt;/li&gt;
&lt;li&gt;Adımlar otomatik test senaryolarına bağlanır.&lt;/li&gt;
&lt;li&gt;Testler CI/CD içinde çalıştırılır.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog ayrıca performans testini aynı araç içinde sunar. Böylece yük kapsamı için ayrı bir ücretli ürüne geçme ihtiyacı azalır. Komut satırı çalıştırıcısı ile pipeline entegrasyonu da desteklenir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirebilir&lt;/a&gt; ve temel test özelliklerini ücretsiz kullanabilirsiniz. SOAP testleri için ayrıca &lt;a href="http://apidog.com/blog/online-soap-api-tester?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;çevrimiçi SOAP API test aracı&lt;/a&gt; rehberini inceleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Kısa karar özeti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SOAP/WSDL/XML yoğun kurumsal testler için SoapUI hâlâ güçlüdür.&lt;/li&gt;
&lt;li&gt;Yeni REST, GraphQL ve OpenAPI projeleri için modern API platformları genellikle daha verimlidir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SoapUI ücretsiz mi?
&lt;/h3&gt;

&lt;p&gt;Evet. SoapUI'ın açık kaynak sürümü ücretsizdir ve SOAP ile REST API'leri için fonksiyonel testleri kapsar. SmartBear'ın ticari ürünü ReadyAPI ise yük testi, güvenlik taraması, gelişmiş veri odaklı testler ve daha gelişmiş arayüz özellikleri ekler.&lt;/p&gt;

&lt;h3&gt;
  
  
  SoapUI sadece SOAP API'lerini mi test eder?
&lt;/h3&gt;

&lt;p&gt;Hayır. SoapUI, SOAP'a ek olarak REST, GraphQL, JMS ve JDBC'yi de test edebilir. REST servisleri için OpenAPI ve WADL tanımlarını içe aktarır. Ancak en güçlü olduğu alan WSDL desteği ve XML doğrulamalarıdır.&lt;/p&gt;

&lt;h3&gt;
  
  
  SoapUI bir CI/CD pipeline'ında çalıştırılabilir mi?
&lt;/h3&gt;

&lt;p&gt;Evet. SoapUI testleri komut satırından çalıştırılabilir ve Maven entegrasyonu da mevcuttur. Ancak deneyim, baştan CI/CD için tasarlanmış modern araçlara göre daha eski ve daha az akıcıdır.&lt;/p&gt;

&lt;p&gt;Örnek komut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testrunner.sh &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-j&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; reports project.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut testleri çalıştırır ve rapor çıktıları üretmek için kullanılabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  SoapUI ve Postman arasındaki fark nedir?
&lt;/h3&gt;

&lt;p&gt;SoapUI, SOAP, WSDL ve XML doğrulama tarafında daha güçlüdür. Postman ise REST odaklı iş akışlarında, modern arayüzde ve geliştirici deneyiminde öne çıkar. SOAP servisleri sürdüren ekipler genellikle SoapUI'ı; JSON REST API'leri geliştiren ekipler ise Postman veya modern alternatifleri tercih eder.&lt;/p&gt;

&lt;h3&gt;
  
  
  SoapUI kullanmak için Groovy bilmem gerekiyor mu?
&lt;/h3&gt;

&lt;p&gt;Temel istekler ve yerleşik assertion’lar için gerekmez. Ancak dinamik test verisi üretme, özel doğrulama yazma, property yönetimi veya harici sistemlerle entegrasyon gibi senaryolarda Groovy bilmek gerekir.&lt;/p&gt;

&lt;h3&gt;
  
  
  SoapUI 2026'da hâlâ geçerli mi?
&lt;/h3&gt;

&lt;p&gt;Evet, kendi nişinde geçerlidir. SOAP servisleri hâlâ bankacılık, sigorta, kamu, sağlık ve telekom sistemlerinde kullanılır. Bu servisleri test etmek için SoapUI'ın WSDL ve XML doğrulama desteği hâlâ değerlidir. Yeni REST ve GraphQL projelerinde ise çoğu ekip modern API araçlarını tercih eder.&lt;/p&gt;

&lt;h3&gt;
  
  
  SoapUI ve ReadyAPI arasındaki fark nedir?
&lt;/h3&gt;

&lt;p&gt;SoapUI ücretsiz, açık kaynaklı fonksiyonel test aracıdır. ReadyAPI ise SmartBear'ın ticari ürünüdür ve yük testi, güvenlik testi, gelişmiş veri odaklı testler ve daha gelişmiş arayüz özellikleri ekler. Yalnızca fonksiyonel SOAP/REST testleri gerekiyorsa SoapUI yeterli olabilir; performans ve güvenlik testi gerekiyorsa ReadyAPI veya başka araçlar değerlendirilmelidir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>En İyi OpenAPI Doğrulama Araçları: Temiz API Spesifikasyonları</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:30:03 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/en-iyi-openapi-dogrulama-araclari-temiz-api-spesifikasyonlari-5ec3</link>
      <guid>https://forem.com/tobiass_hoffmann/en-iyi-openapi-dogrulama-araclari-temiz-api-spesifikasyonlari-5ec3</guid>
      <description>&lt;p&gt;Bir OpenAPI belirtimi bir sözleşmedir. Kod üreteçleri, belgeler, sahte sunucular ve istemci SDK’leri bu dosyayı kaynak kabul eder. Belirtim hatalıysa, bu hatayı tüm alt çıktılara taşırsınız. Bu yüzden OpenAPI doğrulamasını tek seferlik bir kontrol değil, geliştirme akışının parçası olarak ele almak gerekir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu yazıda kullanmaya değer OpenAPI doğrulayıcılarını, hangi problemi çözdüklerini ve bunları gerçek bir geliştirme akışına nasıl yerleştirebileceğinizi ele alacağız. Bazı araçlar ham sözdizimini ve şema uyumluluğunu kontrol eder. Bazıları ise stil, tutarlılık ve API tasarım kurallarını uygular. Sağlam kurulum genellikle ikisini birlikte kullanır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Belirtimi doğrulamanın önemi
&lt;/h2&gt;

&lt;p&gt;OpenAPI doğrulamasında iki ayrı kontrol türü vardır:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Doğruluk kontrolü&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kalite ve stil kontrolü&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Doğruluk kontrolü şu soruya cevap verir:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bu dosya geçerli bir OpenAPI belirtimi mi?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Örneğin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;YAML girintisi bozuk mu?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ref&lt;/code&gt; var olmayan bir şemaya mı işaret ediyor?&lt;/li&gt;
&lt;li&gt;Zorunlu bir alan eksik mi?&lt;/li&gt;
&lt;li&gt;Yol parametresi tanımlanmadan mı kullanılmış?&lt;/li&gt;
&lt;li&gt;Şema tipi hatalı mı yazılmış?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunlar nesnel hatalardır. Dosya ya OpenAPI şemasına göre geçerlidir ya da değildir.&lt;/p&gt;

&lt;p&gt;Kalite kontrolü ise şunu sorar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Belirtim geçerli, ama tüketilebilir ve tutarlı mı?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Örneğin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Her endpoint için &lt;code&gt;summary&lt;/code&gt; veya &lt;code&gt;description&lt;/code&gt; var mı?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;operationId&lt;/code&gt; değerleri tutarlı mı?&lt;/li&gt;
&lt;li&gt;Hata yanıtları belgelenmiş mi?&lt;/li&gt;
&lt;li&gt;Güvenlik gereksinimleri açıkça belirtilmiş mi?&lt;/li&gt;
&lt;li&gt;Path adlandırmaları aynı standardı takip ediyor mu?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunlar OpenAPI şeması tarafından her zaman zorunlu tutulmaz, ancak iyi bir API tüketici deneyimi için kritiktir. Bu ayrım, daha geniş anlamda &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API sözleşme testi&lt;/a&gt; yaklaşımının da temelidir: hatayı üretime veya SDK üretimine gitmeden önce yakalamak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bilmeye değer OpenAPI doğrulayıcı araçları
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Swagger Editor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://editor.swagger.io/" rel="noopener noreferrer"&gt;Swagger Editor&lt;/a&gt;, OpenAPI projesinin resmi tarayıcı tabanlı düzenleyicisidir.&lt;/p&gt;

&lt;p&gt;Kullanım şekli basittir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;OpenAPI YAML veya JSON dosyanızı editöre yapıştırın.&lt;/li&gt;
&lt;li&gt;Sağ panelde canlı önizlemeyi kontrol edin.&lt;/li&gt;
&lt;li&gt;Sol panelde doğrulama hatalarını anında görün.&lt;/li&gt;
&lt;li&gt;Hataları düzeltip tekrar kontrol edin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Swagger Editor özellikle şu işler için uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hızlı sözdizimi kontrolü&lt;/li&gt;
&lt;li&gt;Yeni bir belirtim yazarken canlı geri bildirim&lt;/li&gt;
&lt;li&gt;Küçük değişiklikleri manuel doğrulama&lt;/li&gt;
&lt;li&gt;Ekip içi hızlı inceleme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CI/CD için ideal araç değildir, çünkü temel kullanım senaryosu tarayıcı üzerindedir. Ancak geliştirme sırasında en hızlı ilk kontrol noktalarından biridir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spectral
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/stoplightio/spectral" rel="noopener noreferrer"&gt;Spectral&lt;/a&gt;, Stoplight tarafından geliştirilen açık kaynaklı bir linter’dır. OpenAPI ve AsyncAPI için kural setleri sağlar.&lt;/p&gt;

&lt;p&gt;Spectral’in güçlü tarafı özel kural yazabilmenizdir. Örneğin ekibiniz şu kuralları zorunlu kılabilir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Her endpoint &lt;code&gt;operationId&lt;/code&gt; içermeli&lt;/li&gt;
&lt;li&gt;Her endpoint &lt;code&gt;summary&lt;/code&gt; içermeli&lt;/li&gt;
&lt;li&gt;Path sonunda &lt;code&gt;/&lt;/code&gt; kullanılmamalı&lt;/li&gt;
&lt;li&gt;Tüm hata yanıtları belgelenmeli&lt;/li&gt;
&lt;li&gt;Tag kullanımı zorunlu olmalı&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basit kurulum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @stoplight/spectral-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir OpenAPI dosyasını lint etmek için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spectral lint openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örnek &lt;code&gt;.spectral.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spectral:oas"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;operation-summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Her operasyon summary alanı içermeli&lt;/span&gt;
    &lt;span class="na"&gt;given&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$.paths[*][*]"&lt;/span&gt;
    &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;summary&lt;/span&gt;
      &lt;span class="na"&gt;function&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;truthy&lt;/span&gt;

  &lt;span class="na"&gt;no-trailing-slash&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Path sonunda slash kullanılmamalı&lt;/span&gt;
    &lt;span class="na"&gt;given&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$.paths"&lt;/span&gt;
    &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@key"&lt;/span&gt;
      &lt;span class="na"&gt;function&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pattern&lt;/span&gt;
      &lt;span class="na"&gt;functionOptions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;notMatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/$"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CI içinde çalıştırmak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spectral lint openapi.yaml &lt;span class="nt"&gt;--fail-severity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;warn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spectral, tasarım kurallarını otomatikleştirmek isteyen ekipler için en pratik seçeneklerden biridir.&lt;/p&gt;

&lt;h2&gt;
  
  
  openapi-spec-validator
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;openapi-spec-validator&lt;/code&gt;, Python tabanlı odaklı bir doğrulama aracıdır. Temel görevi şudur:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OpenAPI dosyası resmi OpenAPI şemasına göre geçerli mi?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OpenAPI 2.0, 3.0 ve 3.1 sürümlerini destekler. Stil veya tasarım hakkında görüş belirtmez. Sadece yapısal doğruluğu kontrol eder.&lt;/p&gt;

&lt;p&gt;Kurulum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openapi-spec-validator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kullanım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openapi-spec-validator openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python içinde kullanmak isterseniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openapi_spec_validator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openapi_spec_validator.readers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;read_from_filename&lt;/span&gt;

&lt;span class="n"&gt;spec_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read_from_filename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openapi.yaml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spec_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu araç özellikle şunlar için uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python tabanlı build adımları&lt;/li&gt;
&lt;li&gt;Pre-commit hook’ları&lt;/li&gt;
&lt;li&gt;CI’da kesin geçiş/hata kapısı&lt;/li&gt;
&lt;li&gt;Sadece şema doğruluğu kontrolü gereken durumlar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek pre-commit yapılandırması:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;repos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openapi-validate&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate OpenAPI spec&lt;/span&gt;
        &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openapi-spec-validator openapi.yaml&lt;/span&gt;
        &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;system&lt;/span&gt;
        &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openapi.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, OpenAPI doğrulamasını API tasarım akışının içine yerleştirir. Bir OpenAPI tanımı oluşturduğunuzda veya içe aktardığınızda, düzenleyici içinde yapısal sorunları işaretler.&lt;/p&gt;

&lt;p&gt;Apidog’un öne çıkan tarafı çalışma zamanı doğrulamasıdır. Yani yalnızca dosyanın geçerli olup olmadığını değil, canlı API yanıtlarının belirtimdeki şemayla eşleşip eşleşmediğini de kontrol edebilirsiniz.&lt;/p&gt;

&lt;p&gt;Bu ayrım önemlidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAPI dosyanız geçerli olabilir.&lt;/li&gt;
&lt;li&gt;Ancak gerçek API yanıtı belirtimden sapmış olabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örneğin belirtimde yanıt şöyle tanımlanmış olabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
  &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
  &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak canlı API şu yanıtı dönebilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu durumda belirtim geçerli olsa bile uygulama sözleşmeye uymuyordur. Apidog bu tür sapmaları yakalamaya yardımcı olur. Belirtimleri tek bir araçta tasarlamak ve doğrulamak için &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redocly CLI
&lt;/h2&gt;

&lt;p&gt;Redocly CLI; linting, doğrulama ve belge oluşturmayı aynı araç zincirinde birleştirir.&lt;/p&gt;

&lt;p&gt;Temel kullanım alanları:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAPI şema doğrulaması&lt;/li&gt;
&lt;li&gt;Stil ve kalite kuralları&lt;/li&gt;
&lt;li&gt;Çok dosyalı belirtimleri tek dosyada paketleme&lt;/li&gt;
&lt;li&gt;Redoc tabanlı belge üretim akışları&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kurulum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @redocly/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lint çalıştırmak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redocly lint openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Çok dosyalı bir belirtimi paketlemek için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redocly bundle openapi.yaml &lt;span class="nt"&gt;-o&lt;/span&gt; dist/openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redoc ile belge üreten ekipler için Redocly CLI doğal bir seçimdir, çünkü doğrulama ve dokümantasyon aynı ekosistemde kalır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vacuum
&lt;/h2&gt;

&lt;p&gt;Vacuum, Go ile yazılmış hızlı bir OpenAPI linter’ıdır. Özellikle büyük belirtimlerde performans avantajı sağlar.&lt;/p&gt;

&lt;p&gt;Kullanım senaryoları:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Büyük OpenAPI dosyaları&lt;/li&gt;
&lt;li&gt;Monorepo içinde çok sayıda API belirtimi&lt;/li&gt;
&lt;li&gt;CI süresinin kritik olduğu projeler&lt;/li&gt;
&lt;li&gt;Spectral tarzı kurallar kullanan ekipler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vacuum, Spectral benzeri kurallarla uyumludur. Bu nedenle mevcut lint yaklaşımından geçiş yapmak genellikle düşük maliyetlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Karşılaştırma tablosu
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Araç&lt;/th&gt;
&lt;th&gt;Tür&lt;/th&gt;
&lt;th&gt;Kontrol Ettiği&lt;/th&gt;
&lt;th&gt;CI'da Çalışır&lt;/th&gt;
&lt;th&gt;En İyi Kullanım&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Swagger Editor&lt;/td&gt;
&lt;td&gt;Tarayıcı düzenleyici&lt;/td&gt;
&lt;td&gt;Sözdizimi, şema&lt;/td&gt;
&lt;td&gt;Hayır&lt;/td&gt;
&lt;td&gt;Canlı düzenleme ve hızlı kontroller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spectral&lt;/td&gt;
&lt;td&gt;CLI linter&lt;/td&gt;
&lt;td&gt;Stil, özel kurallar&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Tasarım kurallarını uygulama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openapi-spec-validator&lt;/td&gt;
&lt;td&gt;CLI / Python kütüphanesi&lt;/td&gt;
&lt;td&gt;Şema doğruluğu&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Kesin geçiş veya hata kapısı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;td&gt;Entegre platform&lt;/td&gt;
&lt;td&gt;Şema + çalışma zamanı sapması&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Tasarım ve yanıt doğrulama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redocly CLI&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Şema, stil, paketleme&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Belgeler ve doğrulama bir arada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vacuum&lt;/td&gt;
&lt;td&gt;CLI linter&lt;/td&gt;
&lt;td&gt;Stil, Spectral kuralları&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Çok büyük belirtimler ve hız&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Bir doğrulama iş akışı nasıl oluşturulur
&lt;/h2&gt;

&lt;p&gt;Tek bir araç seçmek yerine doğrulamayı katmanlı kurmak daha sağlıklıdır.&lt;/p&gt;

&lt;p&gt;Önerilen akış:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Editör seviyesinde hızlı doğrulama&lt;/li&gt;
&lt;li&gt;CI’da şema doğrulaması&lt;/li&gt;
&lt;li&gt;CI’da lint ve kalite kontrolü&lt;/li&gt;
&lt;li&gt;Çalışan API için sözleşme doğrulaması&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Yazarken doğrulayın
&lt;/h2&gt;

&lt;p&gt;Belirtimi yazarken Swagger Editor veya entegre bir API tasarım aracı kullanın. Amaç, bariz hataları daha dosya commit edilmeden yakalamaktır.&lt;/p&gt;

&lt;p&gt;Örneğin şu hata editör seviyesinde hemen görünmelidir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada &lt;code&gt;{id}&lt;/code&gt; path içinde kullanılmıştır, ancak &lt;code&gt;parameters&lt;/code&gt; altında tanımlanmamıştır.&lt;/p&gt;

&lt;p&gt;Düzeltilmiş hali:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. CI’da doğruluk kapısı ekleyin
&lt;/h2&gt;

&lt;p&gt;Her pull request’te OpenAPI dosyasını doğrulayın. Dosya OpenAPI şemasına göre geçerli değilse build başarısız olmalıdır.&lt;/p&gt;

&lt;p&gt;GitHub Actions örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate OpenAPI&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openapi.yaml"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;validate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Python&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.11"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install validator&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install openapi-spec-validator&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate spec&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openapi-spec-validator openapi.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu kontrol pazarlık konusu olmamalıdır. Geçersiz belirtim merge edilmemelidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. CI’da kalite kapısı ekleyin
&lt;/h2&gt;

&lt;p&gt;Şema doğrulaması dosyanın geçerli olduğunu söyler. Ancak API tasarımının tutarlı olduğunu söylemez. Bunun için Spectral veya Vacuum gibi bir linter kullanın.&lt;/p&gt;

&lt;p&gt;GitHub Actions içinde Spectral örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lint OpenAPI&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openapi.yaml"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.spectral.yaml"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Spectral&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g @stoplight/spectral-cli&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lint spec&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;spectral lint openapi.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Başlangıç için yerleşik OpenAPI kurallarını kullanın. Sonra ekibinizin standartlarına göre özel kurallar ekleyin.&lt;/p&gt;

&lt;p&gt;Bu yaklaşım, &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD'de testleri otomatikleştirmeyi&lt;/a&gt; güvenilir kılan aynı prensibe dayanır: kontrol, biri hatırladığında değil, her değişiklikte çalışır.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Çalışan API’yi belirtime göre doğrulayın
&lt;/h2&gt;

&lt;p&gt;Belirtim doğru olabilir, ancak uygulama ondan sapmış olabilir. Bu yüzden çalışma zamanı doğrulaması veya sözleşme testi ekleyin.&lt;/p&gt;

&lt;p&gt;Kontrol edilmesi gerekenler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yanıt gövdesi belirtimdeki şemaya uyuyor mu?&lt;/li&gt;
&lt;li&gt;Zorunlu alanlar dönüyor mu?&lt;/li&gt;
&lt;li&gt;Alan tipleri doğru mu?&lt;/li&gt;
&lt;li&gt;Hata yanıtları belgelenen formatta mı?&lt;/li&gt;
&lt;li&gt;Status code’lar belirtimle uyumlu mu?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog üzerinden veya test paketinizde sözleşme testleriyle bu kontrolü çalıştırabilirsiniz. Test tarafında &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;faydalı API iddiaları yazmak&lt;/a&gt;, yanıtların belgelenmiş şemaya göre nasıl kontrol edileceğini açıklar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yaygın hata: belirtimi yalnızca bir kez doğrulamak
&lt;/h2&gt;

&lt;p&gt;Birçok ekip OpenAPI belirtimini ilk yazdığında doğrular, sonra bir daha kontrol etmez. Bu noktadan sonra belirtim yavaşça çürür.&lt;/p&gt;

&lt;p&gt;Tipik senaryo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Geliştirici yeni endpoint ekler.&lt;/li&gt;
&lt;li&gt;Kod güncellenir.&lt;/li&gt;
&lt;li&gt;OpenAPI dosyası unutulur.&lt;/li&gt;
&lt;li&gt;Belgeler eski kalır.&lt;/li&gt;
&lt;li&gt;SDK yanlış üretilir.&lt;/li&gt;
&lt;li&gt;Tüketici ekipler hatalı sözleşmeye göre entegrasyon yapar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bunu önlemek için doğrulamayı sürekli hale getirin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Her pull request’te çalıştırın.&lt;/li&gt;
&lt;li&gt;Belirtim değiştiğinde zorunlu hale getirin.&lt;/li&gt;
&lt;li&gt;API davranışı değiştiğinde sözleşme testlerini çalıştırın.&lt;/li&gt;
&lt;li&gt;Hatalı belirtimi başarısız bir birim testi gibi ele alın.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu, &lt;a href="http://apidog.com/blog/what-is-automated-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;otomatik test&lt;/a&gt; yaklaşımıyla aynı mantığa sahiptir: kontrol, manuel karar gerektirmeden çalıştığında değerlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAPI sürümünü açıkça doğrulayın
&lt;/h2&gt;

&lt;p&gt;OpenAPI 3.0 ve 3.1 arasında özellikle JSON Schema uyumluluğu açısından önemli farklar vardır. OpenAPI 3.1, JSON Schema ile daha uyumlu hale gelmiştir ve bazı şema davranışları değişmiştir.&lt;/p&gt;

&lt;p&gt;Bu nedenle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Belirtimde &lt;code&gt;openapi&lt;/code&gt; sürümünü açıkça yazın.&lt;/li&gt;
&lt;li&gt;Doğrulayıcınızın bu sürümü desteklediğinden emin olun.&lt;/li&gt;
&lt;li&gt;Araç varsayılanlarını kontrol edin.&lt;/li&gt;
&lt;li&gt;CI’da kullanılan doğrulayıcı sürümünü sabitleyin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.1.0&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Example API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Araçlarınız 3.0 varsayıyor ama belirtiminiz 3.1 kullanıyorsa yanlış pozitif veya yanlış negatif sonuçlar alabilirsiniz. Resmi &lt;a href="https://spec.openapis.org/oas/latest.html" rel="noopener noreferrer"&gt;OpenAPI Belirtimi&lt;/a&gt;, sürüm farklarını belgeler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doğrulayıcıların yakaladığı tipik hatalar
&lt;/h2&gt;

&lt;p&gt;“Belirtim yanlış” ifadesi tek başına yeterince aksiyon alınabilir değildir. Doğrulayıcıların yakaladığı hata tiplerini net görmek daha faydalıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yapısal hatalar
&lt;/h2&gt;

&lt;p&gt;Örnek hatalar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Var olmayan şemaya giden &lt;code&gt;$ref&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Eksik &lt;code&gt;description&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tanımlanmamış path parametresi&lt;/li&gt;
&lt;li&gt;Yanlış veri tipi&lt;/li&gt;
&lt;li&gt;Geçersiz &lt;code&gt;responses&lt;/code&gt; yapısı&lt;/li&gt;
&lt;li&gt;Hatalı YAML girintisi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hatalı örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;int&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Burada &lt;code&gt;int&lt;/code&gt; geçerli bir OpenAPI tipi değildir. Doğrusu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Başka bir örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{userId}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu belirtimde &lt;code&gt;userId&lt;/code&gt; path parametresi tanımlanmamıştır. Doğrusu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{userId}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;userId&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu tür hatalar kod üreticilerini bozabilir veya hatalı SDK üretilmesine neden olabilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kalite hataları
&lt;/h2&gt;

&lt;p&gt;Kalite hataları genellikle ayrıştırıcıyı bozmaz, ancak API tüketimini zorlaştırır.&lt;/p&gt;

&lt;p&gt;Örnekler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;operationId&lt;/code&gt; eksik&lt;/li&gt;
&lt;li&gt;Bazı path’ler &lt;code&gt;snake_case&lt;/code&gt;, bazıları &lt;code&gt;camelCase&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sadece &lt;code&gt;200&lt;/code&gt; yanıtı belgelenmiş&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;400&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt;, &lt;code&gt;404&lt;/code&gt; gibi hata yanıtları yok&lt;/li&gt;
&lt;li&gt;Gerçekte zorunlu olan request body isteğe bağlı gösterilmiş&lt;/li&gt;
&lt;li&gt;Endpoint açıklamaları yetersiz&lt;/li&gt;
&lt;li&gt;Tag kullanımı tutarsız&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eksik örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create user&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha iyi örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;createUser&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create user&lt;/span&gt;
      &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Users&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/CreateUserRequest"&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;201"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User created&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;400"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Invalid request&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;401"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Unauthorized&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu kalite çizgisini koruyan araç linter’dır. Gerçek davranışın belirtimle uyumlu kalmasını ise &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API sözleşme testi&lt;/a&gt; doğrular.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tasarıma öncelik veren iş akışında doğrulama
&lt;/h2&gt;

&lt;p&gt;Birçok ekip artık API’yi önce OpenAPI belirtimiyle tasarlıyor. Sonra bu belirtimden şunlar üretiliyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sunucu taslakları&lt;/li&gt;
&lt;li&gt;Mock API’ler&lt;/li&gt;
&lt;li&gt;Belgeler&lt;/li&gt;
&lt;li&gt;SDK’ler&lt;/li&gt;
&lt;li&gt;Test senaryoları&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu modelde OpenAPI dosyası yalnızca dokümantasyon değildir. Sistemin doğruluk kaynağıdır.&lt;/p&gt;

&lt;p&gt;Bu yüzden tasarım öncelikli akışta doğrulama şu noktalarda çalışmalıdır:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tasarım sırasında&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Editör içinde canlı doğrulama&lt;/li&gt;
&lt;li&gt;Hatalı şema veya eksik alanları erken yakalama&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pull request sırasında&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Şema doğrulaması&lt;/li&gt;
&lt;li&gt;Lint kuralları&lt;/li&gt;
&lt;li&gt;Ekip standartları&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mock üretiminden önce&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mock sunucunun yanlış sözleşmeden üretilmesini engelleme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uygulama testlerinde&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerçek API’nin belirtime uyduğunu kontrol etme&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Temiz bir belirtim, mock sunucunun da doğru davranmasını sağlar. Bu da frontend ve istemci ekiplerinin güvenilir bir yer tutucu API’ye karşı geliştirme yapmasını mümkün kılar. Bir belirtimin mock akışını nasıl beslediğini görmek için &lt;a href="http://apidog.com/blog/mock-an-api-for-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;test için bir API'yi taklit etme&lt;/a&gt; kılavuzuna bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Önerilen minimum kurulum
&lt;/h2&gt;

&lt;p&gt;Küçük veya orta ölçekli bir ekip için pratik minimum kurulum şöyle olabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Editör:
  Swagger Editor veya entegre API tasarım aracı

CI:
  openapi-spec-validator
  Spectral

Runtime:
  Apidog veya sözleşme testleri
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repository yapısı örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── openapi.yaml
├── .spectral.yaml
└── .github
    └── workflows
        ├── validate-openapi.yml
        └── lint-openapi.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temel akış:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Şema doğrulaması&lt;/span&gt;
openapi-spec-validator openapi.yaml

&lt;span class="c"&gt;# Kalite kontrolü&lt;/span&gt;
spectral lint openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pull request merge koşulu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAPI şema doğrulaması geçmeli&lt;/li&gt;
&lt;li&gt;Lint kuralları geçmeli&lt;/li&gt;
&lt;li&gt;Sözleşme testleri geçmeli&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu kurulum basittir, otomatikleştirilebilir ve ekip büyüdükçe genişletilebilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Bir OpenAPI doğrulayıcı ile linter arasındaki fark nedir?
&lt;/h2&gt;

&lt;p&gt;OpenAPI doğrulayıcı, belirtimin OpenAPI şemasına göre yapısal olarak doğru olup olmadığını kontrol eder. Sonuç genellikle geçiş veya hata şeklindedir.&lt;/p&gt;

&lt;p&gt;Linter ise kalite ve stil kurallarını kontrol eder. Örneğin her endpoint’in &lt;code&gt;summary&lt;/code&gt; içermesi, &lt;code&gt;operationId&lt;/code&gt; kullanılması veya path adlandırmasının tutarlı olması gibi kuralları uygular.&lt;/p&gt;

&lt;p&gt;Güçlü bir iş akışı ikisini birlikte kullanır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bir OpenAPI belirtimini ücretsiz doğrulayabilir miyim?
&lt;/h2&gt;

&lt;p&gt;Evet. Swagger Editor, Spectral, openapi-spec-validator, Redocly CLI ve Vacuum ücretsiz ve açık kaynaklı seçeneklerdir. Apidog da ücretsiz katmanında belirtim doğrulaması sağlar ve çalışma zamanı kontrolleri ekler.&lt;/p&gt;

&lt;p&gt;Doğrulamayı maliyet nedeniyle atlamak için iyi bir sebep yoktur.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAPI 3.0 ve 3.1’i farklı mı doğrulamalıyım?
&lt;/h2&gt;

&lt;p&gt;Aynı doğrulama yaklaşımını kullanabilirsiniz, ancak sürümü açıkça sabitlemelisiniz. OpenAPI 3.1, JSON Schema ile daha uyumlu hale geldiği için bazı şema davranışları değişmiştir.&lt;/p&gt;

&lt;p&gt;Araçlarınızın belirtimde beyan edilen sürümü desteklediğinden emin olun.&lt;/p&gt;

&lt;h2&gt;
  
  
  Belirtim doğrulaması nerede çalışmalı?
&lt;/h2&gt;

&lt;p&gt;İki yerde çalışmalıdır:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Belirtimi yazarken editörde&lt;/li&gt;
&lt;li&gt;Her pull request’te CI içinde&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sadece editör doğrulamasına güvenmek yeterli değildir, çünkü atlanabilir. CI doğrulaması ise merge öncesi zorunlu kapı sağlar.&lt;/p&gt;

&lt;h2&gt;
  
  
  API’min belirtime uygun olduğunu nasıl kontrol ederim?
&lt;/h2&gt;

&lt;p&gt;Belirtim doğrulaması yalnızca OpenAPI dosyasının doğru olduğunu gösterir. Uygulamanın bu sözleşmeye uyduğunu kanıtlamaz.&lt;/p&gt;

&lt;p&gt;Bunu kontrol etmek için canlı API yanıtlarını belirtimdeki şemalarla karşılaştıran sözleşme testleri veya çalışma zamanı doğrulaması çalıştırmalısınız. Apidog bunu doğrudan yapabilir; sözleşme test çerçeveleri de aynı kontrolü test paketi içinde uygulayabilir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Newman ve Postman Arasındaki Fark Nedir?</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:29:43 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/newman-ve-postman-arasindaki-fark-nedir-37ji</link>
      <guid>https://forem.com/tobiass_hoffmann/newman-ve-postman-arasindaki-fark-nedir-37ji</guid>
      <description>&lt;p&gt;Newman ve Postman rakip değildir. Aynı API test iş akışının iki farklı aşamasını çözerler: Postman ile istekleri tasarlar, testleri yazarsınız; Newman ile aynı koleksiyonları GUI olmadan terminalde, CI/CD içinde çalıştırırsınız. Kısa kural: Postman geliştirme ve hata ayıklama içindir, Newman otomasyon içindir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu ayrımı doğru kurarsanız API testlerini hem geliştirici makinesinde hızlıca hazırlayabilir hem de her pull request, gece çalışması veya deploy sonrası kontrol için otomatik hale getirebilirsiniz. Aşağıda Postman ve Newman'ın rollerini, Newman'ın nasıl kurulacağını ve CI/CD işlem hattına nasıl ekleneceğini adım adım göreceksiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman Nedir?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; grafiksel bir API platformudur. Masaüstü uygulaması üzerinden istekler oluşturur, bunları koleksiyonlar ve klasörler halinde düzenler, ortam değişkenleriyle &lt;code&gt;baseUrl&lt;/code&gt;, token veya kullanıcı bilgisi gibi değerleri yönetirsiniz.&lt;/p&gt;

&lt;p&gt;Postman'de her isteğin &lt;strong&gt;Tests&lt;/strong&gt; sekmesine JavaScript tabanlı testler yazabilirsiniz. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Durum kodu 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Toplam sipariş pozitif bir sayı&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;above&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yaklaşım özellikle şu işler için uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yeni bir endpoint'i hızlıca denemek&lt;/li&gt;
&lt;li&gt;Header, body veya auth ayarlarında hata ayıklamak&lt;/li&gt;
&lt;li&gt;Yanıt yapısını incelemek&lt;/li&gt;
&lt;li&gt;Regresyon testleri için koleksiyon hazırlamak&lt;/li&gt;
&lt;li&gt;Takım içinde ortak API koleksiyonları paylaşmak&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postman interaktif kullanım için güçlüdür. Bir geliştirici isteği gönderir, yanıtı inceler, değişkenleri düzeltir ve saniyeler içinde tekrar dener. Bu iş akışı grafiksel arayüzden faydalanır. Daha ayrıntılı bir örnek için &lt;a href="http://apidog.com/blog/how-to-test-apis-with-postman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Postman ile API'ler nasıl test edilir&lt;/a&gt; kılavuzuna bakabilirsiniz.&lt;/p&gt;

&lt;p&gt;Ancak Postman'in zayıf olduğu alan katılımsız çalıştırmadır. Bir CI sunucusu Postman uygulamasını açıp Collection Runner düğmesine tıklayamaz. Bu noktada Newman devreye girer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Newman Nedir?
&lt;/h2&gt;

&lt;p&gt;Newman, Postman'in resmi komut satırı koleksiyon çalıştırıcısıdır. Postman'de oluşturduğunuz koleksiyon JSON dosyasını alır, içindeki istekleri ve &lt;code&gt;pm.test&lt;/code&gt; betiklerini terminalde çalıştırır.&lt;/p&gt;

&lt;p&gt;Newman bir npm paketidir ve şu şekilde kurulabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; newman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir koleksiyonu çalıştırmak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut şunları yapar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;orders-api.postman_collection.json&lt;/code&gt; dosyasındaki istekleri sırayla çalıştırır.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;staging.postman_environment.json&lt;/code&gt; içindeki değişkenleri kullanır.&lt;/li&gt;
&lt;li&gt;Her isteğin test betiklerini yürütür.&lt;/li&gt;
&lt;li&gt;Sonuçları terminalde özetler.&lt;/li&gt;
&lt;li&gt;Testlerden biri başarısız olursa sıfırdan farklı exit code döndürür.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bu son madde CI/CD için kritiktir. CI sistemi exit code'u okuyabilir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt;: Testler geçti, işlem hattı devam eder.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt; dışı: Testlerden biri başarısız oldu, build başarısız sayılır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Newman, Postman ile aynı yürütme motorunu kullandığı için Postman'de geçen bir koleksiyon Newman'da da aynı test mantığıyla çalışır. Ayrı bir test dili öğrenmeniz gerekmez.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman ve Newman Karşılaştırması
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Yön&lt;/th&gt;
&lt;th&gt;Postman&lt;/th&gt;
&lt;th&gt;Newman&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arayüz&lt;/td&gt;
&lt;td&gt;Grafiksel masaüstü uygulaması&lt;/td&gt;
&lt;td&gt;Komut satırı, UI yok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Birincil kullanım&lt;/td&gt;
&lt;td&gt;Yazma, hata ayıklama, keşfetme&lt;/td&gt;
&lt;td&gt;Otomatik, katılımsız yürütme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nerede çalışır&lt;/td&gt;
&lt;td&gt;Geliştirici makinesi&lt;/td&gt;
&lt;td&gt;CI sunucusu, terminal, zamanlayıcı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maliyet&lt;/td&gt;
&lt;td&gt;Ücretsiz katman ve ücretli planlar&lt;/td&gt;
&lt;td&gt;Açık kaynak, ücretsiz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kurulum&lt;/td&gt;
&lt;td&gt;Masaüstü yükleyici&lt;/td&gt;
&lt;td&gt;npm paketi veya Docker imajı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test betikleri&lt;/td&gt;
&lt;td&gt;Uygulamada yazılır ve çalıştırılır&lt;/td&gt;
&lt;td&gt;Aynı betikleri başsız çalıştırır&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raporlama&lt;/td&gt;
&lt;td&gt;Uygulama içi sonuç paneli&lt;/td&gt;
&lt;td&gt;Terminal çıktısı, JUnit, HTML raporlayıcıları&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En iyi olduğu alan&lt;/td&gt;
&lt;td&gt;İnteraktif geliştirme&lt;/td&gt;
&lt;td&gt;Tekrarlanabilir otomasyon&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aralarındaki köprü koleksiyon JSON dosyasıdır. Koleksiyonu Postman'de hazırlarsınız, Newman ile otomasyonda çalıştırırsınız.&lt;/p&gt;

&lt;h2&gt;
  
  
  Newman CI/CD'ye Nasıl Eklenir?
&lt;/h2&gt;

&lt;p&gt;Temel akış her CI sağlayıcısında benzerdir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Postman koleksiyonunu dışa aktarın.&lt;/li&gt;
&lt;li&gt;Ortam dosyasını dışa aktarın.&lt;/li&gt;
&lt;li&gt;Bu JSON dosyalarını repoya ekleyin.&lt;/li&gt;
&lt;li&gt;CI işinde Newman'ı kurun.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;newman run&lt;/code&gt; komutunu çalıştırın.&lt;/li&gt;
&lt;li&gt;Newman'ın exit code'una göre build'i başarılı veya başarısız sayın.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Koleksiyon ve ortam dosyalarını dışa aktarın
&lt;/h3&gt;

&lt;p&gt;Postman'de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Koleksiyonunuzu seçin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; seçeneğiyle JSON dosyası alın.&lt;/li&gt;
&lt;li&gt;Kullanacağınız environment için de export alın.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek dosya yapısı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── postman
│   ├── orders-api.postman_collection.json
│   └── staging.postman_environment.json
└── src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Newman'ı yerelde deneyin
&lt;/h3&gt;

&lt;p&gt;CI'a eklemeden önce komutu lokal terminalde çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run postman/orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; postman/staging.postman_environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Başarılı çalışırsa CI'a taşımak daha güvenli olur.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GitHub Actions'a ekleyin
&lt;/h3&gt;

&lt;p&gt;Örnek GitHub Actions adımı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API testlerini çalıştır&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;npm install -g newman&lt;/span&gt;
    &lt;span class="s"&gt;newman run postman/orders-api.postman_collection.json \&lt;/span&gt;
      &lt;span class="s"&gt;--environment postman/staging.postman_environment.json \&lt;/span&gt;
      &lt;span class="s"&gt;--reporters cli,junit \&lt;/span&gt;
      &lt;span class="s"&gt;--reporter-junit-export results.xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JUnit raporu üretmek CI panolarında test sonuçlarını daha okunabilir hale getirir. &lt;code&gt;--reporters cli,junit&lt;/code&gt; ile hem terminal çıktısı alırsınız hem de XML raporu üretirsiniz.&lt;/p&gt;

&lt;p&gt;Daha kapsamlı örnekler için &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD'de API testlerini otomatikleştirme&lt;/a&gt; ve &lt;a href="http://apidog.com/blog/api-test-automation-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GitHub Actions ile API test otomasyonu&lt;/a&gt; rehberlerine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faydalı Newman Komutları
&lt;/h2&gt;

&lt;p&gt;Newman'ı sadece temel &lt;code&gt;run&lt;/code&gt; komutuyla değil, CI için önemli bayraklarla kullanmak gerekir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Belirli environment ile çalıştırma
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu, Postman'de aktif olan ortamı varsaymak yerine CI'da hangi değişkenlerin kullanılacağını açıkça belirtir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Veri odaklı test çalıştırma
&lt;/h3&gt;

&lt;p&gt;CSV veya JSON dosyasındaki her satır için koleksiyonu tekrar çalıştırabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--iteration-data&lt;/span&gt; test-data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örnek &lt;code&gt;test-data.csv&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;orderId,expectedStatus
1001,200
1002,200
9999,404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman testlerinde bu değerlere değişken olarak erişebilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Beklenen durum kodu döner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iterationData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expectedStatus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  İlk hatada durdurma
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--bail&lt;/code&gt;, ilk hata sonrası çalışmayı durdurur. Hızlı geri bildirim istediğiniz pull request kontrollerinde kullanışlıdır.&lt;/p&gt;

&lt;h3&gt;
  
  
  İstek zaman aşımı belirleme
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeout-request&lt;/span&gt; 10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu örnekte tek bir isteğin en fazla 10 saniye sürmesine izin verilir. Yanıt vermeyen servisler nedeniyle CI job'ının takılı kalmasını önler.&lt;/p&gt;

&lt;h3&gt;
  
  
  İstekler arasında bekleme ekleme
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--delay-request&lt;/span&gt; 500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--delay-request 500&lt;/code&gt;, istekler arasında 500 ms bekler. Rate limit uygulayan API'lerde faydalıdır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sadece belirli klasörü çalıştırma
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--folder&lt;/span&gt; &lt;span class="s2"&gt;"Smoke Tests"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sayede aynı koleksiyon içinde küçük bir smoke test setini pull request'lerde, tam regresyon setini gece çalışmasında kullanabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker ile Newman Çalıştırma
&lt;/h2&gt;

&lt;p&gt;Node.js kurmak istemiyorsanız Newman'ı Docker ile çalıştırabilirsiniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/postman:/etc/newman"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  postman/newman run /etc/newman/orders-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; /etc/newman/staging.postman_environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yaklaşım özellikle CI ortamlarında kullanışlıdır çünkü build makinesine Node.js veya global npm paketi kurmanız gerekmez.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman'den Newman'a Geçerken Yaygın Hatalar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Environment dosyasını CI'a eklememek
&lt;/h3&gt;

&lt;p&gt;Postman'de çalışan bir istek, aktif environment sayesinde değişkenleri buluyor olabilir. Newman'da bu environment dosyasını açıkça vermeniz gerekir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run collection.json &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aksi halde &lt;code&gt;{{baseUrl}}&lt;/code&gt;, &lt;code&gt;{{token}}&lt;/code&gt; gibi değerler çözümlenmez.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gizli bilgileri repoya koymak
&lt;/h3&gt;

&lt;p&gt;Environment dosyaları token, API key veya şifre içerebilir. Bunları doğrudan repoya eklemek yerine CI secret'larıyla yönetmek daha güvenlidir.&lt;/p&gt;

&lt;p&gt;Örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-var&lt;/span&gt; &lt;span class="s2"&gt;"baseUrl=&lt;/span&gt;&lt;span class="nv"&gt;$BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-var&lt;/span&gt; &lt;span class="s2"&gt;"token=&lt;/span&gt;&lt;span class="nv"&gt;$API_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Postman Cloud durumuna güvenmek
&lt;/h3&gt;

&lt;p&gt;CI, Postman masaüstü oturumunuzu veya cloud senkronizasyon durumunuzu bilmez. CI sadece verdiğiniz JSON dosyalarını çalıştırır. Bu yüzden dışa aktardığınız koleksiyonun gerçekten güncel olduğundan emin olun.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Koleksiyon JSON'unu güncel tutmamak
&lt;/h3&gt;

&lt;p&gt;Postman'de koleksiyonu düzenleyip repodaki JSON dosyasını güncellemezseniz CI eski testleri çalıştırmaya devam eder.&lt;/p&gt;

&lt;p&gt;Pratik çözüm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Koleksiyon değiştiğinde export işlemini pull request'in parçası yapın.&lt;/li&gt;
&lt;li&gt;Koleksiyon dosyasını kod değişikliğiyle birlikte review edin.&lt;/li&gt;
&lt;li&gt;CI'da kullanılan dosyanın kaynağını net tutun.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Lokal ve CI ortamlarını farklı yapılandırmak
&lt;/h3&gt;

&lt;p&gt;Lokal makinede çalışan test CI'da başarısız oluyorsa genellikle fark şuradadır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Farklı &lt;code&gt;baseUrl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Eksik token&lt;/li&gt;
&lt;li&gt;Farklı test datası&lt;/li&gt;
&lt;li&gt;Network erişim problemi&lt;/li&gt;
&lt;li&gt;Zaman aşımı değeri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yüzden CI komutunu lokal terminalde mümkün olduğunca aynı parametrelerle test edin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ne Zaman Postman, Ne Zaman Newman Kullanmalı?
&lt;/h2&gt;

&lt;p&gt;Postman'i şu durumlarda kullanın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yeni API endpoint'i geliştirirken&lt;/li&gt;
&lt;li&gt;Request body veya header denemeleri yaparken&lt;/li&gt;
&lt;li&gt;Auth problemlerini debug ederken&lt;/li&gt;
&lt;li&gt;Test betiklerini yazıp doğrularken&lt;/li&gt;
&lt;li&gt;Koleksiyon yapısını düzenlerken&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Newman'ı şu durumlarda kullanın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull request açıldığında API testleri çalıştırmak için&lt;/li&gt;
&lt;li&gt;Deploy sonrası smoke test yapmak için&lt;/li&gt;
&lt;li&gt;Gece regresyon testleri çalıştırmak için&lt;/li&gt;
&lt;li&gt;Test sonuçlarını CI raporlarına aktarmak için&lt;/li&gt;
&lt;li&gt;Script veya cron job içinde koleksiyon yürütmek için&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pratik ayrım şudur: İnsan yazarken Postman, makine çalıştırırken Newman.&lt;/p&gt;

&lt;p&gt;Newman kullanmadan CI'da Postman koleksiyonlarını çalıştırmaya yönelik diğer yaklaşımlar için &lt;a href="http://apidog.com/blog/run-postman-collections-ci-without-newman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Newman olmadan CI'da Postman koleksiyonlarını çalıştırma&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Birleşik Alternatif: Apidog
&lt;/h2&gt;

&lt;p&gt;Postman ve Newman birlikte güçlü bir akış sağlar, ancak iki ayrı parçayı yönetmeniz gerekir: Postman'de koleksiyon hazırlamak, JSON olarak dışa aktarmak, repoda güncel tutmak ve Newman ile çalıştırmak.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, bu süreci tek platformda birleştirir. Aynı uygulama içinde API tasarlayabilir, isteklerde hata ayıklayabilir, görsel doğrulamalarla otomatik test senaryoları oluşturabilir ve bu senaryoları yerleşik komut satırı çalıştırıcısıyla CI/CD içinde çalıştırabilirsiniz.&lt;/p&gt;

&lt;p&gt;Bu yaklaşımda test tanımları ve çalıştırma mekanizması aynı platformda bulunduğu için dışa aktarma ve senkronizasyon yükü azalır. Apidog ayrıca aynı çalışma alanında API tasarımı, mock server ve performans testi gibi iş akışlarını da kapsar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirebilir&lt;/a&gt; ve test özelliklerini ücretsiz kullanabilirsiniz. Alternatif araçları karşılaştırmak isterseniz &lt;a href="http://apidog.com/blog/best-postman-alternatives-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API testi için en iyi Postman alternatifleri&lt;/a&gt; listesine göz atabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça Sorulan Sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Newman, Postman'in yerine geçer mi?
&lt;/h3&gt;

&lt;p&gt;Hayır. Newman koleksiyon oluşturmaz veya düzenlemez. Sadece var olan Postman koleksiyonlarını terminalde çalıştırır. Koleksiyon yazma ve hata ayıklama için Postman veya benzer bir araca ihtiyacınız vardır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Newman ücretli mi?
&lt;/h3&gt;

&lt;p&gt;Hayır. Newman açık kaynaklı ve ücretsizdir. npm paketi olarak dağıtılır. Postman'in ücretsiz ve ücretli planları vardır, ancak Newman'ın kendisi ücretsizdir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman testlerim Newman'da aynı şekilde çalışır mı?
&lt;/h3&gt;

&lt;p&gt;Evet. Newman, Postman ile aynı yürütme motorunu kullanır. &lt;code&gt;pm.test&lt;/code&gt; onaylamaları, request akışı ve test betikleri aynı mantıkla çalışır. Yine de CI'a almadan önce koleksiyonu lokal terminalde Newman ile denemek iyi bir pratiktir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Newman test hatalarını nasıl bildirir?
&lt;/h3&gt;

&lt;p&gt;Newman terminale özet çıktı yazar ve herhangi bir test başarısız olduğunda sıfırdan farklı exit code ile çıkar. CI sistemi bu exit code'u okuyarak build'i başarısız sayabilir. Ayrıca JUnit XML ve HTML gibi raporlayıcılarla sonuçları CI panolarına aktarabilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node.js kurmadan Newman çalıştırabilir miyim?
&lt;/h3&gt;

&lt;p&gt;Evet. Newman doğrudan npm paketi olduğu için normal kurulumda Node.js gerekir. Ancak Node.js kurmak istemiyorsanız &lt;code&gt;postman/newman&lt;/code&gt; Docker imajını kullanabilirsiniz. Bu yöntem CI ortamlarında sık tercih edilir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>API Mocklama Kullanım Alanları: Ne Zaman ve Neden API Mock'lanmalı</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:29:26 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/api-mocklama-kullanim-alanlari-ne-zaman-ve-neden-api-mocklanmali-50j7</link>
      <guid>https://forem.com/tobiass_hoffmann/api-mocklama-kullanim-alanlari-ne-zaman-ve-neden-api-mocklanmali-50j7</guid>
      <description>&lt;p&gt;Çoğu ekip bir API'yi nasıl taklit edeceğini bilir. Asıl karar, taklidin ne zaman gerçek bir darboğazı kaldırdığı ve ne zaman bakımı gereken ek bir katmana dönüştüğüdür. Doğru yerde kullanılan mock, geliştirmeyi hızlandırır; alışkanlıkla oluşturulan mock ise gerçeklikten uzaklaşıp testlerinize sessizce yanlış güven verir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu yazıyı bir karar kontrol listesi gibi kullanın. Her bölüm, API mock kullanımının pratikte değer ürettiği bir senaryoyu ele alır: tamamlanmamış backend ile frontend geliştirmek, hata yollarını test etmek, üçüncü taraf servisleri izole etmek, demoları deterministik yapmak ve CI testlerini kararlı tutmak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paralel ön uç ve arka uç geliştirme
&lt;/h2&gt;

&lt;p&gt;Frontend ekibinin henüz backend tarafından uygulanmamış bir endpoint'e ihtiyacı varsa iki kötü seçenek doğar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend bekler.&lt;/li&gt;
&lt;li&gt;Frontend, gerçek servisle ilk temasında bozulabilecek varsayımlarla kod yazar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mock burada bağımlılığı keser. Pratik akış şu şekilde olmalıdır:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frontend ve backend ekibi endpoint sözleşmesi üzerinde anlaşır.&lt;/li&gt;
&lt;li&gt;Sözleşme mümkünse bir &lt;a href="https://spec.openapis.org/oas/latest.html" rel="noopener noreferrer"&gt;OpenAPI&lt;/a&gt; dokümanı olarak yazılır.&lt;/li&gt;
&lt;li&gt;Mock, bu sözleşmeden üretilir.&lt;/li&gt;
&lt;li&gt;Frontend mock base URL'ine karşı geliştirme yapar.&lt;/li&gt;
&lt;li&gt;Backend gerçek endpoint'i aynı sözleşmeye göre uygular.&lt;/li&gt;
&lt;li&gt;Endpoint hazır olduğunda frontend yalnızca base URL'i değiştirir.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Örnek yapı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend
  API_BASE_URL=https://mock.example.com

Backend hazır olduğunda:
  API_BASE_URL=https://api.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buradaki kritik nokta, mock'un tek taraflı varsayımlardan değil ortak sözleşmeden üretilmesidir. Sadece frontend'in icat ettiği bir mock, frontend varsayımlarını kodlar. Ortak spesifikasyondan üretilen mock ise iki ekibi hizalı tutar; bu, &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API sözleşme testinin&lt;/a&gt; arkasındaki prensiple aynıdır.&lt;/p&gt;

&lt;p&gt;Bu kullanımın pratik getirisi şudur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend backend'i beklemeden ekranları geliştirir.&lt;/li&gt;
&lt;li&gt;Backend, yarım endpoint talepleriyle bölünmeden uygulamaya odaklanır.&lt;/li&gt;
&lt;li&gt;Tasarımcılar ve ürün yöneticileri erken aşamada tıklanabilir akış görür.&lt;/li&gt;
&lt;li&gt;Mock, OpenAPI'den üretildiği sürece bakım maliyeti düşük kalır.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  İsteğe bağlı olarak tetikleyemeyeceğiniz hata yollarını test etme
&lt;/h2&gt;

&lt;p&gt;Sağlıklı bir API genellikle &lt;code&gt;200&lt;/code&gt; döner. Ancak istemci kodunuzun yalnızca başarılı yanıtları değil, şu durumları da yönetmesi gerekir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;429 Too Many Requests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;500 Internal Server Error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;503 Service Unavailable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;zaman aşımı&lt;/li&gt;
&lt;li&gt;bozuk JSON&lt;/li&gt;
&lt;li&gt;alan adı açısından geçersiz ama HTTP açısından başarılı yanıtlar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gerçek bir sunucu, testiniz istediğinde bu hataları deterministik olarak üretmez. Mock burada kontrol sağlar.&lt;/p&gt;

&lt;p&gt;Örneğin bir istemci için şu senaryoları bilinçli şekilde üretin:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test Edilemeyen Hata&lt;/th&gt;
&lt;th&gt;Mock Kurulumu&lt;/th&gt;
&lt;th&gt;Neyi Kanıtlar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sunucu hatası&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;500&lt;/code&gt; döndür&lt;/td&gt;
&lt;td&gt;İstemci yeniden dener, sonra zarifçe düşer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oran sınırlaması&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Retry-After&lt;/code&gt; ile &lt;code&gt;429&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;İstemci doğru aralığı bekler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yavaş ağ&lt;/td&gt;
&lt;td&gt;Yanıtı 5 sn geciktir&lt;/td&gt;
&lt;td&gt;İstemci düzgün bir şekilde zaman aşımına uğrar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hatalı yük&lt;/td&gt;
&lt;td&gt;Bozuk JSON döndür&lt;/td&gt;
&lt;td&gt;Ayrıştırıcı çökmeden başarısız olur&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Basit bir test mantığı şöyle görünebilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;429 durumunda Retry-After başlığına göre bekler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;mockApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/orders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rate_limited&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retry-After&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchOrdersWithRetry&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;retryAfterSeconds&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu kullanım çoğu ekipte atlanır. Oysa test edilmemiş hata yönetimi, fiilen sahip olmadığınız hata yönetimidir. Her hata yolunu varsaymak yerine doğrulamak için mock'u kapsamlı &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API doğrulama testleriyle&lt;/a&gt; birlikte kullanın.&lt;/p&gt;

&lt;p&gt;Ayrıca yalnızca HTTP hatalarını değil, alan adı açısından hatalı başarılı yanıtları da test edin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ord_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UNKNOWN_STATUS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-42&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yanıt teknik olarak &lt;code&gt;200&lt;/code&gt; olabilir; ancak iş kurallarınız için geçersizdir. Gerçek sunucu doğru çalışıyorsa bunu hiç göndermeyebilir. Mock ile bu tür bozuk ama iyi biçimlendirilmiş verileri üretip istemci varsayımlarını görünür hale getirebilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Üçüncü taraf bir API'nin yerini almak
&lt;/h2&gt;

&lt;p&gt;Testleriniz gerçek bir ödeme işlemcisini, harita servisini veya kargo API'sini çağırıyorsa şu riskleri alırsınız:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testler yavaşlar.&lt;/li&gt;
&lt;li&gt;Bazı çağrılar maliyet oluşturabilir.&lt;/li&gt;
&lt;li&gt;Sandbox ortamı kapalıysa testleriniz de kırılır.&lt;/li&gt;
&lt;li&gt;Rate limit veya ağ sorunları, kodunuzla ilgisiz hatalara dönüşür.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu durumda üçüncü tarafı mock'layın.&lt;/p&gt;

&lt;p&gt;Uygulanabilir akış:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Üçüncü taraf API'nin gerçek yanıt örneklerini kaydedin veya yayınlanmış şemasını alın.&lt;/li&gt;
&lt;li&gt;Bu yanıtlardan mock endpoint'leri oluşturun.&lt;/li&gt;
&lt;li&gt;Birim ve bileşen testlerini mock'a karşı çalıştırın.&lt;/li&gt;
&lt;li&gt;Gerçek üçüncü tarafı yalnızca zamanlanmış sözleşme kontrolünde çağırın.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Örnek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Commit başına test:
  Uygulama -&amp;gt; Mock ödeme API'si

Zamanlanmış sözleşme testi:
  Contract checker -&amp;gt; Gerçek ödeme API'si
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yaklaşım testleri hızlı, ücretsiz ve deterministik yapar. Satıcı tarafında kesinti olsa bile commit başına testleriniz çalışmaya devam eder.&lt;/p&gt;

&lt;p&gt;Ancak bakım maliyeti vardır. Üçüncü taraf API size haber vermeden değişebilir ve mock bundan haberdar olmaz. Bunu azaltmak için küçük bir zamanlanmış iş çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Her gece:
  1. Gerçek üçüncü taraf endpoint çağrılır.
  2. Yanıt şeması beklenen mock şemasıyla karşılaştırılır.
  3. Sapma varsa ekip uyarılır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ayrıca satıcının changelog'una abone olmak da değerlidir. Böylece planlı değişiklikleri başarısız sözleşme testlerinden önce yakalayabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demoları ve prototipleri güçlendirme
&lt;/h2&gt;

&lt;p&gt;Müşteri önünde canlı servisleri çağıran demo risklidir. Yavaş sorgu, boş veri seti veya geçici kesinti, iyi hazırlanmış bir sunumu açıklama yapmak zorunda kaldığınız bir duruma çevirebilir.&lt;/p&gt;

&lt;p&gt;Mock, demoyu deterministik yapar. Demo için gereken veriyi açıkça kodlarsınız:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zamanında gönderilen sipariş&lt;/li&gt;
&lt;li&gt;sağlıklı metriklerle dolu dashboard&lt;/li&gt;
&lt;li&gt;temiz sonuç döndüren arama&lt;/li&gt;
&lt;li&gt;başarılı ödeme akışı&lt;/li&gt;
&lt;li&gt;beklenen kullanıcı profili&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek demo yanıtı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dashboard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"monthlyRevenue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"activeUsers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4210&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"conversionRate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;7.4&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buradaki amaç test etmek değil, kontrol sağlamaktır. İzleyicinin ne göreceğini siz belirlersiniz ve dış faktörler demoyu bozmaz.&lt;/p&gt;

&lt;p&gt;Aynı yaklaşım prototipler için de geçerlidir. Backend henüz yokken UI akışını doğrulayabilirsiniz. Eğer mock, nihai API'nin döndüreceği şekilleri temsil ediyorsa, frontend kodunuz tek kullanımlık iskele olmaktan çıkar; gerçek ürüne taşınabilir hale gelir.&lt;/p&gt;

&lt;p&gt;Pratik kontrol listesi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mock yanıtları ürün senaryosunu temsil ediyor mu?&lt;/li&gt;
&lt;li&gt;Endpoint isimleri ve payload yapıları olası gerçek API ile uyumlu mu?&lt;/li&gt;
&lt;li&gt;Frontend'de base URL dışında değişiklik gerekmeyecek mi?&lt;/li&gt;
&lt;li&gt;Demo verisi deterministik mi?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu kategorideki araçları karşılaştırmak için &lt;a href="http://apidog.com/blog/online-api-mocking-tools-comparison?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;çevrimiçi API taklit araçları&lt;/a&gt; incelemesine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI'ı hızlı ve kararlı tutmak
&lt;/h2&gt;

&lt;p&gt;CI ortamında harici servisleri çağıran test paketi, o servislerin tüm problemlerini miras alır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ağ aksaklıkları&lt;/li&gt;
&lt;li&gt;rate limit&lt;/li&gt;
&lt;li&gt;paylaşılan staging verisi&lt;/li&gt;
&lt;li&gt;üçüncü taraf kesintileri&lt;/li&gt;
&lt;li&gt;yavaş yanıt süreleri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunların her biri, incelenen kodla ilgisi olmayan flaky test hatalarına dönüşür.&lt;/p&gt;

&lt;p&gt;Flaky testler zamanla daha büyük bir soruna yol açar: ekip test hatalarını görmezden gelmeye başlar. Bu da CI'ın amacını boşa çıkarır.&lt;/p&gt;

&lt;p&gt;Harici bağımlılıkları mock'lamak, commit başına testleri hermetik hale getirir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CI test paketi:
  Uygulama -&amp;gt; Mock servisler

Ayrı zamanlanmış iş:
  Sözleşme testleri -&amp;gt; Gerçek servisler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu ayrım önemlidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit başına testler hızlı ve deterministik kalır.&lt;/li&gt;
&lt;li&gt;Gerçek API ile uyum, ayrı sözleşme testleriyle doğrulanır.&lt;/li&gt;
&lt;li&gt;Mock sapmaları kullanıcılara ulaşmadan yakalanır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yapı, sağlıklı bir &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD test hattı&lt;/a&gt; için temel bir ayrımdır.&lt;/p&gt;

&lt;p&gt;Hız kazancı yalnızca küçük bir kolaylık değildir. On iki dakikadan doksan saniyeye düşen test paketi, ekibin davranışını değiştirir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geliştiriciler testleri her commit öncesi çalıştırır.&lt;/li&gt;
&lt;li&gt;Pull request inceleyicileri sonucu beklemek zorunda kalmaz.&lt;/li&gt;
&lt;li&gt;Hatalar daha erken yakalanır.&lt;/li&gt;
&lt;li&gt;CI çıktısına güven artar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otomatik testlerin yatırım getirisi, ekibin testlere gerçekten güvenmesine bağlıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ne zaman mock kullanılmamalı?
&lt;/h2&gt;

&lt;p&gt;Mock'un temel hata modu şudur: gerçeklikle artık uyuşmayan bir mock.&lt;/p&gt;

&lt;p&gt;Bu durumda testler yeşil kalır, ancak production bozulur. Çünkü testler gerçek sistemi değil, güncelliğini kaybetmiş bir kurguyu doğrular.&lt;/p&gt;

&lt;p&gt;Şu durumlarda mock kullanmayın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testin amacı entegrasyonun kendisini doğrulamaksa.&lt;/li&gt;
&lt;li&gt;Sözleşme testi çalıştırıyorsanız.&lt;/li&gt;
&lt;li&gt;Uçtan uca test gerçek kullanıcı akışını doğruluyorsa.&lt;/li&gt;
&lt;li&gt;Mock'ladığınız bağımlılığı hiçbir zaman gerçek servise karşı kontrol etmiyorsanız.&lt;/li&gt;
&lt;li&gt;Gerçek servis test ortamında zaten hızlı, ücretsiz ve güvenilirse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Genel kural:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hız, izolasyon ve kontrol için mock kullan.
Doğruluk için küçük ama dürüst bir gerçek servis testi katmanı tut.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mock ve sözleşme kontrolünü aynı yerde yönetmek istiyorsanız, &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; API tasarımınızdan mock'lar oluşturur ve testleri hem mock'a hem de canlı endpoint'e karşı çalıştırır. Başlamak için &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirin&lt;/a&gt; ve mevcut spesifikasyonunuzdan ilerleyin. Kavramsal temel için &lt;a href="http://apidog.com/blog/mock-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mock API'nin&lt;/a&gt; ne olduğuna da bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gerçek API'yi çağırmak yerine ne zaman bir API'yi mock'lamalıyım?
&lt;/h3&gt;

&lt;p&gt;Hız, izolasyon veya kontrole ihtiyacınız olduğunda mock kullanın. Tipik örnekler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tamamlanmamış backend'e karşı frontend geliştirme&lt;/li&gt;
&lt;li&gt;gerçek sunucunun üretmeyeceği hata yollarını test etme&lt;/li&gt;
&lt;li&gt;yavaş veya ücretli üçüncü taraf servisleri izole etme&lt;/li&gt;
&lt;li&gt;deterministik demo hazırlama&lt;/li&gt;
&lt;li&gt;CI testlerini kararlı tutma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sözleşme ve uçtan uca testlerde ise gerçek API'yi çağırın.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mock kullanımı entegrasyon testinin yerini alır mı?
&lt;/h3&gt;

&lt;p&gt;Hayır. Mock, kontrol ettiğiniz kodu hızlı ve izole test etmek içindir. Entegrasyon ve sözleşme testleri gerçek sınırı doğrulamalıdır. Bu testleri mock'lamak, testin amacını ortadan kaldırır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bir mock'un güncelliğini kaybetmesini nasıl önlerim?
&lt;/h3&gt;

&lt;p&gt;Mock'u mümkünse OpenAPI gibi paylaşılan bir şemadan üretin. Sözleşme değiştiğinde mock da aynı kaynaktan güncellenir. Ek olarak, canlı API'ye karşı zamanlanmış sözleşme testleri çalıştırın. Böylece gerçek yanıtın hâlâ beklenen şemayla eşleştiğini doğrularsınız.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kontrol etmediğim bir üçüncü taraf API'yi mock'layabilir miyim?
&lt;/h3&gt;

&lt;p&gt;Evet. Bu, mock kullanımının en güçlü senaryolarından biridir. Üçüncü tarafın gerçek yanıtlarını kaydedin veya yayınlanmış şemasından mock oluşturun. Testlerinizi mock'a karşı çalıştırın. Satıcı API'si değiştiğinde fark etmek için gerçek servise karşı zamanlanmış bir sözleşme kontrolü ekleyin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mock kullanımı demolar ve prototipler için faydalı mı?
&lt;/h3&gt;

&lt;p&gt;Evet. Mock, demoyu izleyicinin görmesini istediğiniz veriyle deterministik hale getirir. Canlı kesinti, boş veri veya yavaş sorgu riski ortadan kalkar. Prototiplerde ise backend hazır olmadan önce UI akışını oluşturmanıza ve doğrulamanıza olanak tanır.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>En İyi Otomatik Test Platformları: 2026 Karşılaştırması</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:29:01 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/en-iyi-otomatik-test-platformlari-2026-karsilastirmasi-3dla</link>
      <guid>https://forem.com/tobiass_hoffmann/en-iyi-otomatik-test-platformlari-2026-karsilastirmasi-3dla</guid>
      <description>&lt;p&gt;Tek bir “en iyi” otomatik test platformu yoktur; test ettiğiniz katman ve ekibinizin çalışma şekli için en uygun araç vardır. Tarayıcı otomasyonu için tasarlanmış bir araç REST API sözleşmelerini ideal şekilde doğrulamayabilir; API testi için tasarlanmış bir araç da ödeme akışındaki gerçek kullanıcı etkileşimini tek başına kapsayamaz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu yazıda yaygın kullanılan altı otomatik test platformunu pratik açıdan karşılaştıracağız: Apidog, Selenium, Playwright, Newman ile Postman, pytest ve Cypress. Her araç için ne zaman kullanılacağını, nerede zorlanacağını ve CI/CD süreçlerine nasıl oturtulacağını özetleyeceğiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatik test platformu nasıl değerlendirilir?
&lt;/h2&gt;

&lt;p&gt;Bir araç seçmeden önce şu soruları netleştirin:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hangi katmanı test edeceksiniz?&lt;/strong&gt; API, UI veya ikisi birden mi?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testleri kim yazacak?&lt;/strong&gt; Geliştiriciler mi, QA ekibi mi, karma bir ekip mi?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI’da katılımsız çalışabilecek mi?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raporlama ihtiyacınız ne?&lt;/strong&gt; Basit pass/fail yeterli mi, ayrıntılı hata çıktısı gerekiyor mu?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test paketi büyüdükçe bakım maliyeti ne olacak?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Otomatik test kavramı sizin için hâlâ net değilse, araç seçmeden önce &lt;a href="http://apidog.com/blog/what-is-automated-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;otomatik testin ne olduğuna&lt;/a&gt; dair başlangıç rehberini inceleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Bir kriter daha kritik: &lt;strong&gt;kararsızlık maliyeti&lt;/strong&gt;. Kod değişmediği halde bazen geçen bazen başarısız olan testler, ekibin test sonuçlarına güvenini azaltır. Otomatik bekleme, kararlı seçiciler, iyi izole edilmiş test verisi ve deterministik ortamlar bu yüzden “ekstra” değil, sürdürülebilir test paketinin temelidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, API tasarımı, hata ayıklama, mock, dokümantasyon ve otomatik testi tek bir yerde birleştiren bir API platformudur. Otomatik test tarafında görsel test oluşturucu, OpenAPI şema doğrulaması, CSV/JSON tabanlı veri odaklı testler, ortam yönetimi ve CI için CLI çalıştırıcı sunar.&lt;/p&gt;

&lt;p&gt;Apidog özellikle şu senaryolarda uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API uç noktalarını sözleşmeye göre doğrulamak&lt;/li&gt;
&lt;li&gt;Aynı API tanımını tasarım, dokümantasyon, mock ve test için kullanmak&lt;/li&gt;
&lt;li&gt;Geliştirici ve QA ekiplerinin aynı workspace üzerinde çalışmasını sağlamak&lt;/li&gt;
&lt;li&gt;Kod yazmadan temel API regresyon testleri oluşturmak&lt;/li&gt;
&lt;li&gt;Gerektiğinde script ile daha karmaşık doğrulamalar eklemek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pratik bir API test akışı şöyle kurulabilir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API uç noktalarını OpenAPI tanımıyla oluşturun veya içe aktarın.&lt;/li&gt;
&lt;li&gt;Her endpoint için beklenen status code, header ve response body doğrulamalarını ekleyin.&lt;/li&gt;
&lt;li&gt;Farklı ortamlar için değişkenler tanımlayın: &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, &lt;code&gt;production&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;CSV veya JSON dosyasıyla aynı testi farklı veri setleriyle çalıştırın.&lt;/li&gt;
&lt;li&gt;CLI runner ile testleri CI pipeline içinde tetikleyin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog’un güçlü yanı, tek bir bilgi kaynağı kullanmasıdır. Bugün hata ayıkladığınız bir istek, yarın regresyon testine dönüşebilir. Dezavantajı ise kapsamıdır: Apidog API testine odaklanır; gerçek tarayıcı UI akışları için Playwright, Selenium veya Cypress gibi ayrı bir araç gerekir.&lt;/p&gt;

&lt;p&gt;Tam iş akışını denemek için &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirebilirsiniz&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selenium
&lt;/h2&gt;

&lt;p&gt;Selenium, tarayıcı otomasyonu için uzun süredir kullanılan bir standarttır. WebDriver protokolü üzerinden gerçek tarayıcıları kontrol eder ve Java, Python, C# ve JavaScript dahil birçok dili destekler.&lt;/p&gt;

&lt;p&gt;Selenium şu durumlarda mantıklıdır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geniş tarayıcı desteğine ihtiyacınız varsa&lt;/li&gt;
&lt;li&gt;Farklı dil ekosistemlerinde UI testleri yazmanız gerekiyorsa&lt;/li&gt;
&lt;li&gt;Mevcut test altyapınız Selenium üzerine kurulmuşsa&lt;/li&gt;
&lt;li&gt;Tarayıcılar arası regresyon kapsamı kritikse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basit bir Selenium testi örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.common.by&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;By&lt;/span&gt;

&lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/login&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secret&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CSS_SELECTOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;button[type=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;submit&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;

&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selenium’un maliyeti bakım yüküdür. Testler tamamen kodla yazılır. Beklemeler, seçiciler, sürücü yönetimi ve paralel çalışma dikkatli tasarlanmazsa testler kararsız hale gelebilir.&lt;/p&gt;

&lt;p&gt;Selenium bazı ekipler tarafından API kontrolleri için de kullanılmaya çalışılır, ancak bu genellikle doğru katman seçimi değildir. &lt;a href="http://apidog.com/blog/selenium-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API testi için Selenium&lt;/a&gt; incelemesi, neden özel bir API aracının çoğu durumda daha uygun olduğunu açıklar. Kurulum ve kullanım için resmi &lt;a href="https://www.selenium.dev/documentation/" rel="noopener noreferrer"&gt;Selenium belgeleri&lt;/a&gt; referans alınabilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playwright
&lt;/h2&gt;

&lt;p&gt;Playwright, Microsoft tarafından geliştirilen modern bir tarayıcı otomasyon çerçevesidir. Chromium, Firefox ve WebKit’i tek API ile destekler. Otomatik bekleme, hızlı paralel çalışma ve trace viewer gibi hata ayıklama araçlarıyla Selenium’a kıyasla daha modern bir geliştirici deneyimi sunar.&lt;/p&gt;

&lt;p&gt;Playwright özellikle şu ekipler için iyi bir varsayılandır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yeni bir UI test altyapısı kuran ekipler&lt;/li&gt;
&lt;li&gt;JavaScript veya TypeScript kullanan frontend ekipleri&lt;/li&gt;
&lt;li&gt;Paralel ve hızlı uçtan uca testlere ihtiyaç duyan projeler&lt;/li&gt;
&lt;li&gt;Test kararsızlığını azaltmak isteyen ekipler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basit bir Playwright testi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kullanıcı giriş yapabilir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Playwright kod odaklıdır. JavaScript, Python, Java ve C# bağlamaları vardır, ancak test yazmak için geliştirici becerisi gerekir. API sözleşme testi için değil, tarayıcı otomasyonu için tasarlanmıştır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman ve Newman
&lt;/h2&gt;

&lt;p&gt;Postman popüler bir API istemcisidir. Newman ise Postman koleksiyonlarını komut satırından çalıştıran araçtır. Tipik kullanım şudur:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;İstekleri Postman arayüzünde oluşturun.&lt;/li&gt;
&lt;li&gt;Test scriptlerini koleksiyona ekleyin.&lt;/li&gt;
&lt;li&gt;Ortam değişkenlerini tanımlayın.&lt;/li&gt;
&lt;li&gt;Koleksiyonu Newman ile CI’da çalıştırın.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Örnek Newman komutu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; staging.postman_environment.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--reporters&lt;/span&gt; cli,junit &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--reporter-junit-export&lt;/span&gt; results.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman + Newman şu durumlarda uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Küçük veya orta ölçekli API test paketleri&lt;/li&gt;
&lt;li&gt;Hızlı prototipleme&lt;/li&gt;
&lt;li&gt;Manuel API keşfinden otomasyona geçiş&lt;/li&gt;
&lt;li&gt;Postman kullanan ekiplerde CI entegrasyonu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sınırlamalar test paketi büyüdükçe görünür. Test mantığı çoğunlukla isteklere eklenen JavaScript parçalarında tutulur. Bu yapı küçük paketlerde pratik olsa da büyük test setlerinde bakım zorlaşabilir.&lt;/p&gt;

&lt;p&gt;Daha ayrıntılı karşılaştırma için &lt;a href="http://apidog.com/blog/what-is-the-difference-between-newman-and-postman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Newman ve Postman&lt;/a&gt; yazısını inceleyebilirsiniz. Alternatifleri değerlendiren ekipler için &lt;a href="http://apidog.com/blog/best-postman-alternatives-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API testi için Postman alternatifleri&lt;/a&gt; rehberi de faydalıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pytest
&lt;/h2&gt;

&lt;p&gt;Pytest, Python ekosisteminin en yaygın test çerçevelerinden biridir. &lt;code&gt;requests&lt;/code&gt; kütüphanesiyle birlikte API testi için güçlü ve esnek bir yapı sunar. Aynı zamanda birim, entegrasyon ve servis testlerini de yönetebilir.&lt;/p&gt;

&lt;p&gt;Basit bir API testi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_user&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/users/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veri odaklı test için &lt;code&gt;parametrize&lt;/code&gt; kullanılabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="nd"&gt;@pytest.mark.parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/users/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pytest şu durumlarda idealdir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ekibiniz Python kullanıyorsa&lt;/li&gt;
&lt;li&gt;Testleri uygulama koduna yakın tutmak istiyorsanız&lt;/li&gt;
&lt;li&gt;Test mantığı üzerinde tam kontrol gerekiyorsa&lt;/li&gt;
&lt;li&gt;Fixture, mock ve parametrizasyon gibi gelişmiş test yapıları istiyorsanız&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Takas noktası açıktır: Her şey koddur. Kod yazmayan ekip üyelerinin katkısı sınırlı kalabilir. Ayrıca istek yapısı, test verisi, raporlama ve ortam yönetimi gibi katmanları kendiniz tasarlamanız gerekir.&lt;/p&gt;

&lt;p&gt;Uygulamalı örnekler için &lt;a href="http://apidog.com/blog/pytest-api-automated-testing-framework?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pytest API otomatik test eğitimi&lt;/a&gt;ne bakabilirsiniz. Çerçevenin detayları için &lt;a href="https://docs.pytest.org/" rel="noopener noreferrer"&gt;pytest belgeleri&lt;/a&gt; iyi bir referanstır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cypress
&lt;/h2&gt;

&lt;p&gt;Cypress, JavaScript tabanlı bir frontend ve uçtan uca test aracıdır. Uygulamayla aynı çalışma döngüsünde çalışır. Bu sayede hızlı geri bildirim, zaman yolculuğu hata ayıklaması ve otomatik bekleme gibi güçlü geliştirici deneyimi özellikleri sunar.&lt;/p&gt;

&lt;p&gt;Basit bir Cypress testi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Login flow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kullanıcı giriş yapabilir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="email"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="password"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="submit"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cypress şu durumlarda uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript frontend ekipleri&lt;/li&gt;
&lt;li&gt;Komponent ve uçtan uca testlerin aynı ekosistemde yazılması&lt;/li&gt;
&lt;li&gt;Hızlı lokal test geri bildirimi&lt;/li&gt;
&lt;li&gt;Tarayıcı merkezli kullanıcı akışlarının doğrulanması&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cypress test içinde API çağrıları yapabilir, ancak bir API sözleşme test platformu değildir. Tarayıcı davranışını doğrulamak için güçlüdür; API seviyesindeki geniş regresyon paketi için ayrı bir API test aracı daha uygun olur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform karşılaştırma tablosu
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Birincil katman&lt;/th&gt;
&lt;th&gt;Gerekli beceri&lt;/th&gt;
&lt;th&gt;CI uyumu&lt;/th&gt;
&lt;th&gt;En iyi kullanım&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Görsel veya kod&lt;/td&gt;
&lt;td&gt;Evet, CLI çalıştırıcı&lt;/td&gt;
&lt;td&gt;Karma becerili ekiplerde API testi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selenium&lt;/td&gt;
&lt;td&gt;Tarayıcı UI&lt;/td&gt;
&lt;td&gt;Kod, birçok dil&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Geniş tarayıcılar arası UI kapsamı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playwright&lt;/td&gt;
&lt;td&gt;Tarayıcı UI&lt;/td&gt;
&lt;td&gt;Kod, JS/Python/Java/C#&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Modern UI otomasyonu, yeni projeler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postman + Newman&lt;/td&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Görsel + JS script&lt;/td&gt;
&lt;td&gt;Evet, Newman ile&lt;/td&gt;
&lt;td&gt;Küçük ve orta ölçekli API test paketleri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pytest&lt;/td&gt;
&lt;td&gt;API ve birim test&lt;/td&gt;
&lt;td&gt;Kod, Python&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;Kod odaklı kontrol isteyen Python ekipleri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cypress&lt;/td&gt;
&lt;td&gt;Tarayıcı, uçtan uca&lt;/td&gt;
&lt;td&gt;Kod, JavaScript&lt;/td&gt;
&lt;td&gt;Evet&lt;/td&gt;
&lt;td&gt;JavaScript frontend uçtan uca testi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tablo temel ayrımı gösterir: Apidog, Postman ve pytest API tarafında; Selenium, Playwright ve Cypress UI tarafında güçlüdür. Çoğu ekip için doğru yaklaşım, tek aracı her şeye zorlamak yerine API ve UI katmanları için doğru araçları birlikte kullanmaktır.&lt;/p&gt;

&lt;h2&gt;
  
  
  API platformları ile UI platformları karşılaştırması
&lt;/h2&gt;

&lt;p&gt;API testleri protokol düzeyinde çalışır. HTTP isteği gönderir, ardından status code, header ve JSON/XML response body üzerinde doğrulama yapar. Tarayıcı olmadığı için testler genellikle hızlı, daha deterministik ve daha kolay paralelleştirilebilir olur.&lt;/p&gt;

&lt;p&gt;Örnek API doğrulama noktaları:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt;, &lt;code&gt;201&lt;/code&gt;, &lt;code&gt;400&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt; gibi status code kontrolleri&lt;/li&gt;
&lt;li&gt;Response body şema doğrulaması&lt;/li&gt;
&lt;li&gt;Header kontrolleri&lt;/li&gt;
&lt;li&gt;Yetkilendirme senaryoları&lt;/li&gt;
&lt;li&gt;Veri odaklı edge case testleri&lt;/li&gt;
&lt;li&gt;Contract testleri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UI testleri ise gerçek tarayıcı üzerinde çalışır. Sayfanın render edilmesini bekler, elementlere tıklar, formlara veri girer ve kullanıcının gördüğü sonucu doğrular. Bu, gerçek kullanıcı deneyimini kontrol etmek için gereklidir; ancak daha yavaş ve bakım açısından daha maliyetlidir.&lt;/p&gt;

&lt;p&gt;Sağlıklı bir test stratejisi genellikle şu yapıya benzer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Çok sayıda hızlı API testi&lt;/li&gt;
&lt;li&gt;Kritik iş akışlarını kapsayan daha az sayıda UI testi&lt;/li&gt;
&lt;li&gt;Birim testlerle desteklenen uygulama mantığı&lt;/li&gt;
&lt;li&gt;CI’da her commit veya pull request için otomatik çalıştırma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pratik kural: &lt;strong&gt;Mümkün olan doğrulamayı API katmanında yapın; yalnızca gerçekten tarayıcı gerektiren akışları UI testiyle kapsayın.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Doğru platformu seçmek
&lt;/h2&gt;

&lt;p&gt;Kısa bir karar akışı kullanın:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test katmanını belirleyin.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
REST veya GraphQL API testleri için Apidog, pytest veya Postman + Newman düşünün. Tarayıcı akışları için Playwright, Selenium veya Cypress daha uygundur.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ekip becerilerini değerlendirin.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tamamen geliştiricilerden oluşan ekipler kod odaklı araçları rahat kullanabilir. QA, ürün veya teknik olmayan ekip üyeleri de test yazacaksa görsel test oluşturucu avantaj sağlar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI entegrasyonunu erken doğrulayın.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Araç CI’da çalışıyor mu? Exit code doğru dönüyor mu? Rapor formatı pipeline’ınıza uyuyor mu? Bunları pilot aşamada test edin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bakım maliyetini ölçün.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Kod odaklı framework’ler esneklik sağlar, ancak altyapı sorumluluğu size kalır. Entegre platformlar tekrar eden yapılandırma ve yapıştırıcı kod ihtiyacını azaltır.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Küçük bir pilot yapın.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
En güçlü aday araçla 10 gerçek test yazın. Gerçek endpoint’ler, gerçek test verisi ve gerçek CI ortamı kullanın. Araç seçimi için en güvenilir sinyal budur.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;API testi özelinde altyapı katmanları da önemlidir. &lt;a href="http://apidog.com/blog/api-automation-testing-framework?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API otomasyon test çerçevesi&lt;/a&gt; rehberi, sağlam bir API test yapısında hangi katmanların bulunması gerektiğini açıklar.&lt;/p&gt;

&lt;p&gt;Karma bir ekip için API tasarımı, mock, dokümantasyon ve otomatik testi tek platformda toplamak istiyorsanız, &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; güçlü bir başlangıç noktasıdır. Alternatiflerle karşılaştırmak için &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog'u indirebilirsiniz&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Genel olarak en iyi otomatik test platformu hangisidir?
&lt;/h3&gt;

&lt;p&gt;Genel bir kazanan yoktur. Apidog API testi için, Playwright modern tarayıcı otomasyonu için, pytest ise kod odaklı kontrol isteyen Python ekipleri için güçlü seçeneklerdir. En iyi platform; test katmanınıza, ekip becerilerinize ve CI kurulumunuza uyan platformdur.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tek bir platform hem API hem de UI testini yapabilir mi?
&lt;/h3&gt;

&lt;p&gt;Kısmen evet, ancak genellikle eşit kalitede değil. Selenium ve Cypress gibi UI araçları test içinde API çağrısı yapabilir. API araçları da bazı senaryolarda UI benzeri kontrolleri script edebilir. Yine de çoğu ekip için daha sürdürülebilir yaklaşım, özel bir API test aracı ile özel bir UI test aracını birlikte kullanmaktır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Otomatik test platformları kodlama becerisi gerektirir mi?
&lt;/h3&gt;

&lt;p&gt;Platforma bağlıdır. Selenium, Playwright, pytest ve Cypress kod odaklıdır. Apidog ve Postman görsel test oluşturma sunar, ancak gerektiğinde scripting de destekler. Seçim yaparken testleri kimin yazacağını ve kimin sürdüreceğini dikkate alın.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI entegrasyonu ne kadar önemlidir?
&lt;/h3&gt;

&lt;p&gt;Çok önemlidir. CI’da otomatik çalışmayan test paketi zamanla manuel kontrole dönüşür. Bu karşılaştırmadaki araçların tamamı CI ile kullanılabilir, ancak runner davranışı, exit code yönetimi ve rapor formatları farklıdır. CI uyumunu test paketi büyüdükten sonra değil, pilot aşamada doğrulayın.&lt;/p&gt;

&lt;h3&gt;
  
  
  Otomatik test için açık kaynak mı ticari araç mı daha iyidir?
&lt;/h3&gt;

&lt;p&gt;Hiçbiri doğal olarak daha iyi değildir. Selenium, Playwright ve pytest gibi açık kaynak araçlar esnek ve ücretsizdir, ancak kurulum ve bakım sorumluluğu ekibe kalır. Ticari veya entegre platformlar kurulum, raporlama ve iş birliği maliyetini azaltabilir. Birçok ekip hibrit yaklaşım kullanır: açık kaynak UI aracı ve entegre API test platformu.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Online API Mock Araçları Karşılaştırması: Apidog, Mockoon, WireMock, Beeceptor ve Postman</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:28:49 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/online-api-mock-araclari-karsilastirmasi-apidog-mockoon-wiremock-beeceptor-ve-postman-2eg7</link>
      <guid>https://forem.com/tobiass_hoffmann/online-api-mock-araclari-karsilastirmasi-apidog-mockoon-wiremock-beeceptor-ve-postman-2eg7</guid>
      <description>&lt;p&gt;Çevrimiçi bir API sahte sunucusu, backend hazır olmasa bile çalışan bir uç nokta sağlar. Frontend uygulamanızı, mobil uygulamanızı veya test paketinizi barındırılan bir URL’ye yönlendirir ve gerçekçi yanıtlar alırsınız. Ancak Apidog, Mockoon, WireMock, Beeceptor ve Postman; kurulum süresi, veri üretimi, koşullu yanıt desteği ve mock’un nerede çalıştığı açısından belirgin şekilde farklıdır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bu rehberde her aracı şu açılardan karşılaştıracağız:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mock sunucu nerede çalışıyor: bulut, yerel veya ikisi birden?&lt;/li&gt;
&lt;li&gt;Yanıt verisi otomatik üretilebiliyor mu?&lt;/li&gt;
&lt;li&gt;Aynı endpoint farklı isteklere farklı yanıt verebiliyor mu?&lt;/li&gt;
&lt;li&gt;Kurulum ne kadar pratik?&lt;/li&gt;
&lt;li&gt;Araç hangi ekip ve kullanım senaryosu için daha uygun?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bir sahte sunucu için "çevrimiçi" ne anlama geliyor?
&lt;/h2&gt;

&lt;p&gt;"Çevrimiçi" iki farklı modeli ifade edebilir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bulutta barındırılan mock sunucu&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sağlayıcının altyapısında çalışır.&lt;/li&gt;
&lt;li&gt;Herkesin erişebileceği genel bir URL üretir.&lt;/li&gt;
&lt;li&gt;Mobil testler, uzaktaki ekip üyeleri ve müşteri demoları için uygundur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yerel mock sunucu&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kendi makinenizde, Docker container’da veya CI runner’da çalışır.&lt;/li&gt;
&lt;li&gt;Genellikle yalnızca aynı ağa veya makineye erişebilen istemciler tarafından kullanılır.&lt;/li&gt;
&lt;li&gt;Daha hızlıdır, çevrimdışı çalışabilir ve testleri izole tutar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bu ayrım önemlidir. Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mobil uygulama testi      -&amp;gt; Genel URL gerekir
Lokal frontend geliştirme -&amp;gt; Yerel mock yeterli olabilir
CI testleri               -&amp;gt; Container veya yerel mock uygundur
Müşteri demosu            -&amp;gt; Bulut mock daha pratiktir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu karar, daha geniş &lt;a href="http://apidog.com/blog/mock-server-vs-real-server?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;sahte sunucuya karşı gerçek sunucu&lt;/a&gt; yaklaşımıyla da yakından ilişkilidir.&lt;/p&gt;

&lt;p&gt;Araçları değerlendirirken şu beş kriteri birlikte düşünün:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Barındırma modeli&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Otomatik veri üretimi&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Koşullu yanıt desteği&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kurulum eforu&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API tasarımı ve test akışıyla entegrasyon&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apidog
&lt;/h2&gt;

&lt;p&gt;Apidog, API tasarımınızdan otomatik olarak mock endpoint üretir. Bir endpoint tanımladığınızda ayrı bir mock sunucu konfigürasyonu yapmadan mock URL oluşur.&lt;/p&gt;

&lt;p&gt;Örneğin API şemanızda şu alanlar varsa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01T10:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"avatar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/avatar.png"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog alan adlarına göre gerçekçi veri döndürür:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt; alanı e-posta benzeri değer üretir.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;created_at&lt;/code&gt; tarih/zaman üretir.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;avatar&lt;/code&gt; görsel URL’si döndürür.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu özellik &lt;strong&gt;Akıllı Sahte Sunucu&lt;/strong&gt; yaklaşımıdır.&lt;/p&gt;

&lt;p&gt;Daha karmaşık senaryolarda &lt;strong&gt;Gelişmiş Sahte Sunucu&lt;/strong&gt; kullanılabilir. Böylece aynı endpoint, isteğe göre farklı yanıtlar döndürebilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/1  -&amp;gt; 200 OK
GET /users/0  -&amp;gt; 404 Not Found
POST /users   -&amp;gt; 422 Validation Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog mock sunucuları paylaşılabilir URL ile bulutta çalışabilir. Yerel hız veya izole test gerektiğinde yerel mock da kullanılabilir.&lt;/p&gt;

&lt;p&gt;Apidog’un avantajı, mock sunucunun API tasarımı, hata ayıklama ve &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API sözleşme testi&lt;/a&gt; ile aynı projede bulunmasıdır. Böylece API spesifikasyonu değiştiğinde mock’un ayrı bir yerde eski kalma riski azalır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En uygun olduğu yer:&lt;/strong&gt; Gerçek API tasarımına bağlı, düşük kurulumlu ve test akışıyla entegre mock isteyen ekipler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mockoon
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mockoon.com" rel="noopener noreferrer"&gt;Mockoon&lt;/a&gt;, hızlı yerel mock geliştirme için kullanılan ücretsiz ve açık kaynaklı bir masaüstü uygulamasıdır.&lt;/p&gt;

&lt;p&gt;Tipik kullanım akışı şöyledir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mockoon’u açın.&lt;/li&gt;
&lt;li&gt;Yeni bir environment oluşturun.&lt;/li&gt;
&lt;li&gt;Endpoint tanımlayın.&lt;/li&gt;
&lt;li&gt;Yanıt gövdesini yazın.&lt;/li&gt;
&lt;li&gt;Sunucuyu yerel portta çalıştırın.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Örnek endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET http://localhost:3000/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örnek yanıt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ayşe Yılmaz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ayse@example.com"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mockoon, Faker.js ile dinamik veri üretimini destekler. Ayrıca header veya query parametrelerine göre kural tabanlı yanıtlar tanımlayabilirsiniz.&lt;/p&gt;

&lt;p&gt;Örneğin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users?status=active   -&amp;gt; aktif kullanıcılar
GET /users?status=blocked  -&amp;gt; engellenmiş kullanıcılar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yanıt gecikmesi ekleyerek yavaş ağ koşullarını da simüle edebilirsiniz.&lt;/p&gt;

&lt;p&gt;Mockoon varsayılan olarak yerel çalışır. CLI ve Docker imajı sayesinde aynı mock’u CI ortamında veya kendi sunucunuzda çalıştırabilirsiniz. Ancak birinci taraf, hazır genel bulut URL’si sunmaz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En uygun olduğu yer:&lt;/strong&gt; Hesap açmadan, çevrimdışı çalışabilen hızlı bir yerel mock isteyen geliştiriciler.&lt;/p&gt;

&lt;h2&gt;
  
  
  WireMock
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://wiremock.org" rel="noopener noreferrer"&gt;WireMock&lt;/a&gt;, özellikle hassas istek eşleştirme gereken senaryolar için güçlü bir mocklama aracıdır. JVM ekosisteminde güçlü köklere sahip olsa da bağımsız süreç olarak çalışabilir ve Java dışı projelerde de kullanılabilir.&lt;/p&gt;

&lt;p&gt;WireMock ile şu kriterlere göre eşleştirme yapabilirsiniz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL pattern&lt;/li&gt;
&lt;li&gt;HTTP method&lt;/li&gt;
&lt;li&gt;Header&lt;/li&gt;
&lt;li&gt;Cookie&lt;/li&gt;
&lt;li&gt;Query parametreleri&lt;/li&gt;
&lt;li&gt;JSON body içeriği&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek stub mantığı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/users/123"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jsonBody"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mehmet"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WireMock ayrıca şunları destekler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yanıt şablonlama&lt;/li&gt;
&lt;li&gt;Hata enjeksiyonu&lt;/li&gt;
&lt;li&gt;Proxy kullanımı&lt;/li&gt;
&lt;li&gt;Record/replay&lt;/li&gt;
&lt;li&gt;Container tabanlı çalışma&lt;/li&gt;
&lt;li&gt;WireMock Cloud ile barındırılan URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Buna karşılık kurulum maliyeti daha yüksektir. Stub’lar genellikle JSON dosyaları veya kod ile tanımlanır. Bu nedenle hızlı demo mock’larından çok, sürüm kontrolünde tutulan ciddi test altyapıları için uygundur.&lt;/p&gt;

&lt;p&gt;Bu yaklaşım, &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD’de API testlerini otomatikleştirme&lt;/a&gt; süreçleriyle iyi eşleşir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En uygun olduğu yer:&lt;/strong&gt; Hassas request matching ve sürüm kontrollü mock isteyen mühendislik ekipleri.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beeceptor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://beeceptor.com" rel="noopener noreferrer"&gt;Beeceptor&lt;/a&gt;, genel bir mock URL’ye en hızlı şekilde ulaşmak için kullanılan bulut öncelikli bir araçtır.&lt;/p&gt;

&lt;p&gt;Temel akış:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tarayıcıda endpoint adı seçin.&lt;/li&gt;
&lt;li&gt;Beeceptor size genel bir URL verir.&lt;/li&gt;
&lt;li&gt;Mock kurallarını web arayüzünden tanımlayın.&lt;/li&gt;
&lt;li&gt;Gelen istekleri UI üzerinden inceleyin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Örnek kullanım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-endpoint.free.beeceptor.com/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beeceptor şu senaryolarda pratiktir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hızlı demo hazırlama&lt;/li&gt;
&lt;li&gt;Webhook yakalama&lt;/li&gt;
&lt;li&gt;Üçüncü taraf callback testleri&lt;/li&gt;
&lt;li&gt;Backend hazır olmadan frontend test etme&lt;/li&gt;
&lt;li&gt;Belirli path’leri mock edip diğerlerini gerçek backend’e proxy etme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ancak Beeceptor tamamen barındırılan bir araç olduğu için çevrimdışı geliştirme veya izole CI testleri için daha az uygundur. Ücretsiz katmanda istek hacmi ve kural sayısı sınırlıdır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En uygun olduğu yer:&lt;/strong&gt; Kurulum yapmadan hızlı genel mock URL, demo ve webhook yakalama isteyen ekipler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman
&lt;/h2&gt;

&lt;p&gt;Postman, kaydedilmiş bir koleksiyondan mock sunucu oluşturabilir. Her request için örnek response tanımlarsınız, koleksiyonu mock olarak yayınlarsınız ve Postman genel bir URL sağlar.&lt;/p&gt;

&lt;p&gt;Tipik akış:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collection oluşturun.&lt;/li&gt;
&lt;li&gt;Request ekleyin.&lt;/li&gt;
&lt;li&gt;Her request için example response tanımlayın.&lt;/li&gt;
&lt;li&gt;Collection’dan mock server oluşturun.&lt;/li&gt;
&lt;li&gt;Postman’ın verdiği URL’yi uygulamanızda kullanın.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Postman mock sunucusu, gelen isteğe en uygun örnek yanıtı döndürür.&lt;/p&gt;

&lt;p&gt;Bu yaklaşım özellikle zaten Postman koleksiyonlarıyla çalışan ekipler için pratiktir. Ancak kurulum Apidog’a göre daha manueldir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Her örnek yanıtı kendiniz tanımlarsınız.&lt;/li&gt;
&lt;li&gt;Koşullu mantık daha sınırlıdır.&lt;/li&gt;
&lt;li&gt;Dinamik değerler Postman değişkenleriyle mümkündür ancak manuel bağlantı gerekir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postman alternatiflerini değerlendiren ekipler genellikle &lt;a href="http://apidog.com/blog/best-postman-alternatives-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API testi için Postman alternatiflerini&lt;/a&gt; de inceler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En uygun olduğu yer:&lt;/strong&gt; Zaten Postman koleksiyonları kullanan ve hızlı bir barındırılan mock isteyen ekipler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yan yana karşılaştırma
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Araç&lt;/th&gt;
&lt;th&gt;Barındırma&lt;/th&gt;
&lt;th&gt;Otomatik oluşturulan veri&lt;/th&gt;
&lt;th&gt;Koşullu yanıtlar&lt;/th&gt;
&lt;th&gt;Kurulum çabası&lt;/th&gt;
&lt;th&gt;Ücretsiz katman&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;td&gt;Bulut + yerel&lt;/td&gt;
&lt;td&gt;Evet, alan adlarından&lt;/td&gt;
&lt;td&gt;Evet, Gelişmiş Mock&lt;/td&gt;
&lt;td&gt;Çok düşük&lt;/td&gt;
&lt;td&gt;Cömert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mockoon&lt;/td&gt;
&lt;td&gt;Yerel + kendi kendine barındırma&lt;/td&gt;
&lt;td&gt;Evet, Faker.js&lt;/td&gt;
&lt;td&gt;Evet, kural tabanlı&lt;/td&gt;
&lt;td&gt;Düşük&lt;/td&gt;
&lt;td&gt;Tamamen ücretsiz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WireMock&lt;/td&gt;
&lt;td&gt;Yerel, container, ücretli bulut&lt;/td&gt;
&lt;td&gt;Şablonlu&lt;/td&gt;
&lt;td&gt;Evet, derin eşleşme&lt;/td&gt;
&lt;td&gt;Yüksek&lt;/td&gt;
&lt;td&gt;Açık kaynak çekirdeği&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beeceptor&lt;/td&gt;
&lt;td&gt;Sadece bulut&lt;/td&gt;
&lt;td&gt;Sınırlı şablonlama&lt;/td&gt;
&lt;td&gt;Evet, mock kuralları&lt;/td&gt;
&lt;td&gt;Çok düşük&lt;/td&gt;
&lt;td&gt;Sınırlı hacim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postman&lt;/td&gt;
&lt;td&gt;Bulut&lt;/td&gt;
&lt;td&gt;Manuel, değişkenler aracılığıyla&lt;/td&gt;
&lt;td&gt;Sınırlı&lt;/td&gt;
&lt;td&gt;Orta&lt;/td&gt;
&lt;td&gt;Sınırlı çağrı&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Nasıl seçilir?
&lt;/h2&gt;

&lt;p&gt;Önce mock sunucunun nerede çalışması gerektiğine karar verin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Genel URL gerekiyorsa
&lt;/h3&gt;

&lt;p&gt;Şu durumlarda bulut mock daha uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobil uygulama test ediyorsunuz.&lt;/li&gt;
&lt;li&gt;Uzaktaki ekip arkadaşınız mock’a erişmeli.&lt;/li&gt;
&lt;li&gt;Müşteri demosu yapacaksınız.&lt;/li&gt;
&lt;li&gt;Webhook veya callback test ediyorsunuz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu durumda şu araçlara bakın:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apidog&lt;/li&gt;
&lt;li&gt;Beeceptor&lt;/li&gt;
&lt;li&gt;Postman&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Yerel veya CI mock yeterliyse
&lt;/h3&gt;

&lt;p&gt;Şu durumlarda yerel mock daha uygundur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend geliştirmeyi lokal yürütüyorsunuz.&lt;/li&gt;
&lt;li&gt;Testleri izole tutmak istiyorsunuz.&lt;/li&gt;
&lt;li&gt;Çevrimdışı çalışmanız gerekiyor.&lt;/li&gt;
&lt;li&gt;Mock’ları Docker veya CI içinde çalıştırmak istiyorsunuz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu durumda şu araçlar öne çıkar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mockoon&lt;/li&gt;
&lt;li&gt;WireMock&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kurulum hızı mı, kontrol mü?
&lt;/h2&gt;

&lt;p&gt;Araç seçerken ikinci karar noktası kurulum hızı ve kontrol seviyesidir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;En hızlı genel URL        -&amp;gt; Beeceptor
Tasarım odaklı otomatik mock -&amp;gt; Apidog
Yerel GUI ile hızlı mock  -&amp;gt; Mockoon
Kodla yönetilen güçlü mock -&amp;gt; WireMock
Mevcut koleksiyonlardan mock -&amp;gt; Postman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beeceptor ve Apidog sizi dakikalar içinde çalışan bir mock’a ulaştırır. WireMock daha fazla başlangıç eforu ister ancak hassas eşleştirme ve sürüm kontrollü stub’lar sunar. Mockoon, kullanıcı dostu GUI ile pratik bir orta yol sağlar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mock’un API tasarımına bağlı kalması neden önemli?
&lt;/h2&gt;

&lt;p&gt;Bağımsız mock sunucular hızlı stub üretmek için kullanışlıdır. Ancak API tasarımı sık değişiyorsa, mock sunucu spesifikasyondan kopabilir.&lt;/p&gt;

&lt;p&gt;Örneğin API sözleşmesi şöyle değişirse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;{
  "id": 1,
&lt;span class="gd"&gt;- "name": "Ayşe"
&lt;/span&gt;&lt;span class="gi"&gt;+ "full_name": "Ayşe Yılmaz"
&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mock hâlâ eski &lt;code&gt;name&lt;/code&gt; alanını döndürüyorsa frontend testleriniz yanıltıcı olabilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, mock sunucuyu canlı API tasarımından üretir. Böylece sözleşme değişiklikleri mock tarafına da yansır. Ayrıca gerçekçi veri üretimi sayesinde her response payload’unu elle yazma ihtiyacı azalır.&lt;/p&gt;

&lt;p&gt;Tasarım, mock ve test akışını birlikte denemek için &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog’u İndirin&lt;/a&gt;. Daha geniş bir araç listesi için &lt;a href="http://apidog.com/blog/rest-api-mocking-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST API mocklama araçları&lt;/a&gt; rehberine, test tarafı için ise &lt;a href="http://apidog.com/blog/online-api-testing-tools-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ücretsiz çevrimiçi API test araçlarına&lt;/a&gt; bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hızlı seçim rehberi
&lt;/h2&gt;

&lt;p&gt;Aşağıdaki senaryolardan size en yakın olanı seçin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bir dakikadan kısa sürede genel URL istiyorum:&lt;/strong&gt; Beeceptor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hesap gerektirmeyen ücretsiz yerel mock istiyorum:&lt;/strong&gt; Mockoon&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hassas request matching ve sürüm kontrollü stub istiyorum:&lt;/strong&gt; WireMock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ekibim zaten Postman koleksiyonları kullanıyor:&lt;/strong&gt; Postman&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API tasarımından otomatik mock, gerçekçi veri ve test akışı istiyorum:&lt;/strong&gt; Apidog&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mock veri kalitesi hakkında bir not
&lt;/h2&gt;

&lt;p&gt;Mock sunucunun döndürdüğü veri, aracın pratik değerini belirler.&lt;/p&gt;

&lt;p&gt;Şu tarz bir response teknik olarak mock’tur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ancak gerçek istemci davranışını test etmek için çoğu zaman yeterli değildir. Daha faydalı bir mock şu şekilde görünmelidir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Zeynep Kaya"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zeynep.kaya@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-05-20T12:30:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Araçların yaklaşımı farklıdır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apidog:&lt;/strong&gt; Alan adlarından anlam çıkararak veri üretir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mockoon:&lt;/strong&gt; Faker.js şablonlarıyla gerçekçi veri üretir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WireMock:&lt;/strong&gt; Yanıt şablonlama sağlar ancak yapılandırma gerekir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postman:&lt;/strong&gt; Değişkenler kullanılabilir ancak manuel bağlantı gerekir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beeceptor:&lt;/strong&gt; Sınırlı şablonlama sunar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bir aracı değerlendirirken sadece mock’un çalışıp çalışmadığına bakmayın. Bir request gönderin ve response body’yi inceleyin. Veri gerçekçi değilse, bu mock’a karşı yazılan testlerin değeri de sınırlı olur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça sorulan sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bulut ve yerel API mock’u arasındaki fark nedir?
&lt;/h3&gt;

&lt;p&gt;Bulut mock’u sağlayıcının sunucularında çalışır ve genel bir URL sağlar. Mobil testler, uzaktan ekip çalışması ve demolar için uygundur.&lt;/p&gt;

&lt;p&gt;Yerel mock kendi makinenizde, Docker container’da veya CI runner’da çalışır. Daha hızlıdır, çevrimdışı kullanılabilir ve testleri izole tutar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hangi mocklama aracı en az kurulum gerektirir?
&lt;/h3&gt;

&lt;p&gt;Beeceptor ve Apidog en hızlı seçeneklerdir.&lt;/p&gt;

&lt;p&gt;Beeceptor, endpoint adı seçtiğiniz anda genel bir URL verir. Apidog ise API tasarımınızdan ayrı bir mock sunucu yapılandırması yapmadan otomatik mock üretir.&lt;/p&gt;

&lt;h3&gt;
  
  
  WireMock sadece Java projeleri için mi?
&lt;/h3&gt;

&lt;p&gt;Hayır. WireMock JVM kökenli olsa da bağımsız süreç olarak çalışabilir, Docker imajı sunar ve HTTP API üzerinden kullanılabilir. Stub’lar JSON formatında tanımlanabildiği için farklı dillerle çalışan ekipler için de uygundur.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bu araçlar gerçekçi verileri otomatik olarak oluşturabilir mi?
&lt;/h3&gt;

&lt;p&gt;Apidog ve Mockoon bu konuda öne çıkar.&lt;/p&gt;

&lt;p&gt;Apidog, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt; gibi alan adlarından veri üretir. Mockoon ise Faker.js şablonlamasını kullanır. WireMock yanıt şablonlama destekler. Postman tarafında değişkenler kullanılabilir ancak manuel tanımlama gerekir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ekibim zaten Postman kullanıyorsa Postman’ın mock sunucusunu kullanmalı mıyım?
&lt;/h3&gt;

&lt;p&gt;Kullanabilirsiniz. Mock’un mevcut koleksiyonlarınızın yanında durması pratiktir.&lt;/p&gt;

&lt;p&gt;Ancak response example’ları manuel tanımlanır ve koşullu mantık sınırlıdır. Otomatik veri üretimi, kural tabanlı yanıtlar veya API tasarımına bağlı mock istiyorsanız özel bir mocklama aracı daha verimli olabilir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Postman CLI mi Newman mı: Hangi Komut Satırı Aracı Kullanılmalı?</title>
      <dc:creator>Tobias Hoffmann</dc:creator>
      <pubDate>Fri, 22 May 2026 07:28:13 +0000</pubDate>
      <link>https://forem.com/tobiass_hoffmann/postman-cli-mi-newman-mi-hangi-komut-satiri-araci-kullanilmali-52hc</link>
      <guid>https://forem.com/tobiass_hoffmann/postman-cli-mi-newman-mi-hangi-komut-satiri-araci-kullanilmali-52hc</guid>
      <description>&lt;p&gt;Yıllardır Postman koleksiyonlarını masaüstü uygulaması dışında çalıştırmanın pratik yolu Newman’dı. Postman CLI çıktıktan sonra aynı ihtiyacı karşılayan iki seçenek oluştu: Her ikisi de koleksiyonları GUI olmadan çalıştırır, CI/CD içinde kullanılabilir ve &lt;code&gt;pm.test&lt;/code&gt; doğrulamalarını yürütür. Fark, aracı nerede konumlandırdığınızda ortaya çıkar: bağımsız bir runner mı istiyorsunuz, yoksa Postman bulutuna bağlı bir pipeline aracı mı?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog'u bugün deneyin&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Kısa karar özeti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Newman&lt;/strong&gt;: Açık kaynaklı, npm tabanlı, hesap gerektirmeyen koleksiyon çalıştırıcıdır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postman CLI&lt;/strong&gt;: Postman hesabına/API anahtarına bağlıdır, çalıştırma sonuçlarını Postman platformuna raporlar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Newman&lt;/strong&gt; testleri repo içinde JSON dosyalarıyla sürümlemek isteyen ekipler için daha doğaldır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postman CLI&lt;/strong&gt; Postman çalışma alanını doğruluk kaynağı yapan ve yönetişim/linting kontrollerini pipeline’a eklemek isteyen ekipler için daha uygundur.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Newman Nedir?
&lt;/h2&gt;

&lt;p&gt;Newman, Postman koleksiyonlarını komut satırından çalıştıran orijinal runner’dır. npm paketi olarak kurulur, açık kaynaklıdır ve Postman hesabı gerektirmez.&lt;/p&gt;

&lt;p&gt;Temel kullanım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; newman

newman run checkout-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Koleksiyon JSON dosyasını okur.&lt;/li&gt;
&lt;li&gt;Ortam değişkenlerini yükler.&lt;/li&gt;
&lt;li&gt;İstekleri sırayla çalıştırır.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pm.test&lt;/code&gt; bloklarını yürütür.&lt;/li&gt;
&lt;li&gt;Test hatası varsa sıfır olmayan exit code döndürür.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CI/CD açısından önemli olan son adımdır. Örneğin GitHub Actions, Jenkins veya GitLab CI’da Newman başarısız olduğunda pipeline da başarısız olur.&lt;/p&gt;

&lt;p&gt;Newman’ın güçlü tarafı bağımsızlığıdır. Şunlara ihtiyaç duymaz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman hesabı&lt;/li&gt;
&lt;li&gt;API anahtarı&lt;/li&gt;
&lt;li&gt;Postman bulutuna erişim&lt;/li&gt;
&lt;li&gt;Çalışma alanı senkronizasyonu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu nedenle kapalı ağlarda, regülasyonlu ortamlarda veya testlerin tamamen repo içinde tutulduğu yapılarda öngörülebilir bir seçenektir.&lt;/p&gt;

&lt;p&gt;Newman ayrıca raporlama tarafında esnektir. Yerleşik CLI ve JUnit çıktısına ek olarak topluluk raporlayıcıları kullanılabilir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; newman-reporter-htmlextra

newman run checkout-api.postman_collection.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt; staging.postman_environment.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,htmlextra &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--reporter-htmlextra-export&lt;/span&gt; reports/api-test-report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha fazla bağlam için &lt;a href="http://apidog.com/blog/what-is-the-difference-between-newman-and-postman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Newman ve Postman arasındaki fark&lt;/a&gt; rehberine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman CLI Nedir?
&lt;/h2&gt;

&lt;p&gt;Postman CLI, Postman’ın resmi komut satırı aracıdır. Newman’dan farklı olarak npm paketi değildir; kurulum betiğiyle yüklenen tek bir yürütülebilir dosya olarak gelir.&lt;/p&gt;

&lt;p&gt;Örnek kurulum ve kullanım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS/Linux örneği&lt;/span&gt;
curl &lt;span class="nt"&gt;-o-&lt;/span&gt; &lt;span class="s2"&gt;"https://dl-cli.pstmn.io/install/osx_64.sh"&lt;/span&gt; | sh

&lt;span class="c"&gt;# kimlik doğrulama&lt;/span&gt;
postman login &lt;span class="nt"&gt;--with-api-key&lt;/span&gt; YOUR_API_KEY

&lt;span class="c"&gt;# koleksiyon çalıştırma&lt;/span&gt;
postman collection run checkout-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman CLI’ın temel farkı bulut entegrasyonudur. Koleksiyonları Postman çalışma alanınızdan kimlik bazında çekebilir ve çalıştırma sonuçlarını Postman platformuna geri gönderebilir.&lt;/p&gt;

&lt;p&gt;Bu modelde tipik akış şöyledir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Koleksiyon Postman workspace içinde tutulur.&lt;/li&gt;
&lt;li&gt;CI ortamında Postman API key secret olarak saklanır.&lt;/li&gt;
&lt;li&gt;Pipeline &lt;code&gt;postman login&lt;/code&gt; ile kimlik doğrular.&lt;/li&gt;
&lt;li&gt;Koleksiyon Postman’dan çekilir.&lt;/li&gt;
&lt;li&gt;Sonuçlar Postman platformuna raporlanır.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Postman CLI yalnızca bir koleksiyon runner’ı değildir. Postman platformuna bağlı bir pipeline aracısı gibi çalışır. Özellikle API yönetişimi, linting ve merkezi çalıştırma geçmişi isteyen ekipler için anlamlıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Newman ve Postman CLI Karşılaştırması
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Yön&lt;/th&gt;
&lt;th&gt;Postman CLI&lt;/th&gt;
&lt;th&gt;Newman&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kaynak&lt;/td&gt;
&lt;td&gt;Kapalı kaynak, resmi Postman aracı&lt;/td&gt;
&lt;td&gt;Açık kaynak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kurulum&lt;/td&gt;
&lt;td&gt;Kurulum betiği, tek executable&lt;/td&gt;
&lt;td&gt;npm paketi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postman hesabı&lt;/td&gt;
&lt;td&gt;Gerekli&lt;/td&gt;
&lt;td&gt;Gerekli değil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimlik doğrulama&lt;/td&gt;
&lt;td&gt;API anahtarı ile&lt;/td&gt;
&lt;td&gt;Yok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Koleksiyon kaynağı&lt;/td&gt;
&lt;td&gt;Postman bulutu veya yerel dosya&lt;/td&gt;
&lt;td&gt;Yerel JSON dosyası&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonuç raporlama&lt;/td&gt;
&lt;td&gt;Postman platformuna&lt;/td&gt;
&lt;td&gt;Terminal, JUnit, HTML vb.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API yönetişimi/linting&lt;/td&gt;
&lt;td&gt;Dahili&lt;/td&gt;
&lt;td&gt;Dahil değil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raporlayıcılar&lt;/td&gt;
&lt;td&gt;Daha sınırlı, Postman odaklı&lt;/td&gt;
&lt;td&gt;CLI, JUnit, topluluk HTML raporlayıcıları&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Çevrimdışı kullanım&lt;/td&gt;
&lt;td&gt;Sınırlı&lt;/td&gt;
&lt;td&gt;Yerel dosyalarla tamamen mümkün&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Olgunluk&lt;/td&gt;
&lt;td&gt;Daha yeni&lt;/td&gt;
&lt;td&gt;Uzun süredir kullanılan topluluk standardı&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maliyet&lt;/td&gt;
&lt;td&gt;Ücretsiz kullanılabilir, Postman plan limitlerine bağlıdır&lt;/td&gt;
&lt;td&gt;Ücretsiz, hesap gerektirmez&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Kararı belirleyen ana fark şudur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Newman&lt;/strong&gt;, “elimde bir koleksiyon dosyası var, bunu çalıştır ve sonucu pipeline’a bildir” yaklaşımını izler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postman CLI&lt;/strong&gt;, “Postman workspace içindeki koleksiyonu çalıştır, sonucu Postman platformuna geri gönder” yaklaşımını izler.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CI/CD İçinde Nasıl Kullanılır?
&lt;/h2&gt;

&lt;p&gt;Her iki araç da Jenkins, GitHub Actions, GitLab CI, CircleCI ve benzeri CI sağlayıcılarında çalışır. Ancak pipeline tasarımı farklıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Newman ile CI/CD Akışı
&lt;/h2&gt;

&lt;p&gt;Newman kullandığınızda koleksiyon ve environment dosyalarını genellikle repo’ya koyarsınız:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── .github/
│   └── workflows/
│       └── api-tests.yml
├── tests/
│   ├── checkout-api.postman_collection.json
│   └── staging.postman_environment.json
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub Actions örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;newman&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repo&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Newman&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g newman&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;newman run tests/checkout-api.postman_collection.json \&lt;/span&gt;
            &lt;span class="s"&gt;--environment tests/staging.postman_environment.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JUnit çıktısı üretmek isterseniz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API tests with JUnit report&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;newman run tests/checkout-api.postman_collection.json \&lt;/span&gt;
            &lt;span class="s"&gt;--environment tests/staging.postman_environment.json \&lt;/span&gt;
            &lt;span class="s"&gt;-r cli,junit \&lt;/span&gt;
            &lt;span class="s"&gt;--reporter-junit-export reports/newman-results.xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu modelin avantajı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testler kodla birlikte sürümlenir.&lt;/li&gt;
&lt;li&gt;Pull request içinde test değişiklikleri incelenebilir.&lt;/li&gt;
&lt;li&gt;Postman hesabı veya bulut erişimi gerekmez.&lt;/li&gt;
&lt;li&gt;Pipeline daha az dış bağımlılığa sahiptir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yaklaşım hakkında daha fazla örnek için &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CI/CD’de API testlerini otomatikleştirme&lt;/a&gt; ve &lt;a href="http://apidog.com/blog/api-test-automation-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GitHub Actions ile API test otomasyonu&lt;/a&gt; rehberlerine bakabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman CLI ile CI/CD Akışı
&lt;/h2&gt;

&lt;p&gt;Postman CLI kullandığınızda genellikle koleksiyon Postman workspace içinde tutulur. CI tarafında API anahtarını secret olarak saklarsınız.&lt;/p&gt;

&lt;p&gt;Örnek GitHub Actions akışı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postman-cli&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Postman CLI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;curl -o- "https://dl-cli.pstmn.io/install/linux64.sh" | sh&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Login to Postman&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postman login --with-api-key ${{ secrets.POSTMAN_API_KEY }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run collection&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postman collection run checkout-api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu modelin avantajı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Koleksiyon Postman workspace içinde merkezi kalır.&lt;/li&gt;
&lt;li&gt;Çalıştırma geçmişi Postman platformunda görülebilir.&lt;/li&gt;
&lt;li&gt;Dashboard ve ekip görünürlüğü Postman üzerinden yönetilebilir.&lt;/li&gt;
&lt;li&gt;API yönetişimi/linting kontrolleri pipeline’a eklenebilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ancak şu bağımlılıkları kabul etmiş olursunuz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI ortamı Postman’a erişebilmelidir.&lt;/li&gt;
&lt;li&gt;API anahtarı secret olarak yönetilmelidir.&lt;/li&gt;
&lt;li&gt;Doğruluk kaynağı repo yerine Postman workspace olabilir.&lt;/li&gt;
&lt;li&gt;Sonuç raporlama Postman platformuna bağlı hale gelir.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Doğruluk Kaynağı: Repo mu, Postman Workspace mi?
&lt;/h2&gt;

&lt;p&gt;Seçim yapmadan önce şu soruyu netleştirin:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;API testlerinin doğruluk kaynağı nerede olmalı?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eğer cevap &lt;strong&gt;Git repo&lt;/strong&gt; ise Newman daha uygun olur. Koleksiyon dosyaları, environment dosyaları ve test değişiklikleri kodla birlikte sürümlenir.&lt;/p&gt;

&lt;p&gt;Eğer cevap &lt;strong&gt;Postman workspace&lt;/strong&gt; ise Postman CLI daha uygun olur. Koleksiyonlar Postman’da yönetilir, pipeline da bunları oradan çalıştırır.&lt;/p&gt;

&lt;p&gt;Pratik fark şudur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Newman modeli:
Repo → CI → Newman → rapor dosyaları / exit code

Postman CLI modeli:
Postman Workspace → CI → Postman CLI → Postman platformu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu fark küçük görünür, ancak ekip süreçlerini doğrudan etkiler.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Yönetişimi ve Linting
&lt;/h2&gt;

&lt;p&gt;Newman ve Postman CLI arasındaki en belirgin farklardan biri API yönetişimidir.&lt;/p&gt;

&lt;p&gt;Postman CLI, Postman workspace içindeki API tanımları üzerinde linting ve governance kontrolleri çalıştırabilir. Bu kontroller adlandırma, güvenlik, şema tutarlılığı ve organizasyon kuralları gibi alanlarda kullanılabilir.&lt;/p&gt;

&lt;p&gt;Pipeline içinde bu şu anlama gelir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API tanımı güncellenir.&lt;/li&gt;
&lt;li&gt;CI çalışır.&lt;/li&gt;
&lt;li&gt;Postman CLI linting/governance kontrolünü yürütür.&lt;/li&gt;
&lt;li&gt;Kural ihlali varsa build başarısız olur.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Newman’da bunun doğrudan karşılığı yoktur. Newman koleksiyonları çalıştırır, test sonuçlarını raporlar ve exit code döndürür. API tasarım standartlarını denetlemek Newman’ın kapsamı dışındadır.&lt;/p&gt;

&lt;p&gt;Bu nedenle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sadece endpoint testleri çalıştıracaksanız Newman yeterlidir.&lt;/li&gt;
&lt;li&gt;API tasarım kurallarını pipeline’da zorunlu kılacaksanız Postman CLI daha uygundur.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Geçiş Yapmalı mısınız?
&lt;/h2&gt;

&lt;p&gt;Newman kullanıyorsanız ve mevcut pipeline sorunsuz çalışıyorsa Postman CLI’a geçmek zorunda değilsiniz.&lt;/p&gt;

&lt;p&gt;Geçiş şu değişiklikleri gerektirir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI ortamına Postman API key eklemek&lt;/li&gt;
&lt;li&gt;Koleksiyonların kaynaklandığı yeri değiştirmek&lt;/li&gt;
&lt;li&gt;Postman bulutuna bağımlılığı kabul etmek&lt;/li&gt;
&lt;li&gt;Raporlama akışını yeniden düzenlemek&lt;/li&gt;
&lt;li&gt;Ekipte workspace izinlerini ve erişimleri yönetmek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aşağıdaki ihtiyaçlardan biri yoksa geçişin getirisi sınırlı olabilir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman platformunda merkezi çalıştırma geçmişi&lt;/li&gt;
&lt;li&gt;Postman dashboard’larında sonuç görünürlüğü&lt;/li&gt;
&lt;li&gt;API governance/linting kontrolleri&lt;/li&gt;
&lt;li&gt;Postman workspace’i doğruluk kaynağı yapma isteği&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yeni başlayan ekipler için karar daha açık şekilde iş akışına bağlıdır.&lt;/p&gt;

&lt;p&gt;Postman zaten ana API platformunuzsa ve ekip koleksiyonları orada yönetiyorsa Postman CLI mantıklıdır. Testleri repo içinde tutmak, bağımsız çalışmak ve vendor bağımlılığını azaltmak istiyorsanız Newman daha doğal bir başlangıçtır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hangi Aracı Seçmelisiniz?
&lt;/h2&gt;

&lt;p&gt;Newman’ı seçin, eğer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman hesabı olmadan çalışmak istiyorsanız&lt;/li&gt;
&lt;li&gt;Koleksiyonları repo içinde sürümlemek istiyorsanız&lt;/li&gt;
&lt;li&gt;CI ortamınızın Postman bulutuna erişmesini istemiyorsanız&lt;/li&gt;
&lt;li&gt;JUnit veya HTML gibi dosya tabanlı raporlara ihtiyacınız varsa&lt;/li&gt;
&lt;li&gt;Açık kaynaklı ve olgun bir runner tercih ediyorsanız&lt;/li&gt;
&lt;li&gt;Kapalı veya kısıtlı ağlarda test çalıştırıyorsanız&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postman CLI’ı seçin, eğer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ekibiniz Postman workspace içinde çalışıyorsa&lt;/li&gt;
&lt;li&gt;Çalıştırma geçmişini Postman platformunda görmek istiyorsanız&lt;/li&gt;
&lt;li&gt;API governance/linting kontrollerini pipeline’a eklemek istiyorsanız&lt;/li&gt;
&lt;li&gt;Koleksiyonların merkezi olarak Postman’da yönetilmesini tercih ediyorsanız&lt;/li&gt;
&lt;li&gt;Postman dashboard ve ekip görünürlüğü sizin için önemliyse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postman ekosistemine bağlı kalmadan alternatif yaklaşımları da değerlendirmek istiyorsanız &lt;a href="http://apidog.com/blog/run-postman-collections-ci-without-newman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Newman olmadan CI’da Postman koleksiyonlarını çalıştırma&lt;/a&gt; ve &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Postman olmadan API testi&lt;/a&gt; yazılarına göz atabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tek Araç Alternatifi: Apidog
&lt;/h2&gt;

&lt;p&gt;Hem Newman hem de Postman CLI, testlerinizi Postman koleksiyonları etrafında kurguladığınızı varsayar. &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; farklı bir yaklaşım sunar: API tasarımı, istek hata ayıklama, otomatik test senaryoları ve CI/CD çalıştırma akışı aynı ürün içinde yer alır.&lt;/p&gt;

&lt;p&gt;Bu modelde ayrı bir dışa aktarma veya ayrı runner paketi kullanmanız gerekmez. Test tanımları ve yürütme motoru aynı platformun parçasıdır.&lt;/p&gt;

&lt;p&gt;Tipik akış:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API endpoint’lerini tasarlayın.&lt;/li&gt;
&lt;li&gt;İstekleri Apidog içinde test edin.&lt;/li&gt;
&lt;li&gt;Görsel doğrulamalarla test senaryoları oluşturun.&lt;/li&gt;
&lt;li&gt;Senaryoları CI/CD içinde CLI runner ile çalıştırın.&lt;/li&gt;
&lt;li&gt;API tasarımı, mock server ve performans testlerini aynı akışta yönetin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog ayrıca API tasarımı, mock server’lar ve performans testlerini de kapsar. Böylece ekipler API yaşam döngüsünü birden fazla aracı birleştirmeden yönetebilir. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog’u indirebilir&lt;/a&gt; ve pipeline’lar için CLI runner dahil test özelliklerini kullanabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sıkça Sorulan Sorular
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Postman CLI, Newman’ın yerini mi alıyor?
&lt;/h3&gt;

&lt;p&gt;Postman, Postman CLI’ı resmi komut satırı aracı olarak konumlandırıyor. Ancak Newman hâlâ kullanılan ve bakımı devam eden bir araçtır. Hesap gerektirmeyen, repo içinde sürümlenen ve bağımsız çalışan bir runner istiyorsanız Newman hâlâ güçlü bir seçenektir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman CLI Postman hesabı gerektiriyor mu?
&lt;/h3&gt;

&lt;p&gt;Evet. Postman CLI, Postman API anahtarı ile kimlik doğrulaması yapar ve çalıştırmaları Postman workspace’inize bağlamak üzere tasarlanmıştır. Newman ise hesap gerektirmez; yerel koleksiyon JSON dosyasıyla çalışabilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hangi araç daha iyi raporlama sunar?
&lt;/h3&gt;

&lt;p&gt;İhtiyaca göre değişir.&lt;/p&gt;

&lt;p&gt;Newman, dosya tabanlı raporlama açısından daha esnektir. JUnit XML, CLI çıktısı ve &lt;code&gt;newman-reporter-htmlextra&lt;/code&gt; gibi HTML raporlayıcıları kullanabilirsiniz.&lt;/p&gt;

&lt;p&gt;Postman CLI ise sonuçları Postman platformuna raporlar. Ekibiniz sonuçları Postman dashboard’larında görmek istiyorsa bu avantajdır; bağımsız rapor dosyaları istiyorsanız Newman daha pratiktir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman CLI yerel koleksiyon dosyası çalıştırabilir mi?
&lt;/h3&gt;

&lt;p&gt;Evet, Postman CLI yerel koleksiyon dosyalarını çalıştırabilir. Ancak tasarım olarak Postman workspace ile entegre çalışmaya ve sonuçları platforma raporlamaya odaklanır. Yerel JSON dosyalarını ana doğruluk kaynağı yapmak istiyorsanız Newman bu modele daha doğal uyar.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI’da hangisi daha hızlıdır?
&lt;/h3&gt;

&lt;p&gt;Saf koleksiyon yürütmesinde fark genellikle büyük değildir. Newman daha küçük bir ayak izine sahiptir ve bulut senkronizasyonu gerektirmez. Postman CLI ise kimlik doğrulama ve sonuçları Postman platformuna gönderme gibi ek adımlar içerir.&lt;/p&gt;

&lt;p&gt;Çoğu ekip için ham hızdan çok iş akışı uyumu daha önemlidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo merkezli testler için Newman&lt;/li&gt;
&lt;li&gt;Postman workspace merkezli testler için Postman CLI&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
