Geliştirdiğim bir API istemci kütüphanesini test etmenin en iyi yolunu bulmaya çalışan çevrelerde dolaşıyorum. Kütüphane, Client
temel olarak API ile 1: 1 eşleşmeye sahip bir Wrapper
sınıfa ve üstünden daha kullanıcı dostu bir arayüz sağlayan ek bir sınıfa sahiptir Client
.
Wrapper --> Client --> External API
Ben ilk ikisine karşı bir sürü test yazmış Client
ve Wrapper
etkili bir şekilde sadece onlar ileri üzerinde işlem ne olursa olsun uygun fonksiyonlara (o test Wrapper
çalışır Client
ve Client
bir HTTP bağlantısı üzerinde çalışır). Bununla birlikte, bundan rahatsızlık duymaya başladım, çünkü arayüzden ziyade bu sınıfların uygulanmasını test ediyor gibi hissediyorum. Teorik olarak, sınıfları tamamen geçerli başka bir uygulamaya sahip olacak şekilde değiştirebilirim, ancak denemem beklenen fonksiyonlar çağrılmadığından testlerim başarısız olur. Bana kırılgan testler gibi geliyor.
Bundan sonra sınıfların arayüzünü düşündüm. Testler, sınıfların gerçekte nasıl yaptıklarından ziyade yapmaları gereken işi yaptığını doğrulamalıdır. Peki bunu nasıl yapabilirim? Akla ilk gelen harici API isteklerini saplamak. Ancak, dış hizmeti aşırı derecede basitleştirmek konusunda endişeliyim. Gördüğüm stubbed API'lerin birçoğu, sadece kodunuzun sahte API'nize karşı doğru çalışıp çalışmadığını test etmenin gerçekten kolay bir yolu gibi görünen hazır yanıtlar veriyor. Alternatif, sadece olanaksız olan ve gerçek hizmet her değiştiğinde güncel kalması gereken hizmeti alay etmektir - bu aşırıya kaçma ve zaman kaybı gibi hissettirir.
Son olarak, bunu SE programcılarının başka bir cevabından okudum :
Uzak bir API istemcisinin işi, belirli çağrılar yapmaktır - ne daha fazla ne daha az. Bu nedenle, testi bu çağrıları düzenlediğini doğrulamalıdır - daha fazla, daha az değil.
Ve şimdi az çok ikna oldum - test ederken, test Client
etmem gereken tek şey API'ya doğru isteklerde bulunması (Tabii ki, her zaman API'nin değişme olasılığı var, ancak testlerim geçmeye devam ediyor - ama bu entegrasyon testlerinin yararlı olacağı yerlerde). Yana Client
sadece 1'dir: API ile 1 haritalama, benim endişe gerçekten geçerli değildir başka bir geçerli uygulamadan değiştirme hakkında daha önce - her yöntem için yalnızca bir geçerli uygulama var Client
.
Ancak, hala Wrapper
sınıfa takılı kaldım . Aşağıdaki seçenekleri görüyorum:
Client
Sınıfı saplamış ve sadece uygun yöntemlerin denendiğini test ediyorum . Bu şekilde, yukarıdakiyle aynı şeyi yapıyorum, ancakClient
API için bir stand-in olarak davranıyorum. Bu beni başladığım yere geri getiriyor. Bir kez daha, bu bana arabirimi değil, uygulamayı test etmekten rahatsızlık veriyor.Wrapper
Çok iyi bambaşka istemcisi kullanılarak uygulanabilir.Ben bir alay yarattım
Client
. Şimdi bununla alay etmek için ne kadar uzağa gideceğime karar vermeliyim - hizmetin tam bir alayını oluşturmak çok çaba gerektirecek (kütüphanenin kendisine gitenden daha fazla iş). API'nin kendisi basittir, ancak hizmet oldukça karmaşıktır (aslında bu veriler üzerinde işlemlere sahip bir veri deposu). Ve yine, alayımı gerçekle senkronize tutmak zorunda kalacağımClient
.Sadece uygun HTTP isteklerinin yapıldığını test ediyorum. Bu, bu HTTP isteklerini yapmak
Wrapper
için gerçek birClient
nesne üzerinden çağrılacağı anlamına gelir , bu yüzden aslında tek başına test etmiyorum. Bu biraz korkunç bir birim testi yapar.
Bu yüzden bu çözümlerin hiçbirinden özellikle memnun değilim. Sen ne yapardın? Bu konuda doğru bir yol var mı?