Jump to content

Случайное тестирование

Случайное тестирование «черного ящика» — это метод тестирования программного обеспечения , при котором программы тестируются путем генерации случайных независимых входных данных. Результаты вывода сравниваются со спецификациями программного обеспечения, чтобы убедиться, что выходные данные теста пройдены или не пройдены. [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]

См. также

[ редактировать ]
  1. ^ Jump up to: а б с Ричард Гамлет (1994). «Случайное тестирование». В Джоне Дж. Марчиниаке (ред.). Энциклопедия программной инженерии (1-е изд.). Джон Уайли и сыновья. ISBN  978-0471540021 .
  2. ^ Агравал, П.; Агравал, В.Д. (1 июля 1975 г.). «Вероятностный анализ метода генерации случайных тестов для неизбыточных комбинационных логических сетей». Транзакции IEEE на компьютерах . С-24 (7): 691–695. дои : 10.1109/TC.1975.224289 .
  3. ^ Дюран, JW; Нтафос, Южная Каролина (1 июля 1984 г.). «Оценка случайного тестирования». Транзакции IEEE по разработке программного обеспечения . СЭ-10 (4): 438–444. дои : 10.1109/TSE.1984.5010257 .
  4. ^ Jump up to: а б Хауден, Уильям (1987). Функциональное тестирование и анализ программ . Нью-Йорк: МакГроу Хилл. стр. 51–53. ISBN  0-07-030550-1 .
  5. ^ Jump up to: а б с «АвтоТест – Кафедра программной инженерии» . se.inf.ethz.ch. ​Проверено 15 ноября 2017 г.
  6. ^ Jump up to: а б «Разве это плохая практика — генерировать тестовые данные случайным образом?» . stackoverflow.com . Проверено 15 ноября 2017 г.
  7. ^ Пачеко, Карлос; Шувенду К. Лахири; Майкл Д. Эрнст; Томас Болл (май 2007 г.). «Генерация случайных тестов на основе обратной связи» (PDF) . ICSE '07: Материалы 29-й Международной конференции по программной инженерии : 75–84. ISSN   0270-5257 .
  8. ^ Тай Чен; Ф.-К. Куо; Р.Г. Меркель; TH Tse (2010), «Адаптивное случайное тестирование: ИСКУССТВО разнообразия тестовых примеров», Journal of Systems and Software , 83 (1): 60–66, doi : 10.1016/j.jss.2009.02.022 , hdl : 10722/ 89054
  9. ^ Илинка Чупа; Александр Пречнер; Мануэль Ориоль; Андреас Лейтнер; Бертран Мейер (2009). «О количестве и характере неисправностей, выявленных методом выборочной проверки». Тестирование, проверка и надежность программного обеспечения . 21 :3–28. дои : 10.1002/stvr.415 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2629ba26708da8a4a9ba3d1b86607c35__1700567820
URL1:https://arc.ask3.ru/arc/aa/26/35/2629ba26708da8a4a9ba3d1b86607c35.html
Заголовок, (Title) документа по адресу, URL1:
Random testing - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)