Я думав, що додам ще чотири випадки, де Debug.Assert може стати правильним вибором.
1) Щось я не бачив тут, це додаткове концептуальне покриття, яке можуть надати Ассорти під час автоматизованого тестування . Як простий приклад:
Коли якийсь абонент вищого рівня модифікується автором, який вважає, що вони розширили область коду для обробки додаткових сценаріїв, в ідеалі (!) Вони напишуть одиничні тести для покриття цієї нової умови. Тоді може виявитися, що повністю інтегрований код спрацює нормально.
Однак насправді введений тонкий недолік, але не виявлений в результатах тестування. У цьому випадку виклик став недетермінованим, і лише це забезпечує очікуваний результат. Або, можливо, це призвело до непоміченої помилки округлення. Або спричинила помилку, яка однаково компенсувалася в інших місцях. Або надано не лише запитуваний доступ, але й додаткові пільги, які не повинні надаватися. І т.д.
На цьому етапі висловлювання Debug.Assert (), що містяться у виклику, у поєднанні з новим випадком (або крайовим регістром), керованим одиничними тестами, можуть надати безцінне повідомлення під час тесту про те, що початкові припущення автора були недійсними, і код не повинен може бути звільнений без додаткового огляду. Свідчення з одиничними тестами є ідеальними партнерами.
2) Крім того, деякі тести просто написати, але дорогоцінні та непотрібні, враховуючи початкові припущення . Наприклад:
Якщо доступ до об'єкта доступний лише з певної захищеної точки входу, чи слід робити додатковий запит до бази даних мережевих прав з кожного методу об'єкта, щоб переконатися, що абонент має дозволи? Напевно ні. Можливо, ідеальне рішення включає кешування чи якесь інше розширення функцій, але дизайн цього не вимагає. Debug.Assert () негайно покаже, коли об’єкт було приєднано до небезпечної точки входу.
3) Далі, в деяких випадках ваш продукт може не мати корисної діагностичної взаємодії для всіх або частини його операцій при розгортанні в режимі випуску . Наприклад:
Припустимо, це вбудований пристрій у режимі реального часу. Викидання винятків та перезапуск, коли він стикається з неправильно сформованим пакетом, є контрпродуктивним. Натомість пристрій може скористатись найкращими зусиллями навіть до точки подачі шуму на виході. Він також може не мати людського інтерфейсу, пристрою реєстрації даних або навіть бути фізично доступним людині взагалі при його розгортанні в режимі випуску, а усвідомлення помилок найкраще забезпечується шляхом оцінки того ж виходу. У цьому випадку ліберальні твердження та ретельне тестування перед випуском є більш цінними, ніж винятки.
4) Нарешті, деякі тести є непотрібними лише тому, що виклик сприймається як надзвичайно надійний . У більшості випадків, чим більше використовується багаторазовий код, тим більше зусиль докладено для того, щоб зробити його надійним. Тому загальним є Виняток для несподіваних параметрів від абонентів, але Assert для несподіваних результатів від callees. Наприклад:
Якщо основна String.Find
операція стверджує, що вона поверне a, -1
коли критерії пошуку не знайдені, ви можете безпечно виконати одну операцію, а не три. Однак, якщо вона фактично повернулася -2
, у вас може бути розумний хід дій. Недоцільно було б замінити більш простий обчислення на той, який тестується окремо на -1
значення, і нерозумно в більшості середовищ випуску засмічувати ваш код тестами, які забезпечують, що основні бібліотеки працюють так, як очікувалося. У цьому випадку ідеали ідеальні.