Aslında bir API istemcisinin birim testine değer mi?


38

Bu bir süredir beni rahatsız eden bir şey. Aslında bir API istemcisinin birim testine değer mi?

Diyelim ki bir petshop REST API'sine yapılan çağrıları soyutlamak için küçük bir sınıf yaratıyorsunuz. Evcil hayvan dükkanı çok basit bir API'dir ve temel bir dizi yönteme sahiptir:

  • listProducts()
  • getProductDetails(ProductID)
  • addProduct(...)
  • removeProduct(ProductID)

Bunu sınamak için ya bir alay servisi oluşturmalı ya da cevapları alay etmeliyiz. Ama bu fazlaca görünüyor; Yöntemlerimizin yazım hatası / sözdizimi hatalarıyla çalışmayı bırakmadığından emin olmak istediğimizi biliyorum, ancak uzak yöntemleri çağıran işlevler yazdığımızdan ve bu uzak yöntemlerden sahte yanıtlar yarattığımız için çaba kaybı ve gerçekten başarısız olmayacak bir şeyi test ediyoruz. Daha kötüsü, eğer uzaktan yöntem değişirse, üretim kullanımı başarısız olurken birim testlerimiz geçecektir.

Bir şeyleri özlediğimden eminim, veya çubuğun yanlış tarafına sahibim veya ağaçlar için odun göremiyorum. Birisi beni doğru yola koyabilir mi?


1
Bu temel yöntemlerle basit bir API olmasaydı, farklı hisseder miydiniz? Hatta bir kulübe bile karda durmalı.
JeffO,

Yanıtlar:


31

Uzak bir API istemcisinin görevi, belirli çağrılar yapmaktır - daha fazla değil, daha az değil. Bu nedenle testi, bu çağrıları yaptığını doğrulamalı - daha fazla değil, daha az değil.

API sağlayıcısının cevaplarının anlamını değiştirmesi durumunda sisteminiz üretimde başarısız olur. Ama bu müşteri sınıfının suçu değil; bu sadece entegrasyon testlerinde yakalanabilecek bir şey. Kontrolünüz altında olmayan kodlara güvenerek, iç testlerle doğruluğu kontrol etme kabiliyetinden vazgeçtiniz - bu bir takas oldu ve bu fiyattır.

Bununla birlikte, yalnızca başka bir sınıfa delegasyonlardan oluşan bir sınıfı test etmek düşük önceliğe sahip olabilir, çünkü nispeten daha az karmaşık hata riski vardır. Ancak bu, yalnızca tek biçimli tek gömleklerden oluşan herhangi bir sınıf için geçerlidir, başka bir satıcının kodunu çağırmakla ilgisi yoktur.


Anladığımdan emin değilim. Bunu test edebilirsiniz foo()önce çağrılan bar(), ama bu demek çağrı yapar değil foo()önce bar()yapılacak doğru şey; Böyle bir ünite testi, kod yanlış olsa bile geçer. Ve tüm müşterinin yaptığı bu ise, foo()daha önce çağrılıp çağrılmadığını kontrol eden takasçıları ayarlamak bar(), müşteri koduna bir bakış açısıyla doğrulanabilecek bir şey için göreceli olarak zahmetlidir.
Doval

1
Bir add()yöntemin iki sayıyı doğru şekilde eklediğini test edebilirsiniz , ancak bu, algoritmanın bu noktada yapmanın doğru olan şey olduğu anlamına gelmez - add()program testi yanlış olsa bile ünite testi başarılı olacaktır. O takdirde ise yanlış şey, sonra levenshteinDistance()bir yöntem değildir, sorumlu olduğu add()yöntemi. Bu tamamen aynı. Kodun yöntemlere ayrılması, her bir yöntemin yalnızca bir şeyi düzeltmekle ilgilenmesi gerektiğidir .
Kilian Foth

