Як імітувати події, які спричиняють винятки для тестування блоків спробу / лову?


14

Я розумію, як працюють винятки та як їх ловити та обробляти в C #, але як я можу імітувати події, які можуть спричинити виняток, щоб переконатися, що він правильно зафіксований? Наприклад, чи можна запустити додаток у своєрідному тестовому шарі, де можливо імітувати мережеві проблеми, проблеми з базою даних тощо? Винятки за своєю природою здаються важко відтворити, тому важко переконатися, що ваш код може впоратися з ними.

Хоча я в основному розвиваюсь за допомогою C # /. NET / Visual Studio, відповіді або ресурси, що стосуються інших мов, можуть бути корисними.


Інше можливе рішення описано в цій статті MSDN: Тестування ін'єкцій несправностей з TestApi
Giorgi

Відповіді:


13

1) Якщо ви дотримувались моделі введення залежності, ви можете замінити реальну реалізацію певних частин макетами, які б викидали винятки в міру необхідності. Однак це вимагає від вас спочатку розробити додаток певним чином або повністю переробити його.

Подобається:

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

Однак тут у нас виникне проблема, що споживчий код не повинен стосуватися поводження з конкретними винятками з реалізації.

2) Ще один підхід полягає в заміні певних методів викликів на ваші власні обгортки.

Замість:

FileStream fs = File.OpenRead (path);

ти використовуєш:

FileStream fs = File.OpenRead_Test (path);

надаючи власний метод розширення (лише швидка ідея):

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

3

Потрібно подивитися на глузуючі рамки.

За допомогою цього ви використовуєте ін'єкцію залежності для виклику підробленої бази даних (скажімо), а не реальної. Це означає, що ви маєте повний контроль над тим, що повертається за кожен дзвінок.

Потім ви встановлюєте тест, який при виклику просто кидає бажаний виняток:

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

Ваш тест проходить, коли ваш код справляється з цим правильно.


3

Знущання та ін’єкції можуть отримати вас лише поки що і вимагають великих змін у підході в деяких випадках.

Якщо ви не хочете переробляти свою програму, щоб вона відповідала тестувальній структурі, тоді вам дійсно потрібно хост або середовище, підроблені для помилок. Існує багато способів імітувати мережеве сповільнення нашого відключення (навіть тестові інструменти Microsoft мають небагато цього в області веб-тестування). Я мав найкращий успіх у тому, щоб розмістити машини за маршрутизатором, які можуть бути підроблені, щоб змінити імітацію в координації з набором бази даних для створення помилок та сценаріїв для зміни помилок, які створює база даних.

Навіть при тому, якщо ви йдете досить швидко або досить далеко вниз до апаратного забезпечення, виникають помилки, такі як проблеми з одночасністю та затримки збою в записі, які ви майже не зможете імітувати. Іноді доводиться викликати їх у реальному та іншому часі, вам просто доведеться працювати без запобіжної сітки.


Погоджено - у деяких випадках ви не можете дозволити собі накладні витрати від введення залежності, наприклад, у код випуску. Питання не щоденне, але воно може статися.
Steve314
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.