Bir REST API nasıl taklit edilir?


13

Ben bir üçüncü taraf REST API verileri sorgulayacak yeni bir proje üzerinde çalışıyorum. Bu, gerçek zamanlı bir spor veri feed'i içindir, bu nedenle feed yalnızca bir oyun gerçekleştiğinde çalışır.

3. taraf iyi belgeler (XSD, vb.) Sağlasa da, bir oyunun gerçekleşmesini simüle etmenin bir yolu yoktur ve bu yüzden bu API'ya karşı yazdığım kodu test etmek için gerçek bir oyunun gerçekleşmesini beklemek zorunda kalacağım.

Tek rücum, bir oyunu kendi başıma simüle etmek için kod yazmak, ancak çok fazla iş gibi görünüyor. Buna nasıl yaklaşırdınız?


5
Bu veriler ne kadar karmaşık? Çoğu durumda sadece gelen verileri işleyen nesneleri saplama olur. Önceki oyun oturumlarından verileri kullanın (test için çok karmaşık olabilir) veya verileri analiz edin ve ilgili bilgi türlerini çıkarın. Bunu dosyalarda saklayın ve gerçek programdan geliyormuş gibi ana programınıza besleyin.
thorsten müller

2
Sahte objecthttp için mükemmel bir kullanım durumu: //en.wikipedia.org/wiki/Mock_object
Kevin Cline

Yanıtlar:


15

Bu, sahte bir nesne için mükemmel kullanım durumudur . Her popüler dil için alay kütüphaneleri var. Test verilerini döndürmek için REST hizmeti yanıtları sağlayan nesneyi alay etmek istersiniz. Test verilerini elle oluşturabilir veya canlı sisteme yapılan önceki aramalardan toplayabilirsiniz.


1
Buradaki sorun çok fazla kod değil. Verilerden biri. Ben API sahte veya taslakları dışarı alay edebilirsiniz, ama sorun bana verecek sahte veri oluşturmak
dferraro

@dferraro: Bir dahaki sefere oyun oynamanız durumunda hizmeti yoklamaktan ve bu verileri bir dosyaya atmaktan alıkoyan şey nedir? Bunu yapabildiğinizde ve biçime aşina olduktan sonra, belirli test senaryolarıyla yeni bir dosya (veya dosya) oluşturabilirsiniz.
Steven Evers

4

Bir oyun gerçekleşene kadar bekleyin. Feed'deki her etkinliği yakalayın. Olayları uygun zamanlarda tekrar eden bir simülatör yazın . Voila, gerçek verilere sahip bir feed simülatörünüz var.


Ruby kullanıcısıysanız, HTTP yanıtlarını yakalamak ve yeniden oynatmak için VCR'yi kullanabilirsiniz .
dusan

2

Kendi simülatörünüzü yazmanızı tavsiye ederim. Her türlü senaryoyu test etmek için kullanabilirsiniz;

  • Sunucu bağlantıyı kabul ediyor ancak yanıt vermiyor
  • Sunucu zaman aşımına uğradı
  • Sunucu çöp yanıtı vb geri göndermek ...

Bunu geçmişte yaptığımda, simülatörde ihtiyacım olanı yapmasını istemek için istek iletilerinde "özel" değerler kullandım. Bu, geliştirme ortamınızın dışına çıkmadan uçtan uca testler yapılmasını da mümkün kılar.

Düzenleme: Örneğin, projeniz XML'i bir üçüncü taraf hizmetine gönderirse, istek örneğin içerebilir <value>50.00</value>. Simülatör kodlanabilir (veya daha iyi, yapılandırılabilir), böylece 50.00 => patlayabilir, 60.00 => çöp, 70.00 => yakın bağlantı vb. Fikir, simülatörün davranışının, her test durumunda kontrol ettiğiniz girdisine bağlı olmasıdır.


Teşekkürler. 'Özel' değerler hakkında ne demek istediğinize bir örnek verebilir misiniz?
dferraro

1
Cevabımı detaylandırdı.
Rory Hunter

2

Muhtemelen bahis şirketinin bazı örnek veriler sağladığını (ve bu entegrasyon aşamasında kaydedilebileceğini) dikkate alarak, tavsiyem bu yayınları bu şekilde organize etmektir:

  • Olayların listesi
  • Zamanlanmış etkinlikler için güncellemeler
  • Oran güncellemeleri
  • Sonuçlar

Muhtemelen sağlayıcı 2 tip güncelleme sunar: Push (POST) ve Pull (GET).

Bu noktada,

  1. Programcılarınızın algoritmaları geliştirebilmesi için GET isteklerini işleyen basit bir sunucu oluşturun.
  2. Aynı bilgilerin gönderimini yönetmek ve böylece sisteminizi vurgulamak için bir otomasyon oluşturun.

Geliştirme ve testi yönetin

Kullanılacak teknolojinin ayrıntılarına girmeden , yalnızca 4 URL'ye (veya sağlayıcının sunduklarına bağlı olarak gerekli olanlar) yanıt veren bir mini sunucu ve bir mini push hizmeti alırsınız .

"Mini sunucu" ile çalışırken akılda tutulması gereken çok iyi bir şey, HTTP protokolünün işleyicileri. 80 numaralı bağlantı noktasında bir sunucu oluşturmak çok basittir ve sorunu çözer. Sağlayıcının yaptığı gibi GET yanıtlarındaki tüm bilgileri enjekte ettiğinizden emin olmalısınız (bu, üretime sokulduğunda sorunlardan kaçınacaktır).

Şahsen basit bir Perl sunucusu ya da aynı şeyi yapardım ama Nodejs ile. Verilerin enjeksiyonu ile ilgili olarak, çevrimdışı bir tarayıcıyı ( CURL , WGET ) çağıran bir zamanlayıcı yeterli olacaktır.


2

Cucumberjs, phantomjs, proxy sunucusunu 127.0.0.1'e ayarlayarak http-proxyve nockoradan bir node.js sürecini bağlayarak REST API'yi simüle ettim . CucumberJS önemli bir parçası değildir, herhangi bir şekilde test senaryosu yazabilirsiniz, gerisi simülasyonun anahtarıdır. Sadece eşleştirme-istek-dönüş-verisi ile alay edebilir, ancak bir yanıt üretmek için desenlere ve kanca geri arama işlevine göre de filtreleyebilirsiniz, böylece ihtiyacınız olan herhangi bir ayrıntı düzeyine (aşırı uçta tam demo sunucusu, ancak kademeli olarak yapabilirsiniz).

Güzel çalışıyor:

  1. Phantomjs bir URI ister.
  2. İstek 127.0.0.1:port'ta proxy sunucusuna gider.
  3. Node.js işleminiz, kullanarak ileriye dönük olarak proxy'leri kullanır http-proxy. Böylece herhangi bir "normal" yükleme (sayfalar, resimler) çalışır.
  4. Bazı istekleri (çoğunlukla API) durdurmayı seçerseniz, nockbunun için kullanırsınız .

Benim senaryomda, aynı süreçte salatalık js testleri ile birleştirdim, bu yüzden şöyle gitti:

  1. Test çalışır.
  2. nockTest ettiği senaryo için HTTP alaycılığını ayarlar .
  3. Selenium protokolü ile phantomjs'a bir sayfa yükler.

Gerisi bu paragrafta daha önce gösterildiği gibidir (yani, bir döngü biraz, test koşucusu olarak phantomjs'a tüm istekleri bana ileten bir sayfa yüklemesi talimatını veririm ve bunları net olarak iletirim; veya kesişim test edilen API ise).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.