Bir REST istemcisini bir REST Sunucusuna karşı test etme. Fikstür nasıl yapılır?


10

Birim testleri yazarken, armatürleri kullanmak yaygındır: az test edilebilir veri, bu yüzden şunu söyleyebiliriz: 1. Tüm müşterilerin Willy Wonka'yı içermesi gerekir. 2. İstemci 3'ü silin ve istemcilerin artık Willy Wonka'yı içermemesini sağlayın.

Birim testleri için bu iyi. Fikstürleri yeniden yüklemek veya işlemi geri almak için kurulum / sökmeyi kullanın. Böylece testler bir işlem içinde oluşturulur, güncelleştirilir ve silinir . Yeni geçici veriler sadece bu testin süresi boyunca devam eder, ardından sıfırlanır.

Peki ya REST sunucusunu REST istemcisinden ayırdığımızda ne olacak?

REST istemcimizin sadece doğru okumadığından değil, doğru şekilde oluşturduğundan, güncellediğinden ve sildiğinden emin olmak istiyoruz.

Uzaktan test REST sunucusuna karşı bunu nasıl yapacağınıza ilişkin herhangi bir örnek veya öneri bulamadım .

Sadece fikstürler sunan bir test REST sunucum olduğunu varsayarsak. HTTP'nin durumsuz doğasının tamamı "BAŞLANGIÇ İŞLEMİ" ve "GERİ DÖNÜŞ İŞLEMİ" veya "SABİT DÜZELTME" türünde bir mesaj göndermenin zor olacağı anlamına gelir, değil mi?

Bunu ilk yapan ben olamam, bu yüzden bu konuda farklı bir düşünme şekline ihtiyacım var.

Herhangi bir öneri?


Belki de, bir test sunucusu olduğu için armatürleri yeniden yükleyecek bir uç noktaya sahip olabilirsiniz?
David Radcliffe

Ana probleminiz test sunucunuzu önceden tanımlanmış bir duruma getirmekse, neden istediğiniz şeyi yapmak için dinlenme API'nize "TESTDATA RELOAD" gibi bir tür özel test fonksiyonu eklemiyorsunuz? Tabii ki, üretimde API türlerinin bulunmadığından emin olmalısınız.
Doc Brown

Yanıtlar:


7

Yazılım sistemleri ideal olarak iyi tanımlanmış sistem sınırlarına ve aralarındaki arayüzlere sahiptir. REST hizmetleri bunun iyi örnekleridir.

Bu amaçla, ben öneriyoruz karşı Yapmaya çalıştığınız şeyi yapıyor.

özellikle:

REST istemcimizin sadece doğru okumadığından değil, doğru şekilde oluşturduğundan, güncellediğinden ve sildiğinden emin olmak istiyoruz.

Bunun yerine ne önerebilirim:

  • Belirli girdi ve çıktılar verildiğinde, doğru şekilde çalıştığından emin olmak için REST istemciniz için testler oluşturun. İyi (beklenen) ve kötü (beklenmeyen) değerleri açıklayın.

  • REST hizmetiniz için (kontrol ediyorsanız, yani), amaçlanan işlevine göre davranmak için testler oluşturma

  • Testleri sorun alanlarına yakın tutun, böylece bu bağlamda önemli olan şeylerin tasarımına ve geliştirilmesine rehberlik edebilirler


3
Burada entegrasyon testleri fikrini oldukça rahat bir şekilde reddediyorsunuz. Bu yaklaşımın uygulamadan haberdar edildiğini sanmıyorum.
13'te

Tüm yararlı önerilere teşekkür ederim. Ayrıca Twitter tarafından Ruby gem "webmock" denemek için büyük öneriler var ve REST API sunucu yanıtı alay benzer. Ayrıca anlattığım şeyin bir entegrasyon testi gibi göründüğüne "inanıyorum" diye katılıyorum, bu yüzden bunu ayrı ayrı inceleyeceğim. Herkese tekrar teşekkürler. - Derek
sivers

API'yi taklit etmek sorunu çözmenin harika bir yoludur. Ancak, sahte API == gerçek API'nin nasıl olduğundan emin olabilirsiniz?
FrEaKmAn

4

Burada akılda tutulması gereken iki açı:

  • Kodunuzu veya tesisatınızı mı test ediyorsunuz? İyi bilinen bir hizmet ve müşteri yığını kullandığınızı varsayarak muhtemelen test cihazlarını güvenli bir şekilde tahmin edebilirsiniz ve binlerce kullanıcı genellikle temellerde temel bir hata olmadığından emin olacaktır.
  • Testleriniz neden idempotent değil? Üretim dışı veriler yazmak veya farklı bir uç noktaya yazmak için bir yol açın. Tahmin edilebilir bir adlandırma modeli seçin. Testlerden önce kalan sunucu DB'sini önceden yükleyin. Ve muhtemelen bunu gerçekleştirmenin birkaç yolu daha var - yöntem gerçekten taktiksel ve uygulamanın doğasına bağlı olmalı.


1

Diğerlerinin söylediği gibi, bir müşteriyi test ediyorsanız, sunucuda oluşturma, silme vb. Kadar ilerlemenize gerek yoktur. Çoğu zaman bir sunucuyu taklit etmeniz bile gerekmez. Gerçekten sadece doğru istekleri yaptığınızdan ve yanıtları doğru bir şekilde yaptığınızdan emin olmanız gerekir, Ruby, Python, PHP veya başka bir şeyle yazılmış olsun, bir noktada müşteriniz muhtemelen bir HTTP kütüphanesinden bir yöntem kullanacaktır bir istek ve bu yöntemi alay etmek, nasıl adlandırıldığını kontrol etmek ve bir test sonucu döndürmek yeterlidir.

