Долгое время основным способом тестирования было тестирование методом "черного ящика" - программе подавались некоторые данные на вход и проверялись результаты, в надежде найти несоответствия [3]. При этом как именно работает программа считается несущественным. Отметим, что даже при таком подходе необходимо иметь спецификацию программы для того, чтобы было с чем сравнивать результаты.
Этот подход до сих пор является самым распространенным в повседневной практике, но у него есть целый ряд недостатков. Во-первых, таким способом невозможно найти взаимоуничтожающихся ошибок, во-вторых, некоторые ошибки возникают достаточно редко (ошибки работы с памятью) и потому их трудно найти и воспроизвести и т.д.
В связи с этим появились методы тестирования, которые изучают не только внешнее поведение программы, но и ее внутреннее устройство (исходные тексты). Такие методики обобщенно называют тестированием "белого ящика". Назовем некоторых представителей этого класса методик: чтение программ, формальные просмотры программ, инспекции и т.п.). Основной трудностью подобных методов является сложность отслеживания вычислений времени выполнения.
|
|
Внимательное изучение этих методов тестирования показывает, что они дополняют друг друга, то есть различные методы находят разные ошибки. Поэтому наиболее эффективные процессы разработки ПО используют некоторую комбинацию методик "черного ящика" и "белого ящика".
В следующей таблице, заимствованной из книги [8], приводятся показатели минимальной, средней и максимальной эффективности различных методов тестирования. Обратите особое внимание на последнюю строчку, описывающую общую эффективность процесса, использующего все эти методики:
Таблица 4.1
Название методики | Минимальная эффективность | Средняя эффективность | Максимальная эффективность |
Персональные просмотры проектных документов | 15% | 35% | 70% |
Неформальные групповые просмотры | 30% | 40% | 60% |
Формальные просмотры проектных документов | 35% | 55% | 75% |
Формальные инспекции кода | 30% | 60% | 70% |
Моделирование и прототипирование | 35% | 65% | 80% |
Проверка за партой | 20% | 40% | 60% |
Тестирование модулей | 10% | 25% | 50% |
Функциональное тестирование | 20% | 35% | 55% |
Комплексное тестирование | 25% | 45% | 60% |
Тестирование в реальных условиях | 35% | 50% | 65% |
Применение всех перечисленных методик тестирования | 93% | 99% | 99% |
Итак, очевидно, что тестирование максимально эффективно в тех случаях, когда программа проверяется не только путем запуска, но и путем чтения, статических проверок и т.п. Поэтому классическое определение Майерса, приведенное выше, оказывается слишком узким и не охватывающим всех аспектов современного тестирования. В связи с этим мы будем пользоваться другим определением тестирования:
|
|
Определение.
Тестирование - это любая деятельность, направленная на обнаружение ошибок в программном продукте.