Tek amacı harici bir API'yi sorgulamak olan ancak API karmaşık bir sorgu sözdizimi kullanan bir işlevi nasıl test edersiniz?


16

Tek gerçek mantık harici API'nin sorgu sözdizimindedir. API'yi sorgulayıp sorgulamadığını test etmek istemiyorum, doğru veri döndürülecek şekilde sorguladığını test etmek istiyorum. Örneğin, bazı sözde kodlar:

function retrieve_related_data(id)
{
  query = "[potentially long, syntactically complex query that
            uses param id to get some data]";
  results = api_wrapper.query(query);
  return results;
}

Hazırlanmış bir API ile daha somut bir örnek:

function retrieveLifeSupportingObjectsWithinRegion(id)
{
  query = "
    within region(" + id + ") as r
    find objects matching hydration>0 and temp_range has 75
    send name, id, relative(position, r)        
  ";
  results = astronomicalObjectApiWrapper.query(query);
  return results;
}

Sorgu, API'ye özel bir sözdizimindedir ve karmaşıktır ve aynı veya benzer sonuçları elde etmenin birden fazla yolu vardır. İşlevin amacı, tarafından tanımlanan verileri elde etmek değil , aynı zamanda idtanımlanan verilerle bulanık bir ilişkiye dayanan diğer verilerin bir alt kümesini bulmaktır id. Diğer gereksinimler ne olursa olsun her zaman aynıdır, idancak sistem değiştirildikçe zaman içinde değişebilir. Örneğin, api örneği yerçekimi bilgisi için destek eklediyse, sorguyu, sonuçları daraltmak için yerçekimini de kullanacak şekilde değiştirmek isteyebiliriz. Ya da belki sıcaklık aralığını kontrol etmek için daha verimli bir yol buluyoruz, ancak sonuçları değiştirmiyor.

Test etmek istediğim, belirli bir giriş idiçin doğru veri kümesinin döndürülmesidir. Birisi artık idbaşarısız olacak dayalı doğru veri döndürmüyor sorguyu berbat eğer, bunu test etmek istiyorum , ama aynı zamanda insanların da değiştirmeye gerek kalmadan daraltmak için sorguyu değiştirmek mümkün istiyorum test.

Düşündüğüm seçenekler:

  1. Api saplama olabilir, ama bu çok basit olurdu ( idsorguda var olup olmadığını kontrol edin ve sonra ya da değilse beklenmeyen bir küme veri beklenen bir dizi döndürür), çok kırılgan (sorgu dizesi olup olmadığını kontrol edin) işlevde tam olarak ne varsa) veya çok karmaşık (kullanılan sorgunun sözdizimsel olarak doğru olup olmadığını ve doğru verilerin döndürülmesini sağladığını kontrol edin).

  2. Sorguyu gerçek API'ye gönderebilirim, ancak test sisteminin kontrolü dışında harici sistemdeki veriler değiştikçe beklenen sonuçlar zaman içinde değişebilir.

  3. Sahip olduğu verileri kontrol etmek için gerçek API'nin test kurulumunu ayarlayabilirim, ancak bu çok çaba.

# 2'ye doğru eğildim ve bunu daha sık çalışmayan bir entegrasyon testinden daha fazla hale getiriyorum ve dış sistemin verilerindeki değişikliklerin ne kadar sıklıkla testin bozulmasına neden olduğunu görüyorum. Şimdilik en basit olacağını düşünüyorum, ancak düşünmediğim alternatifler veya bu sorunu çözmek için daha iyi yollar olup olmadığını merak ediyorum. Herhangi bir tavsiye mutluluk duyacağız.


Bunu bir birim test olarak düşünüyordum, ama belki de gerçekten bir entegrasyon testi veya düşük seviyeli bir kabul testi?
Joshua Coady

2
Salt okunur bir API mı? Veya okumalarınızı güvenilir bir şekilde doğrulayabileceğiniz veriler yazabiliyor musunuz?
svidgen

Bu soru "sql (= karmaşık sözdizimi) correnct veri döndürür nasıl test" farklı mı? Veritabanları ile genellikle crud-sql-sözdizimini test eden birkaç entegrasyon testine ve businesslogic'i doğrulamak için alaycı bir depo ön cephesine sahip olursunuz
k3b

Yanıtlar:


7

Harici API yanıtını doğrulamak işlevimizi test ediyor gibi görünebilir, ancak bu tamamen doğru olmaz. Her nasılsa, harici API'yi ve API'nın çalıştığı ortamı test ediyoruz.

Testlerimiz, üçüncü taraflarca yazılan kodun değil, yazdığımız kodun beklenen davranışını garanti etmek için ele alınmalıdır.

