Твердження корисні для того, щоб розповісти про внутрішній стан програми . Наприклад, що ваші структури даних мають дійсний стан, наприклад, що Time
структура даних не буде містити значення 25:61:61
. Умови, що перевіряються твердженнями:
Передумови, які запевняють, що абонент дотримується свого контракту,
Пост-умови, які запевняють, що замовник зберігає свій контракт, і
Інваріанти, які запевняють, що структура даних завжди містить деяку властивість після повернення функції. Інваріант - це умова, яка є передумовою і постумовою.
Тести одиниць корисні для того, щоб розповісти про зовнішню поведінку модуля . Stack
Після push()
виклику методу у вас може виникнути послідовний стан , але якщо розмір стека не збільшується на три після того, як він буде викликаний втричі, то це помилка. (Наприклад, тривіальний випадок, коли неправильна push()
реалізація перевіряє лише твердження та вихід.)
Строго кажучи, головна відмінність між твердженнями та одиничними тестами полягає в тому, що одиничні тести мають дані тесту (значення для запуску програми), а твердження - ні. Тобто, ви можете виконати тести своїх пристроїв автоматично, тоді як ви не можете сказати те саме для тверджень. Заради цього обговорення я припустив, що ви говорите про виконання програми в контексті тестів функцій вищого порядку (які виконують всю програму і не запускають модулі, як тести на одиницю). Якщо ви не говорите про автоматизовані тести функціонування як про засоби "бачити реальні входи", то явно значення лежить в автоматизації, і, таким чином, виграють одиничні тести. Якщо ви говорите про це в контексті (автоматизованих) тестів функцій, то дивіться нижче.
У тестуванні може спостерігатися певне перекриття. Наприклад, Stack
пост-умова 's може фактично стверджувати, що розмір стека збільшується на одиницю. Але є обмеження в тому, що можна виконати в цьому твердженні: чи слід також перевірити, що верхній елемент - це те, що тільки що було додано?
Для обох мета - підвищення якості. Для одиничного тестування метою є пошук помилок. Щодо тверджень, мета - спростити налагодження, спостерігаючи за недійсними станами програми, як тільки вони виникають.
Зауважте, що жодна методика не підтверджує правильність. Насправді, якщо ви проводите тестування підрозділів з метою перевірити правильність програми, ви, швидше за все, придумаєте нецікавий тест, який, на вашу думку, спрацює. Це психологічний ефект: ви зробите все, що є, щоб досягти своєї мети. Якщо ваша мета - знайти помилок, ваша діяльність відобразить це.
Обидва важливі і мають свої цілі.
[Як остаточне зауваження щодо тверджень. Щоб отримати максимальну цінність, вам потрібно використовувати їх у всіх критичних точках вашої програми, а не в кількох ключових функціях. В іншому випадку початкове джерело проблеми було замасковане і важко виявити без годин налагодження.]
:-)