Programlamada "to stub" ne anlama geliyor?


117

Örneğin, bu alıntıda ne anlama geliyor?

Harici bir API ile entegrasyon, herhangi bir modern web uygulamasında neredeyse bir garantidir. Etkili şekilde entegrasyonunu test etmek için gereken saplama dışarı. İyi bir saplama oluşturmak kolay olmalı ve gerçek, güncel API yanıtlarıyla tutarlı bir şekilde güncel olmalıdır. Bu yazıda, harici bir API için saplamalar kullanan bir test stratejisini özetleyeceğiz .


Yanıtlar:


104

Saplama, sistemdeki Mevcut Bağımlılık (veya işbirlikçi) için kontrol edilebilir bir alternatiftir . Bir saplama kullanarak, doğrudan bağımlılıkla uğraşmadan kodunuzu test edebilirsiniz.

Dış Bağımlılık - Mevcut Bağımlılık:
Sisteminizde, test edilen kodunuzun etkileşime girdiği ve üzerinde kontrolünüz olmayan bir nesnedir. (Yaygın örnekler dosya sistemleri, iş parçacıkları, bellek, zaman vb.)

Aşağıdaki kodda örnek:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
            }
        }
    }

MailService.SendEMail () yöntemini test etmek istiyorsunuz , ancak bunu yapmak için test yönteminizde bir İstisna simülasyonu yapmanız gerekir , bu nedenle istediğiniz sonucu simüle etmek için bir Sahte Stub errorService nesnesi oluşturmanız gerekir , ardından test kodunuz mailService.SendEMail () yöntemini test edebilir . Gördüğünüz gibi, ErrorService sınıfı nesnesi olan (Existing Dependency nesnesi) olan başka bir Dependency'den gelen bir sonucu simüle etmeniz gerekiyor .


9
İngilizce? Mevcut bir bağımlılık nedir?
Jwan622

17
@ Jwan622 Meslekten olmayan terimlerle: Kodun kullandığı her şey. "Bağımlılığı" yeniden okuyup "sınıf" veya "işlev" veya herhangi bir şeyle değiştirip değiştirmediğinizi (geçmişinize bağlıdır) anlamanıza yardımcı olabilir. Bazen mevcut sınıfı / işlevi kullanmak uygun bir seçenek değildir ve bir saplamaya ihtiyacınız vardır (örneğin, sistemin geçerli tarihi ve saati gibi ortama dayanan işlevler için otomatik birim testinde).
MasterMastic

101

Bu bağlamda bir saplama , sahte bir uygulama anlamına gelir.

Yani, arayüze uyan ve test için kullanılacak olan basit, sahte bir uygulama.


3
Martin Fowler'ın ünlü Mocks Arn't Stubs makalesinde daha fazla ayrıntı sağlanmıştır : "Ama çoğu zaman sahte nesnelerin kötü bir şekilde tanımlandığını görüyorum. Özellikle bunların, test ortamları için ortak bir yardımcı olan taslaklarla karıştırıldığını görüyorum."
pba

61

Layman'ın şartları, siz (veya diğer taraf) gerçek verileri sunmaya / almaya hazır olana kadar kodunuzu test etmek veya geliştirmek için kullanabileceğiniz sahte verilerdir (veya sahte veriler, test verileri ... vb.). Bir programcının "Lorem Ipsum "udur.

Çalışan veritabanı hazır değil mi? Jane Doe, John Doe vb. İle basit bir tane oluşturun. API hazır değil mi? Sahte veriler içeren statik bir .json dosyası oluşturarak sahte bir dosya oluşturun.


1
Örnek için teşekkürler :)
CapturedTree

8

Bu bağlamda, "saplama" kelimesi "sahte" yerine kullanılır, ancak açıklık ve kesinlik adına, yazar "sahte" kullanmalıdır, çünkü "sahte" bir tür taslaktır, ancak test etmek içindir. Daha fazla kafa karışıklığını önlemek için, saplamanın ne olduğunu tanımlamamız gerekir.

Genel bağlamda, saplama, başka bir programı (genellikle başka bir makinede, sanal makinede veya işlemde bulunur - ancak her zaman olmamakla birlikte, yerel bir program da olabilir) çağırmanın karmaşıklığını kapsayan bir program parçasıdır (tipik olarak bir işlev veya nesne) nesne). Çağrılacak asıl program genellikle aynı bellek alanında bulunmadığından, onu çağırmak, adresleme, gerçek uzaktan çağrının gerçekleştirilmesi, aktarılacak verileri / bağımsız değişkenleri sıralama / serileştirme (ve potansiyel sonuçla aynı) gibi birçok işlemi gerektirir, hatta belki kimlik doğrulama / güvenlikle uğraşmak, vb. Bazı bağlamlarda, stub'ların proxy olarak da adlandırıldığını unutmayın (Java'daki dinamik proxy'ler gibi).

