2 puan yazan GN⁺ 2023-07-01 | 1 yorum | WhatsApp'ta paylaş
  • Hurl 4.0.0, curl tabanlı CLI HTTP test aracının yeni sürümü; düz metin dosyalara yazılan HTTP isteklerini ve yanıt doğrulamalarını çalıştırma akışını iyileştiriyor
  • HTML raporları JavaScript olmadan, yalnızca satır içi CSS kullanan saf HTML olarak üretiliyor; istek/yanıt bazında waterfall zaman çizelgesi, yürütme günlükleri ve satır içi hataları birlikte gösteriyor
  • --error-format long, başarısız testlerin yanıt başlıklarını ve gövdesini yazdırarak CI/CD hata ayıklama sırasında yeniden çalıştırmadan nedeni anlamak için gereken bağlamı görmeyi sağlıyor
  • Yeni decode ve xpath filtreleriyle karakter seti net olmayan yanıt baytları doğrudan decode edilebiliyor ve HTML’in bir bölümü üzerinde XPath doğrulaması yapılabiliyor
  • JSONPath değerlendirme biçiminin bazı kısımları değişti; büyük harf koşulunu sağlayan özel HTTP metotları desteklenerek QUERY gibi yeni metotlar da denenebiliyor

Hurl 4.0.0 genel bakış

  • Hurl, curl tabanlı bir komut satırı aracıdır ve basit bir düz metin biçiminde tanımlanan HTTP isteklerini çalıştırır
  • Hurl dosyalarında isteklerin yanı sıra beklenen HTTP durumu, başlıklar, sertifikalar ve JSONPath gibi doğrulamalar (assert) birlikte yazılabilir
  • Hurl 4.0.0, ağırlıklı olarak HTML raporları, hata çıktısı, filtreler, JSONPath davranışı ve özel HTTP metodu desteği etrafında değişiyor

HTML raporu ve waterfall zaman çizelgesi

  • Hurl HTML report, her çalıştırma için üç tür bilgi üretir
    • Waterfall zaman çizelgesi: Her istek/yanıtı grafik olarak gösterir; DNS, TCP handshake ve time to first byte gibi yanıt zamanlamalarını kontrol etmeyi sağlar
    • Yürütme günlüğü: İstek/yanıt başlıkları ve sertifika bilgileri gibi verileri içerir
    • Sözdizimi vurgulu kaynak dosya: Hataları satır içinde gösterir
  • Rapor, JavaScript olmadan saf HTML ve satır içi CSS’ten oluştuğu için GitLab CI/CD veya GitHub Actions gibi CI/CD ortamlarına entegre edilmesi kolaydır
  • Waterfall zaman çizelgesinde kullanılan zamanlama verileri libcurl tarafından sağlanır ve --json seçeneği ile de dışa açılır
    • --json, hatalar, assert’ler, sertifikalar, yakalamalar, çerezler ve zamanlamalar dahil yapılandırılmış yürütme bilgileri sağlar
    • Bu JSON çıktısıyla kendi raporlarınızı oluşturabilirsiniz

Görselleştirmeyle ortaya çıkan assert performans darboğazı

  • Zengin görselleştirme, gizli performans sorunlarını ortaya çıkarabilir
  • Bazı çalıştırmalarda istekler arasında büyük boşluklar görüldü; bunun nedeni HTTP yanıtı üzerindeki assert sayısının çok fazla olmasıydı
  • Hurl 4.0.0 itibarıyla assert hesaplaması basit bir yaklaşımla çalışıyor
    • Aynı yanıttaki her assert bağımsız olarak işleniyor
    • Her assert için en baştan parse edilip yeniden hesaplanıyor
  • Hurl ekibi libcurl ve Rust birleşimiyle hız konusunda kendinden emindi; ancak bu örnek, bir sonraki sürümde assert performans iyileştirmesinin gerekli olduğu sonucuna varmalarını sağladı

