Kimyasal & Malzeme Mühendisliği
Mühendislik Yazılım Testi için Tdd'daki Mock Objects yazmak için en iyi uygulamalar
Table of Contents
TDD'deki Mock Objects'e Giriş
Test-Driven Development (TD), modern mühendislik yazılım testlerinin temel taşıdır, kod güvenilirliğini teşvik eder, kullanılabilirlik ve net bir tasarım geri bildirim döngüsüdür. TDD'de, geliştiriciler ilk önce başarısız bir test yazar, sonra sadece test etmek için yeterli üretim kodu üretir ve sonunda veritabanı gibi dış bağımlılıkları izole etmek, web hizmetleri veya dosya sistemleri, alay nesneler kaçınılmaz hale gelir.
Doğru yapıldığında, tasarım kusurları erken tanımlamaya yardımcı olur, TDD'ye bağımlılık uygular ve test uygulamalarını geliştirmek isteyen mühendislik ekipleri için harekete geçilebilir rehberlik eder.
Mock Objects ve onların Rollarını Anlamak
En iyi uygulamalara girmeden önce, terminolojiyi açıklığa kavuşturmak önemlidir. Sık sık sık sık sık sık sık kullanılan test çiftleri çeşitli kategorilere girer, her biri ayrı bir amaçla. Martin Fowler'in klasik makalesi “Mocks Arent Stubs”)
- [FONT:0]Dummy[[DFLT:1) – Bir nesne etrafta geçti ama hiç kullanılmadı, genellikle yöntemi imzaları karşılamak için.
- [FONT:0]Stub[DÜT:1) - Test sırasında yapılan aramalara cevap verebilir, genellikle dolaylı girişleri kontrol etmek için kullanılır.
- [FONT:0]Spy) – Nasıl adlandırılacağı, daha sonra doğrulama izin verdiği hakkında bilgi edinin.
- [FONT:0]Mock[DÜT:1] – Hangi çağrıların yapılması ve kaç kez yapılması gerektiği hakkında beklentilerle programlanmış; etkileşimin beklendiği gibi gerçekleştiğini iddia ediyor.
- [FONT:0)Fake[[DÜT:1) - Hafif bir çalışma uygulaması (örneğin, üretim için uygun olmayan bir in-memory veritabanı)
Katı TDD'de, alaylar ve casuslar, etkileşim tabanlı test için birincil araçlardır, ancak stubs destek durumu temelli testler destekler.Bu ayrımlar mühendislere her senaryo için doğru testi iki katına çıkarmalarına yardımcı olur.
Modern alay çerçeveleri (örneğin, Mockito, Jest, birimtest.mock) bu hatları bir araya getirerek, ancak kavramsal açıklık kritik kalır. TDD'deki bir alay nesne, sistemin beklenen şekilde bağımlılık yaptığını doğrulamalıdır - sipariş veya frekansı aramak için belirli yöntemler arayın.
Mock Objects Yazmak için En İyi Uygulamalar
Aşağıdaki uygulamalar endüstri deneyimi ve toplum bilgeliğinden uzaklaşıyor. Onlara yönelik araştırmalar, testlerinizi daha güvenilir, okunabilir ve yeniden faktörlemeye dirençli hale getirecek.
1. Mocks Basit ve Odaklı Tutun
Her bir denemenin sadece test tarafından gerekli olan kesin davranışı taklit etmek için alay etmek. gereksiz stubs ile aşırılık, geri dönüş değerleri veya doğrulamaları önlemek.Bir alaycı çok fazla olduğunda, testin amacı daha da belirsiz hale gelir ve bakım maliyetleri artar.Örneğin, SUT sadece bir depoyu çağırırsa test geçişini yapmalıdır:0).
Ek olarak, varsayılan cevaplar veya lenient alayları kullanmayı tercih edin ( çerçevede izin verilir) SUT geliştikçe testlerden kaçınmayı tercih edin. Mockito,DANFLT:2) ovuşağı yöntemleri çağrıldığında gereksiz hataları engeller; Jest,END 3 döndürür.
2. Clear Naming Conventions kullanın
Bir alay değişkeninin adı rolünü ve bağımlılıklarını değiştirmek zorundadır..Ücretsiz yükleri azaltmak yerine..) veya [[DÜSÜSÜŞÜNÜŞÜNÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜNÜ
Affetmek için, özel bir alay uygulamaları yaratırsanız (gece çerçevelerle ihtiyaç duyulur), simdi davranışı açıkça gösteren yöntem isimleri kullanın, örneğin [[Ücretsizler veya [[Dönler: 9) veya [[Dönemler:))) gibi genel isimlerin ayrıntıları gizler.
3. Etkileşimleri Açıklamak
Bir alayın birincil amacı, özellikle etkileşimlerin meydana geldiğini iddia etmektir. Belirli yöntemlerin beklenen argümanlar, çağrı sayma veya sipariş ile adlandırıldığını doğrulama çerçevenizin doğrulama özelliklerini kullanın. Örneğin, Mockito'da:
Mockito.verify(mockService, times(1)).processPayment(anyString(), eq(100.0));
Jest:
expect(mockService.processPayment).toHaveBeenCalledTimes(1);
expect(mockService.processPayment).toHaveBeenCalledWith('order-123', 100.0);
Davranış sözleşmesine sadece neyin gerekli olduğunu doğrulamak için dikkatli olun. Aşırı sağlanma (örneğin, başka hiçbir yöntemin UZMANLIKT:14 aracılığıyla adlandırılmadığını kontrol edin) Indiscrminly tarafından test edilebilir.Depresyon olmayan yan etkiler gerçek bir endişedir.
4. Mocks'ı Aşırı kullanmaktan kaçının
Mocking varsayılan bir seçim değildir. Over-mocking, ayrıntıları uygulamak için sıkıca çiftleştirilmiş olan testlere yol açar, acı çekmesini sağlar.Bu heuristics'ı takip edin:
- [FONT:0]Mock sadece dışsal sınırlar[Dönetici: 1)[Dönlendirmeler, ağ veya I/O sınırlarına bağlı olarak (örneğin, bir veritabanı müşteri, bir REST API, bir dosya sistemi).
- [FONT:0)İşletme işleyicileri için gerçek nesneler (Döneticiler)[Döneticiler: 1) Eğer bir işbirlikçi basit, hızlı ve yan etkilerden bağımsız (örneğin, değer bir nesne veya faydalı sınıf), onu doğrudan alay etmek yerine kullanın.
- [FONT:0]Kendini alay eden türlerden yoksundur[[Döntme:0) – Bir bağımlılıkın uygulanmasını kontrol ederseniz, sahte (daha hafif bir in-memory versiyonu) düzinelerce stubs ile alay edilebilir mi düşünün.
- [FONT:0) Karmaşık iş akışları için entegrasyon testleri [Dönetici: 1) – alaylar birim testleri için harika olsa da, entegrasyon testleri (gerçek veya konteynerli bağımlılıklar) kriminalize edici hataları yakalamak için koordinasyonu sağlar.
İyi bir başparma kuralı: Eğer tek bir birim testi için 20+ çizgi roman yazmak istiyorsanız, SUT'un çok fazla bağımlısı olduğunu veya farklı bir test yaklaşımı düşünmeniz gerektiğinin bir işareti olabilir.
5. İntegörüntüler Açıklama
Mock nesneler sadece SUT'un bağımlılıklarını inşaat veya enjeksiyon yoluyla kabul ettiğinde, yöntem parametreleri veya (daha ideal olmayan) enjeksiyonu yapılır. Statik yöntemler, küresel devlet ve SUT içinde yaratılan nesne (örneğin, DUT) anti-patterns ile alay eder. Örneğin:
public class OrderService {
private final PaymentGateway paymentGateway;
public OrderService(PaymentGateway paymentGateway) {
this.paymentGateway = paymentGateway;
}
// ...
}
Bu tasarım, testlerin bir alaycı bir şekilde değiştirilmesine olanak sağlar.Eğer kodbase bir DI konteyner kullanırsa, test yapılandırması gerçek uygulamaları alaylarla aşırıleştirebilir.
6. Gerçekist ve Edge-Case Data
Mocks, tür, aralıklar ve yapılar dahil olmak üzere aynaların üretim değerlerini geri iade etmelidir. Boş dizeler veya 0 gibi her test için boş senaryo test edilmezse, gerçekçi ödeme yüklerini erken ortaya çıkarmak için kullanın. Örneğin, bir yöntem bir emir listesi bekliyorsa, bir liste boş bir liste değil, test açıkça boş davayı kapsar. Benzer şekilde, kenar davalarını kapsar: geçersiz girişler, zaman kesintiler, istisnalar veya sınır değerleri.
Ortak bir hata, gerçek uygulama geri dönebileceği bir nesneyi her zaman geri almak için bir repository alay etmek veya bir istisna atmak. Testler sonra geçer, ancak üretim kodu her iki başarı ve başarısızlık yollarını sistematik olarak simüle etmek için alay eder.
7. Testler Arasında Mocks
Herhangi bir test paketinde, her test davası için her test için alay edilmelidir. Çoğu modern çerçeveler otomatik olarak alay etmek için bir not veya kurulum yöntemi sunar.In JUnit 5 with Mockito, use ESFLT:19.) ve [[kahkalamalar teste sıfırlanır.In Jest, useENFLT:21).
Araçlar ve Çerçeveler Mocking
Doğru alaycı araç en iyi uygulamaların uygulanmasını kolaylaştırır. Aşağıda, etkili kullanım için rehberlik ile popüler diller arasında önemli çerçeveler vardır.
Java: Mockito
[FONT=0]Mockito[[DÜDÜT:1] Java ünitesi test için de facto standarttır. Uygunluk odaklı bir şekilde, esnek tartışma grupları ve temiz bir doğrulama API. UseASIFLT:23 ve ) uygun zaman doğrulayıcısı için doğrulayıcı bir şekilde doğrulayıcı.
JavaScript/TypeScript: Jest
Jest, inşa edilmiş olan ile alay ediyor: “ŞAMYLAÇLAR İÇİN SİZİ SİZİ KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN KAYNAKLAR İÇİN TIRMAYORLAR TIRMALARI TIRMALARI TIRMALARI TIRMAŞMAYOR.
Python: Unittest.mock
Standart kütüphanenin [[0] , [[DüzgÜye ait olan standart kütüphanenin, [[Uygunlar ve|sajmanlar) tarafından, tüm sınıfları değiştirmeden belirli yöntemleri alay etmek için.For async code,FLT:38, Python 3.8. temiz test için 3,00 $ gibi içerik yöneticileri ile alay etmek için.
.NET: Moq
Moq, .NET için en popüler alay kütüphanesidir, akıcı bir arayüz kullanarak. Örnek: 03. Moq sıkı ve gevşek alaycı davranışı destekler; sadece gerektiğinde gevşek (default) ve sıkıya başlayın.
Ruby: RSpec Mocks
RSpec'in yerleşik destekle ilgili olarak, doğrulanmış çiftler için (örneğin, arayüze uygun olarak) ve ) kullanım için kullanılan doğrulamalar ve [[Dörtücüler için kullanılanlar için.
Ortak Pitfalls ve Them'dan Nasıl Kaçırmak
Deneyimli geliştiriciler, alay objeleri kullanırken tuzaklara girerler. Farkındalık, masyona yönelik ilk adımdır.
Her şeyi Sight'da dövmek
Bu, beyaz kutu, kırılgan ve yazmak için yavaş olan testlere yol açıyor. Bunun yerine, sadece mimari sınırlarla alay ediyor (örneğin, I/O, üçüncü taraf hizmetleri).
Sert Kodlanmış Geri Değerleri Düşünmeden
Gerçek formatları eşleştirmeden veya format böcekleri maske tipi veya format hatalarıyla geri dönebilirsiniz. Fabrikalar, sahte kütüphaneler veya minimum fikstür dosyaları kullanarak gerçekçi test verileri.
Over-Specing Call Order veya Count
Çağrı siparişi kritik bir gereklilik değildir (örneğin, bir ödeme akışı şarjdan önce doğrulamalıdır), aynı şekilde doğrulamaları gerekir. aynı şekilde, [[ŞUygunluk ve ihmal edilebilir; sadece ayrımı fark ettiğinde kesin sayılabilir.
Dışsal Yolları Doğrulamayı Neglecting to Verify Exceptional Paths
Üretim kodu başarısızlıkları ele almalıdır.DUT'un doğru tepki verdiğini doğru şekilde atmak için alaylar kullanın (örneğin, girişler, yeniden kayıtlar, geri dönüşler). Bu olmadan testler yanlış güven sağlar.
Gelişmiş Teknikler
Temelleri ustaca, bu teknikleri daha karmaşık test senaryolarını işlemek için düşünün.
Partial Mocks (Spies)
Bazen gerçek bir nesne test etmeniz gerekir, ancak Mockito gibi Çerçeveler gerçek bir şekilde bir casus oluşturmanıza izin verir: “Ücretsiz olarak kullanın – gerçek ve simdi davranış karıştırır, bu test niyetini karıştırabilir.
Tartışma: The Argument Matchers Düşünceli
Tartışmalar (örneğin, s.) ► (Dönetici) · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Strict vs. Lenient Mocks
Strict, beklenmedik bir yöntem çağrılsaydı başarısız olur; lenient, yapılandırılmamış aramaları görmezden gelir. Lenient genellikle daha dirençlidir, özellikle refaksiyon sırasında. katı bir alayı kabul ederseniz (örneğin, Mockito'nun katı saçmalıkları), sık sık test güncellemeleri için hazırlıklı olun.
CI/CD ile entegrasyon ve Test Konteynerleri
Mock nesneler ünite testlerinde parlar, ancak dış sistemlerle etkileşimler için sınırlamalar vardır (örneğin, veritabanı, mesaj brokerleri), mantık hataları üzerinde hızlı bir şekilde kullanmak için ünite seviyesindeki testlere karşı (örneğin, bu hibrit yaklaşım, hız ve gerçeklik için test etmek için test etmek.
Bir CI boru hattında, her iş üzerinde birim testleri (kahkahalar ile) çalıştırın; birleşme talepleri veya planlanan yapılar üzerinde entegrasyon testleri çalıştırın.Bu, geliştirici iterasyonunu engellemeden yavaş entegrasyon testleri önlerken, gerçek entegrasyon hatalarını serbest bırakır.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Mock nesneler TDD uygulayıcının cephaneliğinde temel bir araçtır, izole, determinist ve hızlı bir birim testleri sağlar. Bu makalede belirtilen en iyi uygulamalar - onları açıkça ifade etmek, etkileşimler açıkça, aşırı kullanımdan kaçınmak ve bağımlılıklara bağlı kalmak - doğru alaycı bir test seti oluşturmak için sağlam bir temel oluşturur.
Bu alayın son bir şekilde bir anlamı olduğunu unutmayın, son bir amaç da test edilebilir arayüzler aracılığıyla tasarım yapmak ve her beklenen durumda doğru davranan yazılım üretmektir - hataları ve kenar vakaları dahil. Sürekli olarak kodbase gelişimine karşı pratiklerinizi değerlendirmek ve adapte etmek.
Daha fazla okuma için, seçilmiş çerçevenizin resmi belgelerini keşfedin ve Fowler'in vergionomi'yi zihinsel model keskin tutmak için düzenli olarak tekrarlayın.