Burada ele almamız gereken iki konu var.
Birincisi, tüm testlerinize birim test perspektifinden bakıyorsunuz. Birim testleri son derece değerlidir, ancak tek test türü değildir. Testler aslında çok hızlı birim testlerinden daha az hızlı entegrasyon testlerine ve daha yavaş kabul testlerine kadar birçok farklı katmana ayrılabilir . ( İşlevsel testler gibi daha fazla katman kırılmış olabilir .)
İkincisi, üçüncü taraf kod çağrılarını iş mantığınızla bir araya getirerek, test zorlukları yaratıyor ve muhtemelen kodunuzu daha kırılgan hale getiriyorsunuz.
Birim testleri hızlı olmalı ve sık sık yapılmalıdır. Alaycı bağımlılıklar bu testlerin hızlı çalışmasına yardımcı olur, ancak bağımlılık değişirse ve alaycı değişmezse potansiyel olarak kapsamda delikler açabilir. Testleriniz hala yeşil renkte çalışırken kodunuz kırılabilir. Bazı alay kütüphaneleri, bağımlılığın arayüzü değişirse sizi uyaracak, bazıları değiştiremez.
Entegrasyon testleri ise, üçüncü taraf kütüphaneleri de dahil olmak üzere bileşenler arasındaki etkileşimleri test etmek için tasarlanmıştır. Gerçek nesnenin birlikte nasıl etkileştiğini görmek istediğimizden, alaylar bu test düzeyinde kullanılmamalıdır. Gerçek nesneler kullandığımız için, bu testler daha yavaş olacak ve bunları birim testlerimiz kadar sık çalıştırmayacağız.
Kabul testleri, yazılım gereksinimlerinin karşılandığını test ederek daha da yüksek bir seviyeye bakar. Bu testler, dağıtılacak olan tüm eksiksiz sisteme karşı çalışır. Bir kez daha, alay konusu kullanılmamalıdır.
İnsanların alaylarla ilgili değerli buldukları bir kılavuz, sahip olmadığınız alay türlerini takmamaktır . Amazon, API'yı S3'e sahiptir, böylece altlarında değişmediğinden emin olabilirler. Öte yandan, siz bu güvencelere sahip değilsiniz. Bu nedenle, testlerinizde S3 API'sini alay ederseniz, kodunuz değişebilir ve kırılabilir, testlerinizin hepsi yeşil renkte görünür. Üçüncü taraf kitaplıkları kullanan test kodunu nasıl birimiziz?
Biz bilmiyoruz. Yönergeyi izlersek, sahip olmadığımız nesneleri alay edemeyiz. Ama… doğrudan bağımlılıklarımıza sahipsek, onları alay edebiliriz. Ama nasıl? S3 API için kendi paketleyicimizi oluşturduk. S3 API'sine çok benzeyebiliriz veya ihtiyaçlarımıza daha uygun hale getirebiliriz (tercih edilir). Hatta biraz daha soyut bir söyletebilirim PersistenceService
bir yerine AmazonS3Bucket
. ve , görmek isteyebileceğimiz yöntem türlerine PersistenceService
sahip bir arayüz olabilir (bunlar örnektir, aslında farklı yöntemler isteyebilirsiniz). Şimdi S3 API'sini (diyelim ki a ), arama kodumuzdan uzaklaştırarak uygulayabiliriz .#save(Thing)
#fetch(ThingId)
PersistenceService
S3PersistenceService
Şimdi S3 API'sini çağıran koda. Bu çağrıları bir PersistenceService
nesneye yapılan çağrılarla değiştirmemiz gerekiyor . Nesneye geçmek için bağımlılık enjeksiyonu kullanıyoruz PersistenceService
. Bu önemlidir değil bir istemek için S3PersistenceService
ama istemeye PersistenceService
. Bu, testlerimiz sırasında uygulamayı değiştirmemizi sağlar.
S3 API'sini doğrudan kullanmak için kullanılan tüm kod artık bizimkini kullanıyor PersistenceService
ve S3PersistenceService
şimdi S3 API'sına yapılan tüm çağrıları yapıyor. Testlerimizde, sahip olduğumuzdan alay edebilir PersistenceService
ve kodumuzun doğru çağrıları yaptığından emin olmak için sahte kullanabiliriz. Ama şimdi bu nasıl test edileceğini bırakıyor S3PersistenceService
. Öncekiyle aynı sorunu yaşıyor: harici servisi aramadan birimi test edemiyoruz. Yani… birim testi yapmıyoruz. Biz olabilir S3 API bağımlılıkları dışarı alay, ancak bu bize küçük-to-hiçbir ek güven verecekti. Bunun yerine, daha yüksek bir seviyede test etmeliyiz: entegrasyon testleri.
Bu, kodumuzun bir bölümünü test etmememiz gerektiğini söyleyen biraz rahatsız edici gelebilir, ancak başardıklarımıza bakalım. Biz bir yerde bir kod vardı şimdi birim üzerinden test edilebilir birim testi olamazdı PersistenceService
. Üçüncü taraf kütüphane karışıklığımız tek bir uygulama sınıfıyla sınırlı. Bu sınıf, API'yi kullanmak için gerekli işlevselliği sağlamalıdır, ancak ona bağlı herhangi bir harici iş mantığı yoktur. Bu nedenle, bir kez yazıldıktan sonra, çok kararlı olmalı ve çok fazla değişmemelidir. Kod istikrarlı olduğu için sık çalışmadığımız daha yavaş testlere güvenebiliriz.
Bir sonraki adım entegrasyon testlerini yazmaktır S3PersistenceService
. Bunlar, hızlı birim testlerimizden ayrı olarak çalıştırabilmemiz için ad veya klasörle ayrılmalıdır. Entegrasyon testleri, kod yeterince bilgilendirici ise birim testlerle aynı test çerçevelerini kullanabilir, bu nedenle yeni bir araç öğrenmemize gerek yoktur. Entegrasyon testinin asıl kodu Seçenek 1'iniz için yazacağınız koddur.