3
Şimdi nereye katılmayacağımızı görüyorum! HTTP sınır tarafındaki sistem uçları, bu nedenle verilen DİNLENME aramaları de, bende bu araçlar bir dış evcil hayvan dükkanında faydalanıyorsanız olan çıkışlar ve teste tabi. Bu modülün evcil hayvan dükkanı bölümünü düşünüyorsanız, evet, yapılan aramaların şekli bir uygulama detayıdır ve bir birim testinin kendileri hakkında bir şey yazan bir işi yoktur.
Kilian Foth

2
“Bu nedenle, testi, bu çağrıları yayınladığını doğrulamalı” dedi. Göremediğim perspektif bu. Teşekkürler!
Phillip B Oldham

1
Örneğin, birim testim, belirli parametreler verildiğinde, isteğin gövdesinin doğru olup olmadığını kontrol edebilir mi?
Maria Ines Parnisari

9

Kısa cevap:

Tüm yöntemler birim test edilmelidir.

Uzun cevap:

Evet. Buna değer.

Bunlar, API çağırma yöntemleriyle ilgili birim sınamalarının test etmesi gereken şeylerdir:

  • API çağrılarına iyi biçimli veya doğru parametreler geçirdiğinizi
  • API'lerin döndürdüğü belirli veri türlerine göre yanıt verdiğinizi (alaylı veya değil), örneğin, API boş bir dize döndürdüğünde, yönteminiz varsayılan bir değer döndürmelidir (yalnızca bir örnek)
  • API çağrıları bir hata ürettiğinde arayan yöntemlerinin doğru davrandığını

Bunlar, çağrılan yöntemin, API hizmetini alaycı durumumdan izole edilebilecekleri ve bunları iyi test ederek, hataların API'yi çağıran istemci kodundaki bir hatadan kaynaklanmadığını garanti eden şeylerdir.


Sen "alay et ya da değil" diyorsun, öyleyse gerçek API'ye karşı test yapmak uygun olur mu? Birim testi gibi görünse bile, bir entegrasyon testi diyebilir miyim? Yoksa buna çağrı yapacak başka bir şey var mı? API
sarıcımın bir

1
@DanRosenstark API hizmetinin alay edilmediği durumlarda bir entegrasyon testi olduğunu düşünüyorum.
Tulains Córdova

API'ye gerçek bir çağrı yaptığınızda, verileri doğru bir şekilde geri aldığınızı 5 saniye içinde bilmez misiniz? API alaycıları gerçek aramalar olmadığından başarısız olmalarının tek yolu API'yi değiştirirse ... bu durumda alay sınavlarınız geçer, ancak gerçek çağrılar başarısız olur. Anlamsız görünüyor
MattE

5

Bunlar birim test olmayacak çünkü sisteminizin giriş ve çıkışını, sınırlı entegrasyon testlerinde olduğu gibi test ediyorsunuz.

"Bir çaba kaybı gibi görünüyor ve gerçekten başarısız olamayacak bir şeyi test ediyoruz" derken çok dikkatli olun - başarısız olabilir, başarısız olur, muhtemelen bekleyemeyeceğiniz şekilde başarısız olur, Testler yapılmadığında arızalar daha da kötüleşir.

Burada yaptığınız hata, tekerleklerin icadıyla yapmaktır: Uzaktaki servislere ve API'lere çağrı yapmak çok yaygın bir senaryodur, bu yüzden bunu test etmenize yardımcı olacak bazı iyi araçlar vardır. En son uzak servislere bağlı bir uygulama üzerinde çalışıyordum SoapUI kullandımbir servise bakabilir ve bu servise sahte çağrılar yapabilir veya test çağrıları yapabileceğiniz ve istek ve yanıtları izleyebileceğiniz sunucunun yerel bir kopyası gibi davranabilir. Kurulumu birkaç dakika sürdü ve aynı şekilde uzaktaki arabirimin değişmesi durumunda güncelleme çok hızlı oldu. Bunu bir REST senaryosunda kullanmadım, ancak bunun için iyi çalışmasa bile (veya belki de daha iyi araçlar varken birileri bu cevabı okuyordur) alay edebilecek bir araç bulabilmelisiniz sizin için bir hizmet ve kodunuzu dağıtmanın zamanı geldiğinde, yaptığınız için memnun olacaksınız.

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.