Belli bir dereceye kadar, güvendiğimiz API'lerin ve kütüphanelerin düzgün işlevine güvenmek zorundayız. Örneğin, genellikle uyguladığımız çerçeve bileşenlerini test etmiyoruz.

Neden böyle söylüyorum?

Test etmek istediğim, belirli bir giriş kimliği için doğru veri kümesinin döndürülmesidir

Burada ne test edilir? Söylediğiniz gibi, veriler ve doğruluğu kontrolümüz altında değildir, bu nedenle test aşamasının başarısını herhangi bir kontrole sahip olmadığımız bir harici ajana kısıtlayacağız. Bu testler deterministik olmayan ve kesin olmaya adaydır , bina boru hattımızda bu tür testleri istemiyoruz .

Farklı bir endişe sözleşmeyi doğrulamaktır. Herhangi bir sürüm veya dağıtımdan önce entegrasyonun hala beklendiği gibi çalıştığından emin olmak için bir sözleşme testi 1'i oldukça yararlı bulurdum .

Birisi artık başarısız olacak kimliğine göre doğru veri döndürmüyor gibi sorgu berbat eğer bunu test etmek istiyorum

Sorgu tamamsa, ancak API'daki hatalar nedeniyle veriler yanlışsa ne olur? Sadece veriler bizim kontrolümüz dışında değil. Mantık da öyle.

İşlevsel testlerin veya uçtan uca testin uygulanması burada yardımcı olabilir. API'lerin yanlış veri döndürmesi durumunda, bu muhtemelen beklenmedik davranışlara ve çıktılara neden olacak şekilde belirli yürütme yollarını doğrulamak için bu testi ele alabilirsiniz. Öte yandan, sorgularım kötü biçimlendirilmişse API'nın hata atmasını beklerim.

Ama aynı zamanda insanların testi de değiştirmeye gerek kalmadan inceltmek için sorguyu değiştirebilmesini istiyorum.

Bu amaçla bir araç kullanmanızı öneririm. Bu kadar basit olabilir:

  • Test olarak çalışan ancak test planına ait olmayan bir sınıf
  • Kabuk betiği + kıvrılma

Veya daha sofistike bir şey. Örneğin, bağımsız bir istemci.

Her durumda, soru altındaki işlev, iki tür teste değer:

  • Ünite testi. Söylediğiniz gibi, harici API'yi saplamanız gerekiyor, ancak bu birim testlerin tüm amacı. Bağımlılıkları izole eden kodumuzu test etmek.

  • Entegrasyon testi. Kodun yalnızca doğru isteği gönderdiğini değil, yanıt içeriğini, hataları, yönlendirmeleri vb. Doğru şekilde işlediğini kontrol edin. Tüm bu durumlar için testler yapın, ancak verileri test etmeyin .

Yan not: Sorunuza benzer -Uygulamanın SQL deyimlerini nasıl test ediyorsunuz-?

İlgili sorular :


1: @ DocBrown'un bu konuyla ilgili cevabı ilginizi çekebilir


"Sorun (IMO), harici API'yi test etmeye çok fazla odaklanmış olmanız." - Askerin harici API'yi test etmekle ilgilendiğini gösteren hiçbir şey görmüyorum. Ayrıca, "harici API'yi saplama" diyorsunuz, ancak askerin "çok basit" seçeneği, "çok kırılgan" seçeneği, "çok karmaşık" seçeneği veya dördüncü seçeneği kullanması konusunda herhangi bir öneriniz var mı?
Tanner Swett

OP sorusu, harici bir API'yı çağıran bir işlevi nasıl test edeceğinizi soruyor. Ama şüphelerini okumak bana öyle geliyor ki sorguyu ve sonuçlarını test etmeye çok fazla önem veriyor. 4 öneri sundum: (1) API testi yapmayın. (2) sorguyu düzeltmek için entegrasyon testlerini çalışma tezgahı olarak kullanmayın. Bunun yerine bir araç yapın. (3) ana soruya geri dönün, üniter ve entegrasyon testini yapın. Ancak API yanıtının içeriğini doğrulamıyor. (4) Proje yöneticisine, projenin test planının bir parçası olarak harici API'nin test paketini yapıp yapamayacaklarını / yapıp yapamayacaklarını sorun.
17'de Laiv

1
Ben sorgu "kendisi tarafından yazılan kod" olarak kabul. Son hedef, kodumuzda bir hata çıkardığımızda bizi uyarmak için otomatik testtir. SQL ifadeleri hakkında söylediklerinizi alarak, sanırım buna benzer - Sanırım sorum, kodunuzun harici bir API'yi API'nın istendiği gibi yanıt vereceği şekilde sorguladığını (bir nominal yanıt). Söylediklerinizin bunu ünite ve entegrasyon testlerinin dışında bırakmak olduğunu düşünüyorum, ancak sorgular kritik öneme sahipse, canlı harici API'yi test etmek için diğer bazı otomatik testleri ayrı olarak ayarlayabiliriz.
Joshua Coady

