Deneme / yakalama bloklarını test etmek için istisnalara neden olan olaylar nasıl simüle edilir?


14

İstisnaların nasıl çalıştığını ve bunları C # 'da yakalayıp nasıl ele alacağımı anlıyorum, ancak doğru bir şekilde yakalandığından emin olmak için bir istisnaya neden olabilecek olayları nasıl taklit edebilirim? Örneğin, ağ sorunlarını, veritabanı sorunlarını vb. Simüle etmenin mümkün olduğu bir tür test yatağında bir uygulama çalıştırmak mümkün müdür? Doğası gereği istisnaların çoğaltılması zor görünüyor, böylece kodunuzun onlarla başa çıkmasını sağlamak zorlaşıyor.

Esas olarak C # /. NET / Visual Studio kullanarak geliştirmeme rağmen, diğer dillerle ilgili cevaplar veya kaynaklar yararlı olabilir.


Başka bir olası çözüm bu MSDN makalesinde açıklanmıştır: TestApi ile Hata Enjeksiyonu Testi
Giorgi

Yanıtlar:


13

1) Bağımlılık enjeksiyon modelini izlediyseniz, belirli parçaların gerçek uygulamalarını, ihtiyaç duyduğunuzda istisnalar atacak olan alaylarla değiştirebilirsiniz. Ancak bu, başvurunuzu başlangıçta belirli bir şekilde tasarlamanızı veya tamamen yeniden yapılandırmanızı gerektirir.

Sevmek:

public class SqlUsersRepository : IUsersRepository
{
    public void RegisterNewUser (User newUser)
    {
        throw new SqlException ("Connection timeout");
    }
}

Ancak burada, tüketici kodunun somut uygulama istisnalarını ele almakla ilgilenmemesi gerektiği sorunu yaşanacaktır.

2) Başka bir yaklaşım, belirli yöntem çağrılarını özel paketlerinizle değiştirmektir.

Onun yerine:

FileStream fs = File.OpenRead (path);

kullan:

FileStream fs = File.OpenRead_Test (path);

özel bir uzantı yöntemi sağlayarak (sadece hızlı bir fikir):

public static FileStream OpenRead_Test (this System.IO.File file, string path)
{
    throw new FileNotFoundException ();
}

3

Alaycı çerçevelere bakmanız gerekir.

Bunlarla gerçek veritabanından ziyade sahte veritabanını çağırmak için bağımlılık enjeksiyonunu kullanırsınız. Bu, her arama için neyin geri gönderileceği üzerinde tam kontrole sahip olduğunuz anlamına gelir.

Daha sonra, çağrıldığında istenen özel durumu atayan bir test ayarladınız:

public void Test1()
{
    throw new NullArgumentException();
}

Kodunuz bunu doğru şekilde işlediğinde testiniz geçer.


3

Alay ve enjeksiyon sizi sadece şimdiye kadar alabilir ve bazı durumlarda yaklaşımda büyük değişiklikler gerektirebilir.

Uygulamanızı bir test çerçevesine uyacak şekilde yeniden tasarlamak istemiyorsanız, gerçekten ihtiyacınız olan şey hatalara yönelik bir ana bilgisayar veya ortamdır. Ağ yavaşlığımızı simüle etmenin birçok yolu vardır (Microsoft test araçlarının bile web test alanında bunun bir kısmı vardır). Ben hatalar üretmek için bir veritabanı seti ile koordinasyon simülasyonları değiştirmek için tahrif edilebilir bir yönlendirici arkasında makineleri koyarak ile en iyi başarı elde ettik ve veritabanının ürettiği hataları değiştirmek için komut dosyaları.

Bununla birlikte, donanıma doğru yeterince hızlı veya yeterince aşağı giderseniz, eşzamanlılık sorunları ve neredeyse simüle edemediğiniz gecikmeli yazma hataları gibi hatalar vardır. Bazen onlara gerçek ve diğer zamanlarda güvenlik ağı olmadan çalışmanız gerekir.


Kabul edildi - bazı durumlarda, örneğin sürüm kodunuzdaki bağımlılık enjeksiyonundan genel masrafları karşılayamazsınız. Günlük bir sorun değil, olabilir.
Steve314
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.