CI/CD için ayrıntılı hata çıktısı

  • Mevcut test hatası çıktısı beklenen değer odaklı olduğundan, analiz için gereken bilgiler eksik kalabiliyordu
  • Yeni --error-format seçeneği ile daha uzun hata açıklamaları seçilebiliyor
  • --error-format long modunda yanıt başlıkları ve yanıt gövdesi otomatik olarak günlüğe yazılıyor
  • Örnekte test Control-Security-Policy başlığını arıyordu, ancak gerçek yanıtta Content-Security-Policy vardı
    • Yanıt başlıkları ve gövdesi günlüğe dahil edildiğinden, yazım hatası türündeki sorun kolayca görülebiliyor
  • Bu seçenek, testi yeniden çalıştırmadan oturum hata ayıklaması için gereken bağlamı almak isteyen CI/CD ortamlarında kullanışlıdır
  • Yanıt gövdesi de kaydedildiği için günlükler çok uzayabilir

Yeni filtreler: decode ve xpath

  • Hurl’un metin assert’leri, yanıt gövdesi baytlarını otomatik olarak decode eder; bunun için Content-Type yanıt başlığındaki charset ipucunu kullanır
  • Content-Type içinde encoding bulunmayabilir veya karakter seti HTML belgesinin içindeki <meta> etiketinde yer alabilir
  • Yeni decode filtresi, baytları açıkça metne decode ederek doğrulama yapmayı sağlar
    • Örnekte GB2312 ile encode edilmiş gövde bytes decode "gb2312" ile decode ediliyor
  • Yeni xpath filtresi, yanıtın bir bölümü üzerinde XPath ifadeleri değerlendirmeyi sağlar
    • Örnekte HTML body metni xpath "string(//body)" ile doğrulanıyor

JSONPath değerlendirme biçimindeki değişiklik

  • Hurl 4.0.0, JSONPath sorgularının değerlendirilme biçimini kısmen değiştirdi
  • JSONPath için uygun bir resmi spesifikasyon yok; Hurl, fiili standart gibi kullanılan goessner.net belgesini olabildiğince izlemeye çalışıyor
  • Uygulamalar arasında farklı edge case’ler bulunuyor
    • Standart JSONPath her zaman koleksiyon döndürür, ancak çoğu durumda bunun anlamı büyük değildir ve test etmeyi zorlaştırabilir
    • Bazı uygulamalar definite path’in düğüm değeri ile indefinite path’in koleksiyonunu ayırır
  • Hurl 4.0.0’da değer döndüren selector yalnızca iki türdür
    • Dizi indeksi selector’ı: $.store.book[2]
    • Nesne anahtarı selector’ı: $.store.bicycle.color, $.store.bicycle['color']
  • Filtre kullanan selector’lar veya $[*].id gibi selector’lar koleksiyon döndürür
    • Koleksiyondan değer almak için nth filtresi kullanılabilir

Özel HTTP metotları

  • Hurl 4.0.0, rastgele özel HTTP metotlarını destekliyor
  • Metotlar büyük harfle yazılmalıdır
  • Örnek olarak yeni gelecek QUERY metodu hemen denenebilir

Sürüm notları ve katkı çağrısı

  • Diğer iyileştirmeler ve hata düzeltmeleri release note üzerinden görülebilir
  • Proje GitHub star’ı, Twitter’da paylaşım, iyileştirme talepleri ve kullanım örneklerinin paylaşılmasını istiyor