urllib2İstek yapmak için kullanılan varsayımsal bir Python istemcisi alın . Muhtemelen istemcide bir yöntem var, diyelim get()ki içinde bir çağrı urllib2.Request()var. Sadece aramayı kendi sınıfınıza taklit etmeniz yeterlidir get().

@patch('your.Client.get')
def test_with_mock(self, your_mock):
    your_mock.return_value({'some': 'json'})
    test_obj = your.Client.get_object(5)
    your_mock.assert_called_with('/the/correct/endpoint/5')

Bu çok basitleştirilmiş örnek , bazı API'lardan bir şeyler almak için doğru url'yi üreten your.Clientbir get_object()yöntemle varsayımsal bir sınıfı test etmek için Python'un Mock kütüphanesini kullanır . İstemciyi istemek için get()bu url ile yöntemini çağırır . Burada, bu yöntem alay edilir ( your.Client.get"yamalı", böylece kontrolü altında olur your_mock) ve test doğru uç noktasının talep edilip edilmediğini kontrol eder.

Alaycı yöntem your_mock.return_value, istemcinin işlemesi gereken yapılandırılmış JSON yanıtını ( ) döndürür ve beklenen verileri beklenen şekilde işlediğini sınamak için başka bildirimler yaparsınız.


Peki "doğru" talepte bulunduğunuzda bunun gerçek bir hak (üretimde) talebi olduğundan nasıl emin olabilirsiniz? Çünkü önerinizi anlarsam API değişir veya kırılırsa testleriniz yine de çalışır. Üretimde tamamen farklı bir hikaye.
FrEaKmAn

1

Açıkladığınız şey bir entegrasyon testi senaryosudur. Bunlar genellikle kurulumu ve yırtılması biraz gariptir. Koşmalarını yavaşlatır ve çoğu zaman kırılgandır.

Fikstürlerle yaklaşım aynı derecede garip ve beceriksizdir, ancak bazı çerçevelerin bu konuda devam etmesi varsayılan yoldur, örneğin Rails ve zaten desteklenmektedir. Soyut test senaryosuna veya veritabanını fikstürlerle hazırlamak için benzer bir şeye ihtiyaçları vardır. (Rails'teki test kategorilerinin olağandışı adlandırılmasına dikkat edin, DB fikstürleriyle yapılan birim testleri kesinlikle entegrasyon testlerinden bahsediyor.)

Senaryo hakkında gitmek istiyorum yolu API uygulama durumu veya veritabanı üzerinde teste özgü kontrol sahibi kabul etmektir. Kurulum ve söküm için yalnızca test ortamında bulunan ek uç noktalarınız olabilir. Alternatif olarak, uygulamanızın / API'nızın arkasındaki veritabanıyla (veya kullandığınız her şeyle) konuşursunuz.

Bunun çok fazla (gereksiz anlamında) çaba olduğunu düşünüyorsanız, veritabanları için fikstürlerle olan yaklaşımın sadece şunu yaptığını düşünün: veritabanı veya uygulama durumunu değiştirmek için teste özgü ek araçlar kullanmak.

Yine de bu tartışmanın HTTP'nin durumsuz doğasıyla ilgili olduğunu düşünmüyorum. HTTP vatansızdır, ancak çoğu durumda uygulama kesinlikle değildir. REST katılığı aradığınız yerde biraz size benziyor. Tüm kaynakların tamamen yaratılabilir, okunabilir ve silinebilir olmasını da sağlayabilirsiniz. Bu durumda, normal API araçlarıyla tüm kurulum ve sökme işlemlerini yapabilirsiniz. Bununla birlikte, bu genellikle pratikte yapılmaz, çünkü en azından test ortamının dışında değil, uygulamanızın iş anlayışından belirli işlemleri dahil etmek istemezsiniz.


1

Maymun Yaması

İşimde ATDD'yi istemci ve sunucu arasında mevcut bir xUnit çerçevesi ve maymun düzeltme eki ağ çağrıları kullanarak yapıyoruz. Aynı işlem alanında istemciyi yükleriz, maymun çağrısı REST sunucusu yığın kodunun en üstüne ağ çağrısını ekler. Tüm çağrılar istemciden normalde olduğu gibi gönderilir ve sunucu kodu istekleri normalde göründüğü gibi alır.

Yararları

  • sunucu başlangıcıyla senkronize etmek zorunda değilsiniz (sunucu olmadığı için)
  • demirbaşlar gibi şeyleri yönetmek için klasik birim kurulumu ve sökme yönteminden yararlanın
  • testin daha ince taneli kontrolü için alayları / saplamaları ve diğer maymun yamalarını kullanma yeteneği
  • xUnit çerçeve kullanılarak yazılabilir

tradeoffs

  • çoklu işlem etkileşimlerini / sorunlarını (kilitleme, kaynak açlığı vb.) ortaya çıkarmaz
  • çoklu sunucu sorunlarını ortaya çıkarmaz (veri serileştirme, kümeleme stili)
  • simüle edildiği için ağ sorunlarını göstermez (erişim, zaman aşımı hataları, vb.)
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.