Случайное тестирование
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2014 г. ) |
Случайное тестирование «черного ящика» — это метод тестирования программного обеспечения , при котором программы тестируются путем генерации случайных независимых входных данных. Результаты вывода сравниваются со спецификациями программного обеспечения, чтобы убедиться, что выходные данные теста пройдены или не пройдены. [1] В случае отсутствия спецификаций используются исключения языка, то есть, если исключение возникает во время выполнения теста, это означает, что в программе есть ошибка, а также используется как способ избежать необъективного тестирования.
История случайного тестирования
[ редактировать ]Случайное тестирование аппаратного обеспечения было впервые исследовано Мелвином Бройером в 1971 году, а первые попытки оценить его эффективность были предприняты Пратимой и Вишвани Агравалом в 1975 году. [2]
В области программного обеспечения Дюран и Нтафос исследовали случайное тестирование в 1984 году. [3]
Использование проверки гипотез в качестве теоретической основы для случайного тестирования было описано Хауденом в книге « Функциональное тестирование и анализ» . Книга также содержала разработку простой формулы для оценки количества тестов n , необходимых для уверенности не менее 1–1/ n в частоте неудач не более 1/n. Формула представляет собой нижнюю границу n log n , которая указывает на большое количество безотказных тестов, необходимых для хотя бы скромной уверенности в умеренной границе частоты отказов. [4]
Обзор
[ редактировать ]Рассмотрим следующую функцию C++:
int myAbs(int x) {
if (x > 0) {
return x;
}
else {
return x; // bug: should be '-x'
}
}
Теперь случайными тестами для этой функции могут быть {123, 36, -35, 48, 0}. Только значение «-35» вызывает ошибку. Если не существует эталонной реализации для проверки результата, ошибка все равно может остаться незамеченной. Однако можно добавить утверждение для проверки результатов, например:
void testAbs(int n) {
for (int i=0; i<n; i++) {
int x = getRandomInput();
int result = myAbs(x);
assert(result >= 0);
}
}
Иногда доступна эталонная реализация, например, при реализации простого алгоритма гораздо более сложным способом для повышения производительности. Например, для проверки реализации алгоритма Шёнхаге-Штрассена можно использовать стандартную операцию «*» над целыми числами:
int getRandomInput() {
// …
}
void testFastMultiplication(int n) {
for (int i=0; i<n; i++) {
long x = getRandomInput();
long y = getRandomInput();
long result = fastMultiplication(x, y);
assert(x * y == result);
}
}
Хотя этот пример ограничен простыми типами (для которых можно использовать простой генератор случайных чисел), инструменты, предназначенные для объектно-ориентированных языков, обычно исследуют программу для тестирования и поиска генераторов (конструкторов или методов, возвращающих объекты этого типа) и вызывают их, используя случайные входные данные (либо сами генерируемые одинаковым способом, либо генерируемые с использованием псевдослучайного генератора, если это возможно). Такие подходы затем поддерживают пул случайно сгенерированных объектов и используют вероятность повторного использования сгенерированного объекта или создания нового. [5]
О случайности
[ редактировать ]Согласно основополагающей статье Д. Гамлета о случайном тестировании
[..] технический, математический смысл «случайного тестирования» относится к явному отсутствию «системности» в выборе тестовых данных, так что между различными тестами нет корреляции. [1]
Сильные и слабые стороны
[ редактировать ]Случайное тестирование ценится за следующие сильные стороны:
- Его использование дешево: не нужно тщательно подходить к тестируемой программе.
- В нем нет никакой предвзятости: в отличие от ручного тестирования, оно не упускает из виду ошибки из-за неуместного доверия к какому-то коду.
- Находить кандидатов на ошибки можно быстро: сеанс тестирования обычно занимает пару минут.
- Если программное обеспечение указано правильно: оно находит настоящие ошибки.
Были описаны следующие недостатки:
- Он находит только базовые ошибки (например, разыменование нулевого указателя ).
- Это ровно настолько точно, насколько точна спецификация, а спецификации обычно неточны.
- Он плохо сравнивается с другими методами поиска ошибок (например, статическим анализом программы ).
- Если при каждом запуске теста случайным образом выбираются разные входные данные, это может создать проблемы для непрерывной интеграции, поскольку одни и те же тесты будут проходить или проваливаться случайным образом. [6]
- Некоторые утверждают, что было бы лучше тщательно охватить все соответствующие случаи с помощью вручную созданных тестов по принципу «белого ящика», чем полагаться на случайность. [6]
- Для достижения умеренного уровня уверенности в умеренной частоте отказов может потребоваться очень большое количество тестов. Например, потребуется 459 безотказных тестов, чтобы иметь не менее 99% уверенности в том, что вероятность неудачи составляет менее 1/100. [4]
Виды выборочного тестирования
[ редактировать ]Что касается ввода
[ редактировать ]- Генерация случайной входной последовательности (т. е. последовательности вызовов методов)
- Случайная последовательность входных данных (иногда называемая стохастическим тестированием) — например, случайная последовательность вызовов методов.
- Случайный выбор данных из существующей базы данных
Управляемый и неуправляемый
[ редактировать ]- ненаправленная генерация случайных тестов - без эвристики для управления поиском
- генерация направленного случайного теста - например, «генерация случайного теста с обратной связью» [7] и «адаптивное случайное тестирование» [8]
Реализации
[ редактировать ]Некоторые инструменты, реализующие случайное тестирование:
- QuickCheck — известный инструмент тестирования, первоначально разработанный для Haskell, но портированный на многие другие языки, который генерирует случайные последовательности вызовов API на основе модели и проверяет свойства системы, которые должны оставаться верными после каждого запуска.
- Randoop — генерирует последовательности вызовов методов и конструкторов для тестируемых классов и создает JUnit . из них тесты
- Simulant — инструмент Clojure , который запускает симуляцию различных агентов (например, пользователей с разными поведенческими профилями) на основе статистической модели их поведения, записывая все действия и результаты в базу данных для последующего изучения и проверки.
- AutoTest — инструмент, интегрированный в EiffelStudio, автоматически тестирующий Eiffel-код с контрактами на основе одноименного исследовательского прототипа. [5] ·
- York Extensible Testing Infrastructure (YETI) — независимый от языка инструмент, предназначенный для различных языков программирования (Java, JML, CoFoJa, .NET, C, Kermeta).
- GramTest — инструмент случайного тестирования на основе грамматики, написанный на Java. Он использует нотацию BNF для указания входных грамматик.
Критика
[ редактировать ]На практике случайное тестирование имеет лишь специализированную нишу, главным образом потому, что эффективный оракул доступен редко, а также из-за трудностей с операционным профилем и генерацией псевдослучайных входных значений. [1]
Тестовый оракул — это инструмент для проверки того, соответствуют ли результаты спецификации программы или нет. Профиль работы — это знания о шаблонах использования программы и, следовательно, о том, какие части являются более важными.
Для языков программирования и платформ, которые имеют контракты (например, Eiffel.NET или различные расширения Java, такие как JML, CoFoJa...), контракты действуют как естественные оракулы, и этот подход успешно применяется. [5] В частности, выборочное тестирование обнаруживает больше ошибок, чем ручные проверки или пользовательские отчеты (хотя и разные). [9]
См. также
[ редактировать ]- Фазз-тестирование — разновидность случайного тестирования, при котором в тестируемую программу вводятся неверные данные.
- Ленивое систематическое модульное тестирование # Систематическое тестирование - систематический способ изучения «всех» вызовов методов, реализованный, например, с помощью Java Path Finder НАСА (который сочетает тестирование с проверкой модели , ограничивая пространство состояний до разумного размера различными способами).
- Ограниченная случайная генерация в SystemVerilog
- Угловой шкаф
- Краевой случай
- Конколическое тестирование
Ссылки
[ редактировать ]- ^ Jump up to: а б с Ричард Гамлет (1994). «Случайное тестирование». В Джоне Дж. Марчиниаке (ред.). Энциклопедия программной инженерии (1-е изд.). Джон Уайли и сыновья. ISBN 978-0471540021 .
- ^ Агравал, П.; Агравал, В.Д. (1 июля 1975 г.). «Вероятностный анализ метода генерации случайных тестов для неизбыточных комбинационных логических сетей». Транзакции IEEE на компьютерах . С-24 (7): 691–695. дои : 10.1109/TC.1975.224289 .
- ^ Дюран, JW; Нтафос, Южная Каролина (1 июля 1984 г.). «Оценка случайного тестирования». Транзакции IEEE по разработке программного обеспечения . СЭ-10 (4): 438–444. дои : 10.1109/TSE.1984.5010257 .
- ^ Jump up to: а б Хауден, Уильям (1987). Функциональное тестирование и анализ программ . Нью-Йорк: МакГроу Хилл. стр. 51–53. ISBN 0-07-030550-1 .
- ^ Jump up to: а б с «АвтоТест – Кафедра программной инженерии» . se.inf.ethz.ch. Проверено 15 ноября 2017 г.
- ^ Jump up to: а б «Разве это плохая практика — генерировать тестовые данные случайным образом?» . stackoverflow.com . Проверено 15 ноября 2017 г.
- ^ Пачеко, Карлос; Шувенду К. Лахири; Майкл Д. Эрнст; Томас Болл (май 2007 г.). «Генерация случайных тестов на основе обратной связи» (PDF) . ICSE '07: Материалы 29-й Международной конференции по программной инженерии : 75–84. ISSN 0270-5257 .
- ^ Тай Чен; Ф.-К. Куо; Р.Г. Меркель; TH Tse (2010), «Адаптивное случайное тестирование: ИСКУССТВО разнообразия тестовых примеров», Journal of Systems and Software , 83 (1): 60–66, doi : 10.1016/j.jss.2009.02.022 , hdl : 10722/ 89054
- ^ Илинка Чупа; Александр Пречнер; Мануэль Ориоль; Андреас Лейтнер; Бертран Мейер (2009). «О количестве и характере неисправностей, выявленных методом выборочной проверки». Тестирование, проверка и надежность программного обеспечения . 21 :3–28. дои : 10.1002/stvr.415 .
Внешние ссылки
[ редактировать ]- Случайное тестирование Андреа Аркури.
- Случайное тестирование, проведенное Ричардом Гамлетом, почетным профессором Портлендского государственного университета; ценный список ресурсов в конце статьи
- Вики-сайт случайного тестирования в Cunningham & Cunningham, Inc.