1 yorum

 
GN⁺ 2023-07-01
Hacker News görüşleri
  • Hurl tanıtımının “curl tabanlı bir komut satırı aracı; basit bir düz metin biçiminde tanımlanan HTTP isteklerini çalıştırır” diye başlaması hoşuma gitti
    Hurl’ü ilk kez gördüm ama en üstteki kısa tanıtım ve kod örneği bile hemen kurup denemek istememe yetti; harika bir sürüm gibi görünüyor

    • Hurl’ün bakımcısı olarak Hacker News’i uzun zamandır okurken “dil örneğini olabildiğince çabuk göster”, “kavramı her seferinde kısa anlat” gibi sunum tavsiyelerini hep not almıştım ve bunları hurl.dev’e gerçekten yansıtmaya çalıştım
    • Fazla sayıda tanıtım yazısı ve README, kurulum gereksinimleriyle ya da “X, Y, Z düzeltildi” diye başlıyor ama asıl bu aracın ne yaptığını söylemiyor; bu yaklaşım doğru
    • Doğru, ama bunların çoğu başlıkta yer almalıydı
      Örneğin Hurl: Run HTTP requests in a simple plain-text format gibi bir başlık daha iyi olurdu
  • Bunun API testinin sektör standardı haline gelmesini isterdim
    QA’in gönderdiği Postman ekran görüntülerine bakmaktan da, düzeltmeden sonra QA’in Send tuşuna basmasını beklemekten de yoruldum; muhtemelen QA de geliştiriciyi beklemekten yorulmuştur
    Hurl, geliştirici ve QA’in ikisinin de okuyup yazabileceği, otomasyon ve CI entegrasyonuna uygun, beklenen davranışı aktarmayı kolaylaştıran ve PR’a eklenip QA için başlangıç noktası olabilecek bir araç; mümkün olan yerlerde kullanmamak için sebep görünmüyor

    • Bir serviste hem manuel API testi hem de CI için Hurl kullanıyoruz ve oldukça iyi
      İş akışı bazlı HTTP alışveriş akışını tek bir hurl dosyasına koyabiliyorsunuz ve bu da doğrudan Git’e giren bir test paketi oluyor
    • VSCode kullanan ekipler için vscode-restclient da denenebilir: https://github.com/Huachao/vscode-restclient
      Yine de Hurl de çok ilgi çekici ve editöre bağlı olmaması bakımından bu sorun için daha iyi çözüm olduğuna katılıyorum
    • https://k6.io/ kullandınız mı diye merak ediyorum
      JS ile yük/performance testleri yazıp depoya commit edebiliyorsunuz, CI’da kolayca otomatikleştirebiliyorsunuz, metrikleri çeşitli backend’lere gönderebiliyorsunuz, HTTP dışı protokoller de kullanabiliyorsunuz ve modern bir komut satırı arayüzüyle pek çok özellik sunuyor
      Bir de Postman-to-k6 dönüştürücüsü var: https://github.com/apideck-libraries/postman-to-k6
      k6’in felsefesi, tıpkı birim/entegrasyon testlerinde olduğu gibi bu testleri geliştiricilerin yazıp klasik QA-geliştirici döngüsünü kırması; Hurl de iyi görünüyor ama mevcut performans testi araçlarına göre özellikleri daha sınırlı ve ben şahsen özel bir metin biçimi yerine programlama diliyle test yazmayı tercih ediyorum
    • Ben şahsen OpenAPI ile tanımlayıp ardından Dredd ile sözleşmeyi doğrulama yaklaşımını seviyorum
      Kaynak koddan sözleşme üreten bir araç kullansanız bile, endpoint metadata’sını yanlış tanımlayan kullanıcı hataları hâlâ mümkün ve Dredd bunu yakalıyor
  • Şimdiye kadar gördüğüm modern Unix programlarının en iyi örneklerinden birine yakın
    Standart girdiyi alıyor, standart çıktıya yazıyor, terminalin her yerine Unicode emoji saçmıyor ve man sayfaları da gayet iyi hazırlanmış
    hurl dosya uzantısının üç değil dört harf olması da hoşuma gitti; sonunda MS-DOS uyumluluğunu dert etmeyi bırakmışız gibi
    Cidden kullanmaya değer bir araç gibi duruyor

    • Terminaldeki emoji kullanımının beni ne kadar rahatsız ettiğini fark etmemiştim; bu araçta olmadığını duyunca nedense sevindim
    • Sadece MS-DOS değil, VMS uyumluluğu kaygısından da kurtulmuş olduk
  • Komut satırı HTTP araçları arasında en çok Httpie’yi ya da onun daha hızlı Rust yeniden yazımı olan XH’yi seviyorum
    curl’den çok daha HTTP’ye yakın bir sözdizimiyle komut satırından istek gönderebiliyorsunuz ve tonla seçenek öğrenmeniz gerekmiyor
    Zaten curl’e alışkınsanız çok faydalı olmayabilir ama hafif kullanım için çok daha sezgisel
    https://httpie.io/
    https://github.com/ducaale/xh

  • Adaptive’de test otomasyonu için hurl.dev’i geniş çapta kullanıyoruz: https://adaptive.live
    Tüm iç ürün akışını Hurl ile test ediyoruz ve ürün istikrarı açısından organizasyona kattığımız en iyi şey buydu
    Her dağıtımdan önce onboarding, kayıt, çekirdek akışlar vb. için Hurl tabanlı birkaç otomasyon testini çalıştırıyoruz; konteynerleştirilmiş olduğu için paralel de çalıştırılabiliyor
    Ayrıca hurl.dev etrafında iç araçlar da geliştiriyoruz; öğrenmesi kolay olduğu için analistler ve iş kullanıcıları da test yazabiliyor

    • Neden bağımsız bir araç kullandığınızı merak ediyorum
      Test bağlamında Selenium gibi tarayıcı tabanlı yaklaşımlar çok daha güçlü ve genel olarak daha kullanışlı görünüyor
    • OAuth akışını yerleşik olarak destekliyor mu, yoksa hardcode edilmiş token mı gerekiyor, merak ediyorum
      Dokümanlara baktım ama bununla ilgili bir şey bulamadım
  • hurl’ü bir süredir takip ediyorum; diğer araçlardan ayrıldığı nokta, test için kendi DSL’ine sahip olması
    Yalnızca HTTP isteği göndermiyor, yanıtı doğrulayabiliyor ve veri yakalayabiliyor
    Ama bakımcı bunu görüyorsa, doğrulamayı dış script’lere devretme imkânı olmasını isterdim
    Mesela bir öğe koleksiyonundaki tüm özelliklerin aynı değere sahip olduğunu doğrulamak için hâlâ nth seçicisini kullanmadan bunu yapmak zor ve nth = * gibi bir şeye de ihtiyaç var
    Tüm kullanım senaryolarını DSL ile kapsamak çok büyük iş olur; bu yüzden jsonpath sonucunu jq’ya verip true dönüyorsa testin geçmesi gibi bir imkân güzel olurdu

    • DSL zamanla ister istemez Turing-tam bir genel amaçlı dile doğru büyür; bu yüzden dış script çağrısı mantıklı görünüyor
      Ama o zaman da dosya daha az bağımsız hale gelir ve epey karmaşık sorunlar doğabilir
  • Hurl’ün hızlı büyümesi iyi görünüyor
    Endpoint testlerinde her zaman kimlik doğrulama gerekiyor; kimlik doğrulamayı bir dosyaya yazıp token gereken başka dosyaların başında bunu içe aktarmanın bir yolu var mı merak ediyorum

    • Hurl’de include ya da makro gibi özellikler yok gibi görünüyor
      Zaten bunun gizli değerleri saklayıp kullanmanın en iyi yolu olup olmadığından da emin değilim
      Dokümanlara göre komut satırı argümanları ve ortam değişkenleri üzerinden hurl dosyasına değişken aktarabiliyorsunuz: https://hurl.dev/docs/templates.html
  • Bu kullanım için httpyac’ı da epey seviyorum: https://httpyac.github.io
    JS script desteği sunduğu için oldukça benzer ve yalnızca komut satırı arayüzü değil, VS Code entegrasyonu da çok iyi

    • httpyac, JetBrains IDE’lerin .http desteğiyle de oldukça uyumlu
      JetBrains ayrıca .http dosyalarından jUnit test raporu üreten ücretsiz bir komut satırı aracı da sunuyor
  • Visual Studio 2022’nin de .http dosyalarıyla benzer bir özellik sunduğunu öğrendim: https://learn.microsoft.com/en-us/aspnet/core/test/http-file...
    Hurl’ün ise çok daha fazla özelliği var gibi görünüyor

    • JetBrains IDE’ler de bunu desteklediği için, şu anda diğer yaklaşımlara göre bir ölçüde standarda daha yakın bir biçim gibi duruyor
    • Hurl çok daha hızlı
    • Bunun temelini oluşturan VS Code eklentisini bir süredir kullanıyorum