Главная страница
Навигация по странице:

  • 1.1.1

  • 1.1.2 Основные определения

  • 1.1.3 Экономика тестирования

  • 1.1.4 Аксиомы (принципы) тестирования

  • 1.1.5. Вопросы для самоконтроля

  • Основы стандартизации ПОИТ ч4. Руководство для студентов специальности i40 01 01 Программное обеспечение информационных технологий


    Скачать 460 Kb.
    НазваниеРуководство для студентов специальности i40 01 01 Программное обеспечение информационных технологий
    Дата01.07.2022
    Размер460 Kb.
    Формат файлаdoc
    Имя файлаОсновы стандартизации ПОИТ ч4.doc
    ТипРуководство
    #621950
    страница2 из 5
    1   2   3   4   5

    1 Тестирование программного обеспечения



    1.1 Основные понятия тестирования программного обеспечения



    1.1.1 Проблематика тестирования программного обеспечения




    Многие организации, занимающиеся созданием программного обеспечения, до 50% средств, выделенных на разработку программ, тратят на тестирование, что составляет миллиарды долларов по всему миру в целом. И все же, несмотря на громадные капиталовложения, знаний о сути тестирования явно не хватает, и большинство программных продуктов неприемлемо, ненадежно даже после «основательного тестирования».

    О состоянии дел лучше всего свидетельствует тот факт, что большинство людей, работающих в области обработки данных, даже не могут правильно определить понятие «тестирование», и это на самом деле главная причина неудач. Если попросить любого профессионала определить понятие «тестирование» либо открыть (как правило, слишком краткую) главу о тестировании любого учебника программирования, то скорее всего можно встретить такое определение: «Тестирование – процесс, подтверждающий правильность программы и демонстрирующий, что ошибок в программе нет». Основной недостаток подобного определения заключается в том, что оно совершенно неправильно; фактически это почти определение антонима слова «тестирование». Поэтому определение описывает невыполнимую задачу, а так как тестирование зачастую все же выполняется с успехом, по крайней мере, с некоторым успехом, то такое определение логически некорректно.

    Правильное определение тестирования таково: Тестирование – процесс выполнения программы с намерением найти ошибки.

    Тестирование оказывается довольно необычным процессом (вот почему оно и считается трудным), так как это процесс разрушительный. Ведь цель проверяющего (тестовика) – заставить программу сбиться. Он доволен, если это ему удается; если же программа на его тесте не сбивается, он не удовлетворен.

    Невозможно гарантировать отсутствие ошибок в программе; в лучшем случае можно попытаться показать наличие ошибок. Если программа правильно ведет себя для значительного набора тестов, нет оснований утверждать, что в ней нет ошибок; со всей определенностью можно лишь утверждать, что неизвестно, когда эта программа не работает. Конечно, если есть причины считать данный набор тестов способным с большой вероятностью обнаружить все возможные ошибки, то можно говорить о некотором уровне уверенности в правильности программы, устанавливаемой этими тестами.

    О тестировании говорить довольно трудно, поскольку, хотя оно и способствует повышению надежности программного обеспечения, его значение ограничено. Надежность невозможно внести в программу в результате тестирования, она определяется правильностью этапов проектирования. Наилучшее решение проблемы надежности – с самого начала не допускать ошибок в программе. Однако вероятность того, что удастся безупречно спроектировать большую программу, бесконечно мала. Роль тестирования состоит как раз в том, чтобы определить местонахождение немногочисленных ошибок, оставшихся в хорошо спроектированной программе. Попытки с помощью тестирования достичь надежности плохо спроектированной программы совершенно бесплодны.


    1.1.2 Основные определения




    Хотя в тестировании можно выделить несколько различных процессов, такие термины, как «тестирование», «отладка», «доказательство», «контроль» и «испытание», часто используются как синонимы и, к сожалению, для разных людей имеют разный смысл. Нашу классификацию различных форм тестирования мы начнем с того, что дадим эти определения, слегка их дополнив и расширив их список.

    Тестирование (testing) – процесс выполнения программы (или части программы) с намерением (или целью) найти ошибки.

    Доказательство (proof) – попытка найти ошибки в программе безотносительно к внешней для программы среде. Большинство методов доказательства предполагает формулировку утверждений о поведении программы и затем вывод и доказательство математических теорем о правильности программы. Доказательства могут рассматриваться как форма тестирования, хотя они и не предполагают прямого выполнения программы. Многие исследователи считают доказательство альтернативой тестированию – взгляд во многом ошибочный.

    Контроль (verification) – попытка найти ошибки, выполняя программу в тестовой, или моделируемой, среде.

    Испытание (validation) – попытка найти ошибки, выполняя программу в заданной реальной среде.

    Аттестация (certification) – авторитетное подтверждение правильности программы. При тестировании с целью аттестации выполняется сравнение с некоторым заранее определенным стандартом.

    Отладка (debugging) не является разновидностью тестирования. Хотя слова «отладка» и «тестирование» часто используются как синонимы, под ними подразумеваются разные виды деятельности. Тестирование – деятельность, направленная на обнаружение ошибок; отладка направлена на установление точной природы известной ошибки, а затем – на исправление этой ошибки. Эти два вида деятельности связаны – результаты тестирования являются исходными данными для отладки.

    Эти определения представляют один взгляд на тестирование – со стороны среды, на которую оно опирается. Другой ряд определений, приведенный ниже, охватывает вторую сторону тестирования: типы ошибок, которые предполагается обнаружить, и стандарты, с которыми сопоставляются тестируемые программы.

    Тестирование модуля, или автономное тестирование (module testing, unit testing), – контроль отдельного программного модуля, обычно в изолированной среде (т. е. изолированно от всех остальных модулей). Тестирование модуля иногда включает также математическое доказательство.

    Тестирование сопряжений (integration testing) – контроль сопряжений между частями системы (модулями, компонентами, подсистемами).

    Тестирование внешних функций (external function testing) – контроль внешнего поведения системы, определенного внешними спецификациями.

    Комплексное тестирование (system testing) – контроль и/или испытание системы по отношению к исходным целям. Комплексное тестирование является процессом контроля, если оно выполняется в моделируемой среде, и процессом испытания, если выполняется в среде реальной, жизненной.

    Тестирование приемлемости (acceptance testing) – проверка соответствия программы требованиям пользователя.

    Тестирование настройки (installation testing) – проверка соответствия каждого конкретного варианта установки системы с целью выявить любые ошибки, возникшие в процессе настройки системы.


    1.1.3 Экономика тестирования




    Дав такое определение тестированию, необходимо на следующем шаге рассмотреть возможность создания теста, обнаруживающего все ошибки программы. Покажем, что ответ будет отрицательным даже для самых тривиальных программ. В общем случае невозможно обнаружить все ошибки программы. А это в свою очередь порождает экономические проблемы, задачи, связанные с функциями человека в процессе отладки, способы построения тестов.

    Тестирование программы как «черного ящика»

    Одним из способов изучения поставленного вопроса является исследование стратегии тестирования, называемой стратегией «черного ящика», тестированием с управлением по данным или тестированием с управлением по входу–выходу. При использовании этой стратегии программа рассматривается как «черный ящик». Иными словами, такое тестирование имеет целью выяснение обстоятельств, в которых поведение программы не соответствует спецификации. Тестовые же данные используются только в соответствии со спецификацией программы (т. е. без учета знаний о ее внутренней структуре).

    При таком подходе обнаружение всех ошибок в программе является критерием исчерпывающего входного тестирования. Последнее может быть достигнуто, если в качестве тестовых наборов использовать все возможные наборы входных данных. Если такое испытание представляется сложным, то еще сложнее создать исчерпывающий тест для большой программы. Образно говоря, число тестов можно оценить «числом большим, чем бесконечность».

    Построение исчерпывающего входного теста невозможно. Это подтверждается двумя аргументами: во–первых, нельзя создать тест, гарантирующий отсутствие ошибок; во–вторых, разработка таких тестов противоречит экономическим требованиям. Поскольку исчерпывающее тестирование исключается, нашей целью должна стать максимизация результативности капиталовложений в тестирование (иными словами, максимизация числа ошибок, обнаруживаемых одним тестом). Для этого мы можем рассматривать внутреннюю структуру программы и делать некоторые разумные, но, конечно, не обладающие полной гарантией достоверности предположения.

    Стратегия «белого ящика», или стратегия тестирования, управляемого логикой программы, позволяет исследовать внутреннюю структуру программы. В этом случае тестирующий получает тестовые данные путем анализа логики программы (к сожалению, здесь часто не используется спецификация программы).

    Сравним способ построения тестов при данной стратегии с исчерпывающим входным тестированием стратегии «черного ящика». Непосвященному может показаться, что достаточно построить такой набор тестов, в котором каждый оператор исполняется хотя бы один раз; нетрудно показать, что это неверно. Не вдаваясь в детали, укажем лишь, что исчерпывающему входному тестированию может быть поставлено в соответствие исчерпывающее тестирование маршрутов. Подразумевается, что программа проверена полностью, если с помощью тестов удается осуществить выполнение программы по всем возможным маршрутам ее потока (графа) пeредaч управления.

    Последнее утверждение имеет два слабых пункта. Первый из них состоит в том, что число не повторяющих друг друга маршрутов в программе – астрономическое. Второй слабый пункт утверждения заключается в том, что, хотя исчерпывающее тестирование маршрутов является полным тестом и хотя каждый маршрут программы может быть проверен, сама программа будет содержать ошибки. Это объясняется следующим образом. Во–первых, исчерпывающее тестирование маршрутов не может дать гарантии того, что программа соответствует описанию. Например, вместо требуемой программы сортировки по возрастанию случайно была написана программа сортировки по убыванию. В этом случае ценность тестирования маршрутов невелика, поскольку после тестирования в программе окажется одна ошибка, т. е. программа неверна.

    Во–вторых, программа может быть неверной в силу того, что пропущены некоторые маршруты. Исчерпывающее тестирование маршрутов не обнаружит их отсутствия.

    В–третьих, исчерпывающее тестирование маршрутов не может обнаружить ошибок, появление которых зависит от обрабатываемых данных.


    1.1.4 Аксиомы (принципы) тестирования




    Сформулируем основные принципы тестирования.

    Хорош тот тест, для которого высока вероятность обнаружить ошибку.

    Одна из самых сложных проблем при тестировании – решить, когда нужно его закончить.

    Необходимая часть всякого теста – описание ожидаемых выходных данных или результатов.

    Избегайте невоспроизводимых тестов, не тестируйте «с лету».

    Готовьте тесты как для правильных, так и для неправильных входных данных.

    Детально изучите результаты каждого теста.

    По мере того как число ошибок, обнаруженных в некотором компоненте программного обеспечения, увеличивается, растет относительная вероятность существования в нем необнаруженных ошибок.

    Поручайте тестирование самым способным программистам.

    Считайте тестируемость ключевой задачей вашей разработки.

    Проект системы должен быть таким, чтобы каждый модуль подключался к системе только один раз

    Никогда не изменяйте программу, чтобы облегчить ее тестирование.

    Тестирование, как почти всякая другая деятельность, должно начинаться с постановки целей.

    Приведем еще раз три наиболее важных принципа тестирования.

    1 Тестирование – это процесс выполнения программ с целью обнаружения ошибок.

    2 Хорошим считается тест, который имеет высокую вероятность обнаружения еще не выявленной ошибки.

    3 Удачным считается тест, который обнаруживает еще не выявленную ошибку.


    1.1.5. Вопросы для самоконтроля




    1. Подтверждает ли тестирование правильность программы?

    2. Что можно сказать о программе, если она на значительном количестве тестов ведет себя правильно?

    3. Может ли повысить надежность программы процесс тестирования?

    4. Примеры понятий, некорректно используемых как синонимы процесса «тестирования»

    5. Классификация различных форм тестирования по отношению к среде, на которую оно опирается.

    6. Отличия процессов тестирования от отладки.

    7. Отличия процессов контроля от испытания.

    8. Типы ошибок, обнаруживаемые при тестировании.

    9. Как иногда называют тестирование с управлением по данным?

    10. Используется информация о внутренней структуре программы при тестировании на основании стратегии «черного ящика»?

    11. Можно ли построить исчерпывающий входной тест? Почему?

    12. Что, как правило, не учитывает стратегия «белого ящика» при тестировании программы?

    13. Стратегии тестирования.

    14. Плюсы и минусы исчерпывающего тестирования маршрутов.

    15. Основные принципы тестирования.


    1   2   3   4   5


    написать администратору сайта