1
IMO, en iyi yol fonksiyonel test yapmaktır, asla gerçek olmayacak olan nerede maddesinde değişiklik, fonksiyonel testlerimden bir veya daha fazlasında farklı bir davranışa neden olacaktır. UT test planında sadece küçük bir parça.
Laiv

2
Sondaj tahtası olduğunuz için teşekkürler. Sorgu özel mantık olsa da, sonuçta sorgu test edilen sistemin dışında "yürütülen" kod olduğundan birim test etki alanı dışında sanırım. Ben görmeden önce bana farklı şekillerde birden çok kez söyleyecek birine ihtiyacım vardı;)
Joshua Coady

2

Oluşturulan sorgu dizesi beklenen bir değer eşleşiyor kontrol birim denetimleri gördüm.

Ancak. Bence bu sınırlı kullanım olsaydı. Sorgu sözdizimi karmaşıktı, muhtemelen buggy, bu yüzden A kontrol etmek için sonsuz olasılıklar vardı ve dize 'doğru' üretilse bile B canlı ortamda beklenmedik sonuçlar döndürülebilir.

Ben senin seçenek 2. gitmek haklı olduğunu düşünüyorum canlı örnek karşı entegrasyon testleri çalıştırın.

Yıkıcı olmadıkları sürece, bunlar yazmanız gereken ilk testlerdir, çünkü herhangi bir hatanın nedenini tanımlamasalar da yakalayacaklardır.

Seçenek 3'e geçmek, 'sahte verilerle bir test örneği dağıtmak' üstündür. Ancak, test yazımınızı etkilemez, çünkü aynı testleri test sunucusuna dağıtmak için zamanın iyi bir şekilde kullanılıp kullanılmadığını ve ne zaman kullanıldığını gösterebilirsiniz.


0

API'ya bağlıdır, ancak mümkünse # 3 seçeneğine gidin (özel test örneği).

Bahsettiğiniz nedenlerden dolayı API'yi (seçenek # 1) saplamak en kötü seçenektir ve bu rotaya gitmek muhtemelen iyi olandan daha fazla zarar verecektir (boşa harcanan zaman).

Gerçek API'ye (seçenek # 2) karşı koymak, testleri lapa lapa ve güvenilmez hale getirir ve birkaç yanlış pozitif durumdan sonra insanlar bunları kullanmayı bırakacaktır. Veriler sadece değişmekle kalmaz, aynı zamanda servis de kapalı olabilir. Bence bu, sorgular için hiçbir teste sahip olmaya ve sorunları bulmak için entegrasyon / sistem testlerine güvenmeye benziyor. Bununla birlikte, API verileri nadiren değişirse ve API'nin kendisi neredeyse her zaman hazırsa, bu uygun bir seçenek olabilir. Çoğu API bu açıklamaya uymuyor.

Sonunda bu sorguların ne kadar önemli ve karmaşık olduğu ortaya çıkıyor: eğer bir avuçtan fazlası varsa ve bazıları bunları test etme ihtiyacını hissedecek kadar karmaşıksa, test için özel bir örnek oluşturma çabasına yatırım yapardım . Diğer birim testler gibi kendisi için de para ödeyecek.


Yani temelde birim testleri (# 1) ve entegrasyon testlerinin (# 2) zararlı olduğunu mu söylüyorsunuz? # 3 aralarında en iyi görünse de, aynı zamanda en pahalı da olabilir. API her değiştiğinde korunmalıdır. # 2 olmadan, uygulama üretilinceye kadar (önlem almak için çok geç) gerçek API'daki olası hata değişikliklerinin farkında olmayacaksınız. Tamam, # 1 kullanılmamış görünüyor çünkü test edilecek kod satırları yok ... bugün ... Yarın, nasıl biliyor ...
Laiv

Kötü testlerin kesinlikle zararlı olduğunu söylüyorum. Kesintili testler çok fazla zaman ve çaba harcar ve insanların bir bütün olarak birim testlere olan inancını kaybetmelerine neden olur. Uygulama değişiklikleri (# 1) ile ya da veri değişiklikleri (# 2) iyi bir test olmadığında sadece rastgele yapılan testler.
Michal Tenenberg

Entegrasyon testi verileri test etmiyor. Bu kadar. Testi kıramazlar, sadece entegrasyonu doğrularlar. Test, inanç meselesi değildir Uygulamaya değer katan iyi alışkanlıklara sahip olmak meselesidir
Laiv
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.