Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Случайное тестирование - это метод тестирования программного обеспечения методом черного ящика, при котором программы тестируются путем генерации случайных независимых входных данных. Результаты выходных данных сравниваются со спецификациями программного обеспечения, чтобы убедиться, что выходные данные теста пройдены или не пройдены. [1] В случае отсутствия спецификаций используются исключения языка, что означает, что если во время выполнения теста возникает исключение, это означает, что в программе есть ошибка, это также используется как способ избежать предвзятого тестирования.

История случайного тестирования [ править ]

Случайное тестирование оборудования было впервые исследовано Мелвином Брейером в 1971 году, а первоначальная попытка оценить его эффективность была предпринята Пратима и Вишвани Агравал в 1975 году [2].

Что касается программного обеспечения, Duran и Ntafos исследовали случайное тестирование в 1984 году [3].

Использование проверки гипотез в качестве теоретической основы для случайного тестирования было описано Хауденом в книге « Функциональное тестирование и анализ» . В книге также была разработана простая формула для оценки количества тестов n , которые необходимы, чтобы иметь уверенность по крайней мере 1-1 / n в частоте отказов не более 1 / n. Формула представляет собой нижнюю границу n log n , которая указывает на большое количество безотказных тестов, необходимых для того, чтобы иметь хотя бы умеренную уверенность в умеренной границе частоты отказов. [4]

Обзор [ править ]

Рассмотрим следующую функцию C ++:

int  myAbs ( int  x )  {  если  ( x  >  0 )  {  вернуть  x ;  }  else  {  return  x ;  // ошибка: должно быть '-x'  } }

Теперь случайные тесты для этой функции могут быть {123, 36, -35, 48, 0}. Только значение «-35» вызывает ошибку. Если нет эталонной реализации для проверки результата, ошибка все равно может остаться незамеченной. Однако утверждение можно было бы добавить , чтобы проверить результаты, как:

void  testAbs ( int  n )  {  для  ( int  я = 0 ;  я < п ;  я ++ )  {  int  x  =  getRandomInput ();  int  результат  =  myAbs ( x );  assert ( результат  > =  0 );  } }

Эталонная реализация иногда доступна, например, при реализации простого алгоритма гораздо более сложным способом для повышения производительности. Например, чтобы протестировать реализацию алгоритма Шёнхаге – Штрассена , можно использовать стандартную операцию «*» над целыми числами:

int  getRandomInput ()  {  //… }void  testFastMultiplication ( int  n )  {  для  ( int  i = 0 ;  i < n ;  i ++ )  {  long  x  =  getRandomInput ();  длинный  y  =  getRandomInput ();  длинный  результат  =  fastMultiplication ( x ,  y );  assert ( x  *  y  ==  результат );  } }

Хотя этот пример ограничен простыми типами (для которых можно использовать простой генератор случайных чисел), инструменты, ориентированные на объектно-ориентированные языки, обычно исследуют программу, чтобы проверить и найти генераторы (конструкторы или методы, возвращающие объекты этого типа) и вызывают их, используя случайные входные данные (либо сами генерируются таким же образом, либо сгенерированы с использованием псевдослучайного генератора, если это возможно). Такие подходы затем поддерживают пул случайно сгенерированных объектов и используют вероятность либо для повторного использования сгенерированного объекта, либо для создания нового. [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]

См. Также [ править ]

  • Fuzz-тестирование - разновидность случайного тестирования, при котором в тестируемую программу вводятся неверные данные.
  • Ленивое систематическое модульное тестирование # Систематическое тестирование - систематический способ изучения "всех" вызовов методов, реализованный, например, с помощью Java Path Finder НАСА (который сочетает тестирование с проверкой модели , ограничивая пространство состояний до разумного размера различными способами)
  • Ограниченная случайная генерация в SystemVerilog
  • Угловой корпус
  • Пограничный случай
  • Конколическое тестирование

Ссылки [ править ]

  1. ^ a b c Ричард Гамлет (1994). «Случайное тестирование». В Джоне Дж. Марчиниаке (ред.). Энциклопедия программной инженерии (1-е изд.). Джон Вили и сыновья. ISBN 978-0471540021.
  2. ^ Agrawal, P .; Агравал, В.Д. (1 июля 1975 г.). «Вероятностный анализ метода генерации случайных тестов для неизбыточных комбинационных логических сетей». Транзакции IEEE на компьютерах . С-24 (7): 691–695. DOI : 10.1109 / TC.1975.224289 .
  3. ^ Duran, JW; Нтафос, Южная Каролина (1 июля 1984 г.). «Оценка случайного тестирования». IEEE Transactions по разработке программного обеспечения . SE-10 (4): 438–444. DOI : 10.1109 / TSE.1984.5010257 .
  4. ^ a b Хауден, Уильям (1987). Функциональное тестирование и анализ программ . Нью-Йорк: Макгроу Хилл. С. 51–53. ISBN 0-07-030550-1.
  5. ^ a b c "Автотест - кафедра программной инженерии" . se.inf.ethz.ch . Проверено 15 ноября 2017 года . CS1 maint: обескураженный параметр ( ссылка )
  6. ^ a b «Это плохая практика - генерировать тестовые данные случайным образом?» . stackoverflow.com . Проверено 15 ноября 2017 года . CS1 maint: обескураженный параметр ( ссылка )
  7. ^ Пачеко, Карлос; Шувенду К. Лахири; Майкл Д. Эрнст; Томас Болл (май 2007 г.). «Генерация случайных тестов с обратной связью» (PDF) . ICSE '07: Материалы 29-й Международной конференции по программной инженерии : 75–84. ISSN 0270-5257 .  
  8. ^ TY Chen; F.-C. Куо; Р.Г. Меркель; TH - Цзы (2010), "Адаптивное случайное тестирование: Искусство тестового примера разнообразия", журнал систем и программного обеспечения , 83 (1): 60-66, DOI : 10.1016 / j.jss.2009.02.022 , ЛВП : 10722 / 89054
  9. ^ Илинка Чупа; Александр Пречнер; Мануэль Ориоль; Андреас Лейтнер; Бертран Мейер (2009). «О количестве и характере неисправностей, обнаруженных методом выборочной проверки». Тестирование, проверка и надежность программного обеспечения . 21 : 3–28. DOI : 10.1002 / stvr.415 .

Внешние ссылки [ править ]

  • Случайное тестирование Андреа Аркури.
  • Случайное тестирование, проведенное Ричардом Гамлетом, почетным профессором Портлендского государственного университета; ценный список ресурсов в конце статьи
  • Вики-сайт случайного тестирования в Cunningham & Cunningham, Inc.