Sahte, çok özel ve kısıtlayıcı bir saplama türüdür, çünkü sahte, test için başka bir işlevin veya nesnenin yerine geçer. Pratikte, test ortamında uzaktaki bir programı değiştirmek için yerel programlar (işlevler veya nesneler) olarak taklitleri sıklıkla kullanırız. Her durumda, sahte, değiştirilen programın gerçek davranışını kısıtlı bir bağlamda simüle edebilir.

En ünlü saplama türleri, uzak prosedürleri ( RPC ) veya uzak nesneleri ( RMI , CORBA ) çağırmaya ihtiyaç duyulduğunda açıkça dağıtılmış programlama içindir . Çoğu dağıtılmış programlama çerçevesi / kitaplığı, saplama oluşturmayı otomatikleştirir, böylece bunları manuel olarak yazmak zorunda kalmazsınız. Stub'lar, örneğin IDL ile yazılmış bir arayüz tanımından oluşturulabilir (ancak arayüzleri tanımlamak için herhangi bir dili de kullanabilirsiniz).

Tipik olarak, RPC, RMI, CORBA ve benzerlerinde, çoğunlukla argümanların sıralanması / serileştirilmesi ve uzaktan çağrının gerçekleştirilmesi ile ilgilenen istemci tarafı saplamaları ve çoğunlukla unmarshaling / deserialize etme ile ilgilenen sunucu tarafı saplamaları ayırt edilir. argümanlar ve aslında uzak işlevi / yöntemi çalıştırır. Açıkçası, istemci saplamaları istemci tarafında bulunurken sunucu saplamaları (genellikle iskeletler olarak adlandırılır) sunucu tarafında bulunur.

İyi verimli ve genel taslaklar yazmak, nesne referanslarıyla uğraşırken oldukça zor hale gelir. RMI ve CORBA gibi çoğu dağıtılmış nesne çerçevesi, dağıtılmış nesne referanslarıyla ilgilenir, ancak bu, örneğin çoğu programcının REST ortamlarında kaçındığı bir şeydir. Tipik olarak, DİNLENME ortamlarda, JavaScript programcılar AJAX çağırmaları kapsüllemek için basit saplama işlevleri (nesne seri ile desteklenmektedir yapmak JSON.parseve JSON.stringify). Swagger Codegen projesi otomatik olarak çeşitli dillerde DİNLENME koçanları üretmek için geniş bir destek sağlar.


4

Stub, doğru fonksiyon adına, doğru sayıda parametreye sahip ve doğru tipte sahte sonuç üreten bir fonksiyon tanımıdır.

Testin yazılmasına yardımcı olur ve örnekleri fonksiyon tasarımı tamamlanmadan önce çalıştırmayı mümkün kılan bir tür iskele görevi görür.


3

Ayrıca böyle bir saplama oluşturmak için çok iyi bir test çerçevesine sahipsiniz. Benim tercih ettiğim biri Mockito , EasyMock ve diğerleri de var ... Ama Mockito harika, onu okumalısınız - çok zarif ve güçlü paket


3

Bu cümle, neredeyse kesinlikle, ev inşaatındaki bir aşama ile bir benzetmedir - sıhhi tesisat "tıkanma". İnşaat sırasında duvarlar hala açıkken kaba sıhhi tesisat konur. İnşaatın devam etmesi için bu gereklidir. Sonra, etrafındaki her şey yeterince hazır olduğunda, biri geri gelir ve musluklar, tuvaletler ve asıl son ürün malzemelerini ekler. (Örneğin bkz. Bir Sıhhi Tesisat Saplaması Nasıl Kurulur .)

Programlamada bir işlevi "saptırdığınızda", bunun etrafında çalışmak için (test etmek veya başka bir kod yazmak için) yeteri kadar onu oluşturursunuz. Ardından, daha sonra geri gelirsiniz ve onu tam uygulama ile değiştirirsiniz.


0

RPC Saplamaları

  • Temel olarak, bir istemci tarafı saplama, istemciye çağrılabilir bir sunucu prosedürü gibi bakan bir prosedürdür.
  • Sunucu tarafı saplama, sunucuya, arayan bir istemci gibi bakar.
  • İstemci programı sunucuyu aradığını düşünür; aslında, müşteri saplamasını çağırıyor.
  • Sunucu programı, istemci tarafından çağrıldığını düşünür; aslında, sunucu saplaması tarafından çağrılır.
  • Saplamalar, RPC'nin gerçekleşmesi için birbirlerine mesajlar gönderir.

Kaynak


0

"Bir işlevi ortadan kaldırmak, yalnızca işlevin çağrıldığını gösterecek kadar yazacağınız ve daha fazla zamanınız olduğunda ayrıntıları daha sonra bırakacağınız anlamına gelir."

Gönderen: SAMS Kendinize C ++, Jesse Liberty ve Bradley Jones'u öğretin

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.