Решение... Советы... Windows 10

Тестирование бд. Тестирование баз данных — практические советы Тестирование бд

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

Производительность БД является решающим фактором эффективности управленческих и коммерческих приложений. Если поиск или запись данных выполняется медленно – способность к нормальной работе приложения падает. Существует единственный путь выяснить причину плохой производительности – выполнить количественные измерения и определить, что является причиной проблемы производительности.
Проблемы выявления узких мест производительности баз данных напрямую связаны с метриками, методами измерений производительности и технологией их выполнения. Для крупных корпораций и БД больших объемов проблема определения производительности баз данных имеет еще один очень важный аспект: определения ИТ инфраструктуры для длительной промышленной эксплуатации приложений. Это в итоге приводит к более точному определению первоначальных инвестиций в оборудование и базовое ПО. Так как высокая производительность БД сильно зависит от платформы и оборудования, а они закупаются и эксплуатируются на долгосрочную перспективу.
Наиболее важными метриками измерения производительности БД являются:

  • число транзакций за период времени (различного типа транзакции);
  • число операций в/в (прочитанных строк) на транзакцию и время ее выполнения;
  • число прочитанных строк для каждой таблицы на транзакцию;
  • среднее число операций в/в на транзакцию по диапазонам;
  • операторы SQL высокой рабочей стоимостью времени использования CPU (пользователя, системного)
  • время начала и конца выполнения оператора
  • время выполнения операций сортировки (числа сортировок, числа переполнений сортировок, времени выполнения сортировок), наивысшего использования времени elapsed и наименьшей эффективности использования индексов.

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

Что еще проверять при тестировании БД?

Data mapping

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

ACID свойства транзакций

К ACID свойствам транзакций относятся атомарность, последовательность, изоляция и прочность. В процессе тестирования БД следует проверить эти четыри свойства. Эта область требует более тщательного тестирования, если база данных распределена.

Целостность данных

Учтите, что разные модули приложения (например, экраны и формы) по-разному используют те же данные и выполняют CRUD операции. Поэтому нужно убедиться, что последнее состояние данных отражается везде одинаково. Система должна показывать обновленные значения на всех формах и экранах. Это называется целостностью данных.

Точность реализации бизнес логики

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

Как тестировать базу данных?

Написание SQL запросов

Для того чтобы правильно организовать процесс тестирования БД, тестировщики должны обладать хорошими знаниями SQL и DML (Data Manipulation Language) и иметь ясное представление о внутренней структуре БД. Это самый лучший и надежный способ тестирования БД особенно для приложений с низким и средним уровнем сложности. Но должны быть выполнены две описанные предпосылки. Если приложение является очень сложным, то для тестировщика будет трудно или даже невозможно написать все необходимые SQL-запросы самостоятельно. Поэтому в случае некоторых сложных запросов, тестировщик может обратиться за помощью к разработчику. Данный метод не только даёт уверенность, что тестирование выполнено качественно, но также повышает мастерство написания SQL-запросов.

Просмотр данных в таблицах

Если тестировщик не знает SQL, то он может проверить результат выполнения операции CRUD с помощью графического интерфейса приложения, путем просмотра таблиц (отношений) базы данных. Этот способ проверки БД требует хороших знаний структуры таблиц и может быть немного утомительным и громоздким, особенно когда БД и таблицы имеют большой объем данных. Этот способ проверки БД может быть трудным для тестировщиков, если проверочные данные, находятся в нескольких таблицах.

Помощь разработчика

Тестировщик выполняет любые операции CRUD с графическим интерфейсом и проверяет их результаты путем выполнения соответствующих SQL-запросов, написанных разработчиком. Данный способ не требует ни хороших знаний SQL, ни хорошего знания структуры БД приложения.Метод кажется простым и хорошим выбором для тестирования БД. Но его недостатком является хаос. Что делать, если запрос, написанный разработчиком семантически неверный или не выполняет требования пользователя правильно? В этом случае тестирование не дает никаких гарантий о качестве продукта.

Пример методики тестирования целостности данных БД

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

Цели методики Тестирование методов и процессов доступа к базам данных независимо от UI, так чтобы можно было наблюдать и регистрировать неправильно работающий целевой алгоритм или повреждения данных.
Методика Вызов каждого метода или процесса доступа к базе данных, заполняя каждый из них верными и неверными данными или запросами данных.

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

Оракулы (эвристический механизм, который помогает определить проблему) Наметьте одну или несколько стратегий, которые можно использовать в методике для правильного наблюдения результатов теста. Оракул сочетает элементы и метода, посредством которого можно выполнить наблюдение, и характеристики определенного результата, которые указывают на возможный успех или неудачу. В идеале, оракулы будут выполнять самопроверку, допуская начальную оценку успеха или неудачи автоматизированными тестами. Однако следует учитывать риски, связанные с автоматическим определением результатов.
Необходимые инструменты Для данной методики требуются следующие инструменты:
  • Инструмент автоматизации сценариев тестирования
  • Инструмент создания образов и восстановления базовой конфигурации
  • Инструменты резервного копирования и восстановления
  • Инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)
  • Утилиты и инструменты SQL базы данных
  • Инструменты генерации данных
Критерии успешности Эта методика поддерживает тестирование всех основных методов и процессов доступа к базе данных.
Специальная информация Для тестирования может потребоваться среда разработки DBMS или драйверы для ввода или изменения данных непосредственно в базе данных.

Процессы следует вызывать вручную.

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

Многие примеры модульного тестирования начального и среднего уровня на любом языке программирования предполагают, что с помощью простых тестов можно легко протестировать логику приложения. Для приложений, ориентированных на базы данных, это далеко от реальности. При начале использования, например, WordPress, TYPO3 или Symfony с Doctrine или Propel, вы легко столкнётесь с серьёзными проблемами с PHPUnit: просто потому, что база данных тесно связана с этими библиотеками.

Убедитесь, что у вас PHP-расширение pdo и расширения для баз данных, например pdo_mysql , установлены. В противном приведённые ниже примеры не будут работать.

Вероятно, вам знакома такая ситуация из своей повседневной работы и проектов, когда вы хотите применить свои новые или профессиональные навыки работы с PHPUnit, но у вас возникла одна из следующих проблем:

  1. Метод, который вы хотите протестировать довольно большую операцию JOIN и затем использует полученные данные для вычисления некоторых важных результатов.
  2. В вашей бизнес-логике выполняются целый рад операторов SELECT, INSERT, UPDATE и DELETE.
  3. Вам необходимо настроить тестовые данные (возможно, значительное количество) в более двух таблиц для получения подходящих первоначальных данных для тестируемых методов.

Расширение DbUnit значительно упрощает настройку базы данных для целей тестирования и позволяет проверять содержимое базы данных после выполнения ряда операций.

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

В настоящее время DbUnit поддерживает MySQL, PostgreSQL, Oracle и SQLite. За счёт интеграции в Zend Framework или Doctrine 2 это расширение имеет доступ к другим системам управления баз данных (СУБД), таким как IBM DB2 или Microsoft SQL Server.

Трудности при тестировании баз данных

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

  • Схема и таблицы базы данных
  • Вставка строк, необходимых для теста, в эти таблицы
  • Проверка состояния базы данных после того, как тест был пройден
  • Очистка базы данных для каждого нового теста

Поскольку многие API баз данных, такие как PDO, MySQLi или OCI8, громоздкие в использовании и многословные при написании, выполнение этих шагов вручную может стать настоящим кошмаром.

Тестовый код должен быть как можно более коротким и точным по нескольким причинам:

  • Вы не хотите изменять значительное количество тестового кода при небольших изменений в коде на продакшене.
  • Вы хотите легко читать и понимать тестовый код, даже спустя несколько месяцев после его написания.

Кроме того, вы должны понимать, что база данных по существу является глобальной переменной, вставленной в ваш код. Два теста в вашем тестовом наборе могут работать с одной и той же базой данных, и, возможно, повторно использовать эти данные несколько раз. Неудачи в одном тесте могут легко повлиять на результат последующих тестов, тем самым затрудняя процесс тестирования. Ранее упомянутый этап очистки имеет большое значение для решения проблемы «база данных - глобально введённая переменная».

DbUnit помогает упростить все эти проблемы при тестировании с базой данных элегантным способом.

С чем PHPUnit вам точно не сможет помочь, так это то, что тесты, использующие базу данных, значительно медленнее по сравнению с тестами, которые её не используют. В зависимости от того, насколько велико взаимодействие с базой данных, выполнение ваших тестов может занять значительное количество времени. Однако, если вы храните небольшой объём данных, используемый для каждого теста и пытаетесь протестировать как можно больше кода, который не взаимодействует с базой данных, то на выполнение всех тестов займёт около одной минуту, даже на больших наборов тестов.

Например, набор тестов проекта Doctrine 2 в настоящее время содержит около 1000 тестов, где почти половина из которых использует базу данных и при этом всём выполнение тестов укладывается в 15 секунд, используя базу данных MySQL на стандартом настольном компьютере.

Четыре этапа теста базы данных

В своей книге «Шаблоны тестирования xUnit» (xUnit Test Patterns) Джерард Месарош (Gerard Meszaros) перечисляет четыре этапа (стадии) модульного тестирования:

    Настройка фикстуры

    Выполнение системы тестирования (System Under Test)

    Проверка результата

    Очистка (teardown)

    Что такое фикстура?

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

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

1. Очистка базы данных

Поскольку всегда есть первый тест, который работает с базой данных, вы точно не знаете, есть ли в таблицах уже какие-нибудь данные. PHPUnit выполнит операцию TRUNCATE для всех таблиц, чтобы вернуть их в пустое состояние.

2. Настройка фикстуры

Затем PHPUnit выполнит итерацию по всем указанным строкам фикстуры и вставит их в соответствующие таблицы.

3–5. Запуск теста, проверка результата и очистка

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

В вашем тесте используйте специальное утверждение assertDataSetsEqual() для целей проверки, однако, это совершенно необязательно. Эта возможность будет объяснена в разделе «Утверждения базы данных».

Конфигурация PHPUnit Database TestCase

Обычно при использовании PHPUnit ваши тесты наследуются от PHPUnit\Framework\TestCase следующим образом:

assertSame(2, 1 + 1); } }

Если вы хотите протестировать код, который использует базу данных, установка такого теста будет немного посложнее, потому что вам нужно отнаследоваться от другого абстрактного класса TestCase, требующего реализацию двух абстрактных методов getConnection() и getDataSet() :

createDefaultDBConnection($pdo, ":memory:"); } /** * @return PHPUnit\DbUnit\DataSet\IDataSet */ public function getDataSet() { return $this->createFlatXMLDataSet(dirname(__FILE__)."/_files/guestbook-seed.xml"); } }

Реализация getConnection()

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

В предыдущем примере мы создаём подключение SQLite в памяти и передаём его в метод createDefaultDBConnection , который оборачивает экземпляр PDO и второй параметр (имя базы данных) в очень простой уровень абстракции с базой данных типа PHPUnit\DbUnit\Database\Connection .

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

Реализация getDataSet()

Метод getDataSet() определяет, каким должно быть первоначальное состояние базы данных перед выполнением каждого теста. Состояние базы данных абстрагируется с помощью двух концепций - DataSet и DataTable, которые представлены интерфейсами PHPUnit\DbUnit\DataSet\IDataSet и PHPUnit\DbUnit\DataSet\IDataTable соответственно. В следующем разделе будет подробно описано, как эти концепции работают и в чём их преимущества при использовании их в тестировании базы данных.

Для реализации нам нужно только знать, что метод getDataSet() вызывается только один раз во время setUp() для извлечения набора данных фикстуры и вставки его в базу данных. В этом примере мы используем фабричный метод createFlatXMLDataSet($filename) , который представляет собой набор данных на основе XML-представления.

Как насчёт схемы базы данных (Database Schema, DDL)?

PHPUnit предполагает, что схема база данных со всеми её таблицами, триггерами, последовательностями и представлениями создаётся до запуска теста. Это означает, что вы как разработчик должны убедиться, что ваша база данных правильно настроена перед выполнением набора тестов.

Существует несколько способов достижения этого предусловия для тестирования с базой данных.

  1. Если вы используете базу данных с постоянным соединением (не SQLite в оперативной памяти), вы можете легко настроить базу данных один раз с помощью таких инструментов, как phpMyAdmin для MySQL, и повторно использовать базу данных при каждом запуске теста.
  2. Если вы используете такие библиотеки как Doctrine 2 или Propel , вы можете использовать их API для создания схемы базы данных, который понадобиться всего один раз до запуска тестов. Вы можете использовать возможности первоначальной (bootstrap) загрузки PHPUnit и конфигурации для выполнения этого кода каждый раз при выполнении тестов.

PHPUnit Database TestCase

Из предыдущего примера реализации вы легко можете увидеть, что метод getConnection() довольно статичен и может повторно использован в различных тестовых классов с использованием базы данных. Кроме того, чтобы повысить производительность тестов и снизить накладные расходы, связанные с базой данных, вы можете немного провести рефакторинг кода для создания общего абстрактного класса для тестов вашего приложения, который по-прежнему всё ещё позволяет указать другую фикстуру с данными для каждого теста:

conn === null) { if (self::$pdo === null) { self::$pdo = new PDO("sqlite::memory:"); } $this->conn = $this->createDefaultDBConnection(self::$pdo, ":memory:"); } return $this->conn; } }

Однако это соединение с базой данных жёстко закодировано в соединении PDO. PHPUnit имеет одну удивительную возможность, которая поможет сделать этот тестовый класс ещё более универсальным. Если вы используете XML-конфигурацию, вы можете сделать подключение к базе данных настраиваемым для каждого запуска теста. Сначала давайте создадим файл «phpunit.xml» в тестовом каталоге tests/ приложения со следующим содержимым:

Теперь мы можем изменить тестовый класс, чтобы он выглядел так:

conn === null) { if (self::$pdo === null) { self::$pdo = new PDO($GLOBALS["DB_DSN"], $GLOBALS["DB_USER"], $GLOBALS["DB_PASSWD"]); } $this->conn = $this->createDefaultDBConnection(self::$pdo, $GLOBALS["DB_DBNAME"]); } return $this->conn; } }

Теперь мы можем запустить набор тестов базы данных, используя различные конфигурации из интерфейса командной строки:

$ user@desktop> phpunit --configuration developer-a.xml MyTests/ $ user@desktop> phpunit --configuration developer-b.xml MyTests/

Возможность легко запускать тесты, использующие базу данных, с различными конфигурациями очень важно, если вы ведёте разработку на компьютере разработчика. Если несколько разработчиков выполняют тесты базы данных, используя одно и то же соединение с базой данных, то вы запросто можете столкнуться с неудачами выполнения тестов из-за состояния гонки (race-conditions).

Понимание DataSets и DataTables

Ключевой концепцией расширения базы данных PHPUnit являются DataSets и DataTables. Вы должны попытаться понять эту простую концепцию для освоения тестирования с использованием базы данных с помощью PHPUnit. DataSet и DataTable - это уровни абстракции вокруг строк и столбцов баз данных. Простой API скрывает основное содержимое базы данных в структуре объекта, который также может быть реализован другими источниками, отличными от базы данных.

Эта абстракция необходима для сравнения текущего содержимого базы данных с ожидаемым. Ожидаемое содержимое может быть представлено в виде файлов формата XML, YAML, CSV или массива PHP, например. Интерфейсы DataSet и DataTable позволяют сравнивать эти концептуально разные источники путём эмуляции хранилища реляционных баз данных в семантически подобном подходе.

Рабочий процесс для утверждений базы данных в ваших тестах, таким образом, состоит из трёх простых шагов:

  • Указать одну или более таблиц в базе данных по имени таблицы (фактический набор данных)
  • Указать ожидаемый набор данных в предпочтительном формате (YAML, XML, ..)
  • Проверить утверждение, что оба представления набора данных равны друг другу (эквивалентны).

Утверждения это не единственный вариант использования для DataSet и DataTable в расширении базы данных PHPUnit. Как показано в предыдущем разделе, они также описывают первоначальное содержимое базы данных. Вы вынуждены определять набор данных фикстуры в Database TestCase, который затем используется для:

  • Удаления всех строк из таблиц, указанных в наборе данных.
  • Записи всех строк в таблицы данных в базе данных.

Доступные реализации

Существует три различных типов наборов данных/таблиц данных:

  • DataSets и DataTables на основе файлов
  • DataSet и DataTable на основе запросов
  • Фильтр и объединение DataSets и DataTables

Файловые наборы данных и таблиц обычно используются для первоначальной фикстуры и описывают ожидаемое состояние базы данных.

Flat XML DataSet

Наиболее распространённый набор называется Flat XML. Это очень простой (flat) XML-формат, где тег внутри корневого узла представляет ровно одну строку в базе данных. Имена тегов соответствуют таблице, куда будут добавляться строки (записи), а атрибуты тега представляют столбцы записи. Пример для приложения простой гостевой книги мог бы выглядеть подобным образом:

Это, очевидно, легко писать. В этом примере - имя таблицы, в которую добавляются две строки с четырьмя столбцами «id», «content», «user» и «created» с соответствующими им значениями.

Однако за эту простоту приходиться платить.

Из предыдущего примера неочевидно, как указать пустую таблицу. Вы можете вставить тег без атрибутов с именем пустой таблицы. Тогда такой XML-файл для пустой таблицы гостевой книги будет выглядеть так:

Обработка значений NULL в простых наборах данных XML утомительна. Значение NULL отличается от пустого строкового значения почти в любой базе данных (Oracle - исключение), что трудно описать в обычном формате XML. Вы можете представить значение NULL, опуская атрибут из строки (записи). Если наша гостевая книга разрешает анонимные записи, представленные значением NULL в столбце «user», гипотетическое состояние таблицы гостевой книги может быть таким:

В нашем случае вторая запись добавлена анонимна. Однако это приводит к серьёзной проблеме определения столбцов. Во время утверждений о равенстве данных каждый набор данных должен указывать, какие столбцы хранятся в таблице. Если атрибут указан NULL для всех строк таблицы данных, как расширение базы данных определит, что столбец должен быть частью таблицы?

Обычный набор данных XML делает сейчас решающе важное предположение, объявляя, что атрибуты в первой определённой строке таблицы определяют столбцы этой таблицы. В предыдущем примере это означало бы, что «id», «content“, «user» и «created» будет столбцами таблицы гостевой книги. Для второй строки, где пользователь («user») не определён, в базу данных в столбец «user» будет вставлено значение NULL.

Когда первая запись гостевой книги удаляется из набора данных, только «id», «content» и «created» будут столбцами таблицы гостевой книги, поскольку столбец «user» не определён.

Чтобы эффективно использовать набор данных Flat XML, когда значения NULL имеют важное значение, первая строка каждой таблицы не должна содержать значения NULL, и только последующие строки могут пропускать атрибуты. Это может быть неудобно, поскольку порядок строк является значимым фактором для утверждений базы данных.

В свою очередь, если вы укажете только подмножество столбцов таблицы в наборе данных Flat XML, все пропущенные значения будут установлены в значения по умолчанию. Это приведёт к ошибкам, только если один из пропущенных столбцов определён как «NOT NULL DEFAULT NULL».

В заключение я могу только посоветовать использовать наборы данных Flat XML, только если вам не нужны значения NULL.

Вы можете создать экземпляр обычного набора данных XML внутри Database TestCase, вызвав метод createFlatXmlDataSet($filename) :

createFlatXmlDataSet("myFlatXmlFixture.xml"); } }

XML DataSet

Есть ещё один структурированный набор данных XML, который немного более многословный при записи, но не имеет проблем с NULL-значениями из набора данных Flat XML. Внутри корневого узла вы можете указать теги

, , , и . Эквивалентный набор данных для ранее определённой гостевой книги с использованием Flat XML, будет выглядеть так:

idcontentusercreated 1 Привет, дружище! joe 2010-04-24 17:15:23 2 Мне нравится это! 2010-04-26 12:14:20

Любой определённый тег

имеет имя и требует определение всех столбцов с их именами. Он может содержать ноль или любое положительное число вложенных элементов . Отсутствие элементов ``означает, что таблица пуста. Теги `` и должны быть указаны в порядке, ранее заданных элементов . Тег , очевидно, означает, что значение равно NULL.

Вы можете создать экземпляр набора данных XML внутри Database TestCase, вызвав метод createXmlDataSet($filename) :

createXMLDataSet("myXmlFixture.xml"); } }

MySQL XML DataSet

Этот новый XML-формат специально предназначен для сервера баз данных MySQL . Его поддержка была добавлена в PHPUnit 3.5. Файлы в этом формате могут быть сгенерированы с помощью утилиты mysqldump . В отличие от наборов данных CSV, которые mysqldump также поддерживает, один файл в этом XML-формате может содержать данные для нескольких таблиц. Вы можете создать файл в этом формате, запустив mysqldump следующим образом:

$ mysqldump --xml -t -u --password= > /path/to/file.xml

Этот файл можно использовать в вашем Database TestCase, путём вызова метода createMySQLXMLDataSet($filename) :

createMySQLXMLDataSet("/path/to/file.xml"); } }

YAML DataSet

Кроме того, вы можете использовать набор данных YAML для примера гостевой книги:

guestbook: - id: 1 content: "Привет, дружище!" user: "joe" created: 2010-04-24 17:15:23 - id: 2 content: "Мне нравится это!" user: created: 2010-04-26 12:14:20

Этот формат прост и удобен, а главное он решает проблему с NULL в похожем наборе данных Flat XML. NULL в YAML - это просто имя столбца без указанного значения. Пустая строка указывается таким образом - column1: "" .

В настоящее время набор данных YAML не имеет фабричного метода в Database TestCase, поэтому вам необходимо создать его самим:

CSV DataSet

Ещё один файловый набор данных на основе формата CSV. Каждая таблица набора данных представлена одним CSV-файлом. Для нашего примера с гостевой книгой мы определяем файл guestbook-table.csv:

Id,content,user,created 1,"Привет, дружище!","joe","2010-04-24 17:15:23" 2,"Мне нравится это!","nancy","2010-04-26 12:14:20"

Хотя это очень удобно для редактирования через Excel или OpenOffice, вы не можете указать значения NULL в наборе данных CSV. Пустой столбец приведёт к тому, что в столбец в базе данных будет вставлено пустое значение.

Вы можете создать CSV DataSet следующим образом:

addTable("guestbook", dirname(__FILE__)."/_files/guestbook.csv"); return $dataSet; } }

Array DataSet

В расширении базы данных PHPUnit не существует (пока) массива на основе DataSet, но мы может легко реализовать свой собственный. Пример гостевой книги должен выглядеть так:

[ [ "id" => 1, "content" => "Привет, дружище!", "user" => "joe", "created" => "2010-04-24 17:15:23" ], [ "id" => 2, "content" => "Мне нравится это!", "user" => null, "created" => "2010-04-26 12:14:20" ], ], ]); } }

DataSet PHP имеет очевидные преимущества перед всеми другими наборами данных на основе файлов:

  • Массивы PHP, очевидно, могут обрабатывать значения NULL .
  • Вам не нужны дополнительные файлы для утверждений, и вы можете непосредственно использовать их в TestCase.

Чтобы этот набор выглядел как Flat XML, CSV или YAML, ключи первой указанной строки определяют имена столбцов таблицы, в предыдущем случае это были бы «id», «content», «user» и «created».

Реализация массива DataSet проста и понятна:

$rows) { $columns = ; if (isset($rows)) { $columns = array_keys($rows); } $metaData = new DefaultTableMetaData($tableName, $columns); $table = new DefaultTable($metaData); foreach ($rows as $row) { $table->addRow($row); } $this->tables[$tableName] = $table; } } protected function createIterator($reverse = false) { return new DefaultTableIterator($this->tables, $reverse); } public function getTable($tableName) { if (!isset($this->tables[$tableName])) { throw new InvalidArgumentException("$tableName не является таблицей в текущей базе данных."); } return $this->tables[$tableName]; } }

Query (SQL) DataSet

Для утверждений базы данных вам нужен не только набор данный на основе файлов, но также набор данных на основе запросов (Query)/SQL, содержащий фактическое содержимое базы данных. Здесь показан Query DataSet:

getConnection()); $ds->addTable("guestbook");

Добавление таблицы просто по имени - это неявный способ определения таблицы данных со следующим запросом:

getConnection()); $ds->addTable("guestbook", "SELECT * FROM guestbook");

Вы можете использовать его, указав произвольные запросы для своих таблиц, например, ограничивая количество строк, столбцов или добавление предложение ORDER BY :

getConnection()); $ds->addTable("guestbook", "SELECT id, content FROM guestbook ORDER BY created DESC");

В разделе «Утверждения базы данных» будет приведена подробная информация о том, как использовать Query DataSet.

Database (DB) Dataset

При доступе к тестовому подключению вы можете автоматически создать DataSet, который состоит из всех таблиц с их содержимым в базе данных, указанной в качестве второго параметра, для фабричного метода соединений.

Вы можете либо создать набор данных для полной базы данных, как показано в testGuestbook() , либо ограничится набором указанных имён таблиц с помощью белого списка, как показано в методе testFilteredGuestbook() .

createDefaultDBConnection($pdo, $database); } public function testGuestbook() { $dataSet = $this->getConnection()->createDataSet(); // ... } public function testFilteredGuestbook() { $tableNames = ["guestbook"]; $dataSet = $this->getConnection()->createDataSet($tableNames); // ... } }

Замена DataSet

Я говорил о проблемах с NULL в наборах данных Flat XML и CSV, но есть несколько сложное обходное решение для получения обоих наборов данных, работающих с NULL.

Замена DataSet - декоратор для существующего набора данных, позволяющий заменять значения в любом столбце набора данных другим заменяющим значением. Для получения примера нашей гостевой книги, работающим со значениями NULL, мы указываем файл следующим образом:

Затем мы оборачиваем Flat XML DataSet в Replacement DataSet:

createFlatXmlDataSet("myFlatXmlFixture.xml"); $rds = new PHPUnit\DbUnit\DataSet\ReplacementDataSet($ds); $rds->addFullReplacement("##NULL##", null); return $rds; } }

DataSet Filter

Если у вас большой файл фикстуры, вы можете использовать фильтрацию набора данных для создания белого и чёрного списка таблиц и столбцов, которые должны содержаться поднаборе. Это особенно удобно в сочетании с DB DataSet для фильтрации столбцов набора данных.

getConnection()->createDataSet(); $filterDataSet = new PHPUnit\DbUnit\DataSet\DataSetFilter($dataSet); $filterDataSet->addIncludeTables(["guestbook"]); $filterDataSet->setIncludeColumnsForTable("guestbook", ["id", "content"]); // .. } public function testExcludeFilteredGuestbook() { $tableNames = ["guestbook"]; $dataSet = $this->getConnection()->createDataSet(); $filterDataSet = new PHPUnit\DbUnit\DataSet\DataSetFilter($dataSet); $filterDataSet->addExcludeTables(["foo", "bar", "baz"]); // only keep the guestbook table! $filterDataSet->setExcludeColumnsForTable("guestbook", ["user", "created"]); // .. } }

Вы не можете одновременно использовать исключение и включение фильтрации столбцов на одной и той же таблице, только на разных. Кроме того, это возможно только для таблиц белого или чёрного списка, а не для обоих.

Составной DataSet

Составной DataSet очень полезен для объединения (агрегирования) нескольких уже существующих наборов данных в один набор данных. Когда несколько наборов данных содержат одну и ту же таблицу, строки добавляются в указанном порядке. Например, если у нас есть два набора данных - fixture1.xml :

и fixture2.xml :

Используя составной DataSet, мы можем объединить оба файла фикстуры:

createFlatXmlDataSet("fixture1.xml"); $ds2 = $this->createFlatXmlDataSet("fixture2.xml"); $compositeDs = new PHPUnit\DbUnit\DataSet\CompositeDataSet(); $compositeDs->addDataSet($ds1); $compositeDs->addDataSet($ds2); return $compositeDs; } }

Остерегайтесь внешних ключей

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

Реализация собственного DataSets/DataTables

Для понимания внутренностей DataSets и DataTables, давайте взглянем на интерфейс DataSet. Вы можете пропустить эту часть, если не планируете реализовать собственный DataSet или DataTable.

Общедоступный интерфейс используется внутри утверждения assertDataSetsEqual() в Database TestCase для проверки качества набора данных. Из интерфейса IteratorAggregate IDataSet наследует метод getIterator() для итерации по всем таблицах набора данных. Обратный итератор позволяет PHPUnit очистить строки таблицы, противоположные порядку их создания для удовлетворения ограничений внешнего ключа.

В зависимости от реализации применяются различные подходы для добавления экземпляров таблиц в набор данных. Например, таблицы добавляются внутри структуры во время создания из исходного файла во все файловые наборы данных, таких как YamlDataSet , XmlDataSet или FlatXmlDataSet .

Таблица также представлена следующим интерфейсом:

За исключением метода getTableMetaData() , который говорит сам за себя. Используемые методы необходимы для различных утверждений расширения базы данных, которые поясняются в следующей главе. Метод getTableMetaData() должен возвращать реализацию интерфейса PHPUnit\DbUnit\DataSet\ITableMetaData , который описывает структуру таблицы. В нём содержится следующая информация:

  • Имя таблицы
  • Массив имён столбцов таблицы, упорядоченных по их появлению в результирующем наборе.
  • Массив столбцов первичных ключей.

Этот интерфейс также имеет утверждение, которое проверяет, равны ли два экземпляра табличных метаданных (Table Metadata) друг другу, которое используется утверждением равенства набора данных.

Использование API подключения к базе данных

В интерфейсе Connection есть три интересных метода, которые необходимо вернуть из метода getConnection() в Database TestCase:

  1. Метод createDataSet() создаёт набор данных базы данных (Database (DB) DataSet), как описано в разделе реализации DataSet.
getConnection()->createDataSet(); } }

2. Метод createQueryTable() может использоваться для создания экземпляров QueryTable, передавая им имя результат и SQL-запроса. Это удобный метод, когда дело доходит до утверждений результата/таблицы, как будет показано в следующем разделе «API утверждений базы данных».

getConnection()->createQueryTable("guestbook", "SELECT * FROM guestbook"); } }

3. Метод getRowCount() - это удобный способ получения доступа к количеству строк в таблице, необязательно отфильтрованное дополнительным предложением where. Это можно использовать с простым утверждением равенства:

assertSame(2, $this->getConnection()->getRowCount("guestbook")); } }

API утверждений базы данных

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

Утверждение количество строк таблицы

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

assertSame(2, $this->getConnection()->getRowCount("guestbook"), "Pre-Condition"); $guestbook = new Guestbook(); $guestbook->addEntry("suzy", "Hello world!"); $this->assertSame(3, $this->getConnection()->getRowCount("guestbook"), "Inserting failed"); } }

Утверждение состояния таблицы

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

Для этого нам нужно определить экземпляр таблицы запроса (Query Table), который выводит содержимое по имени таблицы и SQL-запроса и сравнивает его с набором данных на основе файлов/массивов:

addEntry("suzy", "Hello world!"); $queryTable = $this->getConnection()->createQueryTable("guestbook", "SELECT * FROM guestbook"); $expectedTable = $this->createFlatXmlDataSet("expectedBook.xml") ->getTable("guestbook"); $this->

Теперь для этого утверждения мы должны создать обычный XML-файл expectedBook.xml :

Это утверждение будет успешным только в том случае, если оно будет запущено точно в 2010–05–01 21:47:08 . Даты представляют собой особую проблему при тестировании с использованием базы данных, и мы может обойти эту ошибку, опуская столбец «created» в утверждении.

Скорректированный файл Flat XML expectedBook.xml , вероятно, теперь должен выглядеть следующим образом для прохождения утверждения:

Мы должны исправить вызов таблицы запроса (Query Table):

getConnection()->createQueryTable("guestbook", "SELECT id, content, user FROM guestbook");

Утверждение результата запроса

Вы также можете утверждать результат сложных запросов с помощью подхода Query Table, просто указав имя результата с запросом и сравнивая его с набором данным:

getConnection()->createQueryTable("myComplexQuery", "SELECT complexQuery..."); $expectedTable = $this->createFlatXmlDataSet("complexQueryAssertion.xml") ->getTable("myComplexQuery"); $this->assertTablesEqual($expectedTable, $queryTable); } }

Утверждение состояния нескольких таблиц

Конечно, вы можете утверждать состояние одновременно нескольких таблиц и сравнивать запрос набора результата с файловым набором данных. Для утверждений DataSet существует два разных способа.

  1. Вы можете использовать базу данных (Database, DB) DataSet из Connection и сравнить её с набором данных на основе файлов.

getConnection()->createDataSet(["guestbook"]); $expectedDataSet = $this->createFlatXmlDataSet("guestbook.xml"); $this->assertDataSetsEqual($expectedDataSet, $dataSet); } }

2. Вы можете создать DataSet самостоятельно:

    addTable("guestbook", "SELECT id, content, user FROM guestbook"); // additional tables $expectedDataSet = $this->createFlatXmlDataSet("guestbook.xml"); $this->assertDataSetsEqual($expectedDataSet, $dataSet); } }

Часто задаваемые вопросы

Будет ли PHPUnit (повторно) создавать схему базу данных для каждого теста?

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

Тестирование базы данных необходимо для того, чтобы убедиться в работоспособности БД. Для этого составляются запросы в БД различных видов: на выборку, с расчетными полями, параметрические, с группировкой данных, на обновление, на удаление.

Пример запроса: Вывести список книг, взятых конкретным учеником. ФИО задать как параметр.

Пример запроса: Вывести список книг конкретного автора с указанием мест хранения в библиотеке. ФИО автора задать как параметр.

Пример запроса: Определить по номеру читательского билета в каком классе учится соответствующий ученик и кто его классный руководитель.

Рис. 15. Запрос 3. «Найти ученика по №читательского билета и определить в каком классе он учится»

Пример запроса: Определить по ФИО_Ученика в каком классе учится задолжник и кто его классный руководитель.

Для удобства работы с записями различных таблиц была создана, с помощью которой можно открыть любую таблицу, необходимую для просмотра, обновления и изменения информации. Кнопочная форма представлена на рис. 17.

Рис. 17. Кнопочная форма базы данных

ЗАКЛЮЧЕНИЕ

Выпускная квалификационная работа выполнена на актуальную тему «Разработка информационной системы для сельской школьной библиотеки».

Цель дипломного проектирования разработать информационную систему для школьной библиотеки Саратовской области Федоровского района МОУ СОШ п. Солнечный достигнута.

В ходе выполнения дипломного проекта были решены следующие задачи:

Рассмотреть библиотеку как элемент образовательной среды;

Изучить правительственную концепцию поддержки и развития детского чтения;

Проанализированы технологии работы библиотек общеобразовательных учреждений;

Описана предметная область на основе проведенного обследования;

-разработано техническое задание на разработку информационной системы для библиотеки сельской школы;

-построена функциональная модель деятельности школьной библиотеки;

- описание входные и выходные потоки информации;

разработана информационная система на основе СУБД Acc е ss ;

- протестирована разработанная реляционная база данных.

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

На основе ТЗ разработана функциональная модель деятельности сельской школьной библиотеки. Функциональная модель, в свою очередь, послужила материалом для выявления неавтоматизированных участков в работе библиотеки.

Выбор СУБД как среды разработки определялся техническими возможностями сельской библиотеки. В результате на основе СУБД Access построено ядро информационной системы – база данных.

Для удобства работы пользователей разработан кнопочный интерфейс.

Для тестирования базы данных разработаны соответственные запросы. Выполнение этих запросов позволяет судить о нормальной работоспособности информационной системы для сельской школьной библиотеки.

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

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

Цели методики:

Тестирование методов и процессов доступа к базам данных независимо от UI, так чтобы можно было наблюдать и регистрировать неправильно работающий целевой алгоритм или повреждения данных.

Методика:

Вызов каждого метода или процесса доступа к базе данных, заполняя каждый из них верными и неверными данными или запросами данных.

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

Оракулы:
Необходимые инструменты:

утилиты и инструменты SQL базы данных

инструменты генерации данных

Критерии успешности:

Эта методика поддерживает тестирование всех основных методов и процессов доступа к базе данных.

Специальная информация:

Для тестирования может потребоваться среда разработки DBMS или драйверы для ввода или изменения данных непосредственно в базе данных.

Процессы следует вызывать вручную.

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

Тестирование функций

Тестирование функций цели теста следует сосредоточить на требованиях, трассировку которых можно провести непосредственно к вариантам использования или функциям и правилам бизнес-процесса. Целью этих тестов является проверка правильной приемки, обработки и возвращения данных, а также соответствующей реализации правил бизнес-процесса. Этот тип тестирования основан на методиках черного ящика, то есть проверка приложения и его внутренних процессов выполняется путем взаимодействия с приложением с помощью Графического пользовательского интерфейса (GUI) и анализа выводов или результатов. В следующей таблице определяется схема тестирования, рекомендованная для каждого приложения.

Цели методики:

Протестировать функциональность цели тестирования, включая навигацию, ввод, обработку и возврат данных для наблюдения и регистрации целевого алгоритма.

Методика:

Протестировать потоки или функции и функциональные возможности отдельных вариантов использования для каждого сценария вариантов использования, используя допустимые и недопустимые данные, для проверки того, что:

при использовании допустимых данных получаются ожидаемые результаты

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

все правила бизнес-процессов применяются соответствующим образом

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

Инструмент автоматизации сценариев тестирования

инструмент создания образов и восстановления базовой конфигурации

инструменты резервного копирования и восстановления

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

инструменты генерации данных

Критерии успешности:

всех основных сценариев вариантов использования

всех основных функций

Специальная информация:

Определите или опишите те элементы или вопросы (внутренние или внешние), которые влияют на реализацию и выполнение теста функций.

Тестирование цикла бизнес-процесса

Тестирование цикла бизнес-процесса должно эмулировать задачи, выполняемые со временем над <Имя проекта>. Следует определить период, например, один год, а также выполнить транзакции и задачи, которые будут возникать в течение года. Сюда входят все ежедневные, еженедельные и ежемесячные циклы, а также события, зависящие от даты.

Цели методики:

Протестировать процессы цели теста и фоновые процессы согласно требуемым моделям бизнес-процессов и планам для наблюдения и регистрации целевого алгоритма.

Методика:

Тестирование имитирует несколько циклов бизнес-процесса, выполняя следующее:

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

Все зависящие от даты или времени функции будут выполняться с использованием допустимых и недопустимых дат и периодов.

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

В тестировании будут использоваться допустимые и недопустимые данные для проверки следующего:

При использовании допустимых данных получаются ожидаемые результаты.

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

Все правила бизнес-процессов применяются соответствующим образом.

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

Инструмент автоматизации сценариев тестирования

инструмент создания образов и восстановления базовой конфигурации

инструменты резервного копирования и восстановления

инструменты генерации данных

Критерии успешности:

Эта методика поддерживает тестирование всех важнейших циклов бизнес-процесса.

Специальная информация:

Для системных дат и событий могут потребоваться специальные поддерживающие задачи.

Для идентификации соответствующих требований и процедур тестирования требуется модель бизнес-процесса.

Тестирование пользовательского интерфейса

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

Цели методики:

Протестировать следующее с целью наблюдения и регистрации соблюдения стандартов и целевой алгоритм:

Навигацию по цели тестирования, отражающую функции и требования бизнес-процесса, включая методы окно-окно, поле-поле, и применение способов доступа (клавиши табуляции, перемещения мыши, быстрые клавиши).

Можно протестировать объекты и характеристики окон - такие как меню, размер, расположение, состояние и фокусировка.

Методика:

Создание или изменение тестов для каждого окна для проверки правильной навигации и состояний объектов для каждого окна и объекта приложения.

Оракулы:

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

Необходимые инструменты:

Для этой методики требуется инструмент автоматизации сценариев тестирования.

Критерии успешности:

Эта методика поддерживает тестирование каждого главного экрана или окна, которое будет широко использоваться пользователями.

Специальная информация:

Возможен доступ не ко всем свойствам пользовательских объектов и объектов других фирм.

Профилирование производительности

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

Примечание : Транзакции, приведенные в следующей таблице, относятся к "логическим транзакциям бизнес-процесса". Эти транзакции определяются как конкретные варианты использования, которые, как ожидается, будет выполнять субъект, используя цель тестирования, например, добавление или изменение данного договора.

Цели методики:

Протестировать алгоритмы для указанных функциональных транзакций или функций бизнес-процесса в следующих условиях для наблюдения и регистрации целевого алгоритма и данных производительности приложения:

Методика:

Применение процедур тестирования, разработанных для тестирования функций и циклов бизнес-процесса.

Изменение файлов данных для увеличения числа транзакций или сценариев с целью увеличения числа итераций, выполняемых в каждой транзакции.

Сценарии следует выполнять в одной системе (наилучший вариант - взять за основу одного пользователя, одну транзакцию) и повторять с несколькими клиентами (виртуальными или фактическими, см. приведенную ниже специальную информацию).

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

Инструмент автоматизации сценариев тестирования

инструмент профилирования производительности приложения, например, Rational Quantify

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

Критерии успешности:

Эта методика поддерживает тестирование:

Одиночной транзакции или одиночного пользователя: Успешная эмуляция сценариев транзакции без сбоев из-за неполадок реализации теста.

Нескольких транзакций или нескольких пользователей: Успешная эмуляция рабочей нагрузки без сбоев из-за неполадок реализации теста.

Специальная информация:

Всестороннее тестирование производительности включает наличие фоновой нагрузки на сервер.

Существует несколько методов, которые можно использовать, включая следующие:

"Доставка транзакций" непосредственно на сервер, обычно в форме вызовов языка структурных запросов (SQL).

Создание нагрузки "виртуального" пользователя для имитации нескольких клиентов, обычно - нескольких сотен. Для достижения такой нагрузки применяются инструменты эмуляции удаленного терминала. Эту методику также можно использовать для загрузки сети "потоком данных".

Для создания нагрузки на систему использование нескольких физических клиентов, каждый из которых выполняет сценарии тестирования.

Тестирование производительности следует выполнять в выделенной системе либо в выделенное время. Это обеспечивает полное управление и точные измерения.

Базы данных, применяемые для тестирования производительности, должны либо иметь фактический размер, либо их масштаб должен быть изменен одинаково.

Тестирование нагрузки

Тестирование нагрузки представляет собой тест производительности, в котором цель теста подвергается различным рабочим нагрузкам для измерения и оценки алгоритмов производительности и способности цели тестирования продолжать функционировать соответствующим образом при различным рабочих нагрузках. Целью тестирования нагрузки является определение и гарантия того, что система будет работать правильно при воздействии ожидаемой максимальной рабочей нагрузки. Кроме этого, в тестировании нагрузки выполняется оценка параметров производительности, таких как время ответа, скорости транзакций и других связанных со временем параметров.

Примечание : Транзакции, приведенные в следующей таблице, относятся к "логическим транзакциям бизнес-процесса". Эти транзакции определяются как конкретные функции, которые, как ожидается, будет выполнять пользователь, используя приложение, например, добавление или изменение данного договора.

Цели методики:

Выполнение обозначенных транзакций или вариантов бизнес-процесса в различных условиях рабочей нагрузки с целью наблюдения и регистрации целевого алгоритма и данных производительности системы.

Методика:

Применение в качестве основы сценариев тестов транзакций, разработанных для тестирования функций и циклов бизнес-процесса, однако необходимо удалить ненужные итерации и задержки.

Изменение файлов данных для увеличения числа транзакций или тестов с целью увеличения числа выполнений каждой транзакции.

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

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

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

Рабочие нагрузки следует протестировать в различных конфигурациях тестовой среды.

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

Инструмент автоматизации сценариев тестирования

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

инструменты, ограничивающие ресурсы; например, Canned Heat

инструменты генерации данных

Критерии успешности:

Эта методика поддерживает тестирование эмуляции рабочей нагрузки, которая представляет собой успешную эмуляцию рабочей нагрузки без сбоев из-за неполадок реализации теста.

Специальная информация:

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

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

Тестирование напряжений

Тестирование напряжений представляет собой тип теста производительности, реализуемый и выполняемый для того, чтобы понять, как происходит сбой системы в условиях на границе или вне границ ожидаемых допусков. Обычно в нем присутствует недостаток ресурсов или конкуренция за ресурсы. Условия нехватки ресурсов показывают, как происходит сбой цели тестирования, что не является очевидным при обычных условиях. Другие изъяны могут являться результатом конкуренции за общие ресурсы, такие как блокировки базы данных или пропускная способность сети, хотя некоторые из этих тестов обычно выполняются при тестировании функций и нагрузки.

Цели методики:

Протестировать функции цели тестирования в следующих условиях напряжения с целью наблюдения и регистрации целевого алгоритма, который определяет и документирует условия, при которых происходит сбой системы, для того чтобы продолжать работу соответствующим образом:

небольшой объем памяти или отсутствие свободной памяти на сервере (RAM и объем постоянной памяти)

максимально возможное физически или фактически число подключенных или имитируемых пользователей

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

"избыточный" объем транзакций или смесь условий (см. выше раздел Профилирование производительности)

Методика:

Для тестирования ограниченных ресурсов тесты следует выполнять в одной системе, а RAM и объем постоянной памяти на сервере должны быть уменьшены или ограничены.

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

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

Инструмент автоматизации сценариев тестирования

инструмент планирования и управления нагрузкой транзакции

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

инструменты, ограничивающие ресурсы; например, Canned Heat

инструменты генерации данных

Критерии успешности:

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

Специальная информация:

Для создания напряжения на сеть могут потребоваться сетевые инструменты для загрузки сети сообщениями и пакетами.

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

Следует синхронизировать одновременный доступ клиентов к одним и тем же записям данных или учетным записям.

Тестирование емкости

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

Цели методики:

Протестировать функции цели тестирования в следующих сценариях высокой емкости с целью наблюдения и регистрации целевого алгоритма:

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

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

Методика:

Применяются тесты, разработанные для профилирования производительности или тестирования нагрузки.

Следует использовать несколько клиентов, выполняющих одни и те же или дополнительные тесты для создания наихудшего объема транзакций или их смеси (см. тестирование напряжений) на протяжении длительного периода.

Создан максимальный размер базы данных (фактической, в масштабе или заполненной репрезентативными данными), и для выполнения запросов и отчетных транзакций в течение продолжительного периода одновременно используется несколько клиентов.

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

Инструмент автоматизации сценариев тестирования

инструмент планирования и управления нагрузкой транзакции

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

инструменты, ограничивающие ресурсы; например, Canned Heat

инструменты генерации данных

Критерии успешности:

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

Специальная информация:

Тестирование защиты и управления доступом

Тестирование защиты и управления доступом сосредоточено на двух ключевых областях защиты:

Защита на уровне приложения, включая доступ к данным или функциям бизнес-процесса

Защита на уровне системы, включая вход в систему или удаленный доступ к системе

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

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

Цели методики:

Протестировать цель тестирования в следующих условиях с целью наблюдения и регистрации целевого алгоритма:

Защита на уровне приложения: субъект имеет доступ только к тем функциям и данным, для которых пользователь данного типа имеет права доступа.

Защита на уровне системы: доступ к приложениям разрешен только субъектам, имеющим права доступа к системе и приложениям.

Методика:

Защита на уровне приложения: Определить и перечислить все типы пользователей и функции и данные, доступ к которым разрешен пользователям каждого типа.

Создание тестов для каждого типа пользователей и проверка всех прав доступа путем создания транзакций, определенных для каждого типа пользователей.

Изменение типа пользователей и перезапуск тестов для этих же пользователей. В каждом случае - проверка того, что правильно разрешен или отклонен доступ к дополнительным функциям или данным.

Доступ на уровне системы: См. приведенную ниже Специальную информацию.

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

Инструмент автоматизации сценариев тестирования

"Хакерские" инструменты тестирования и поиска брешей в защите

Инструменты администрирования защиты ОС

Критерии успешности:

Эта методика поддерживает тестирование соответствующих функций и данных, на которые влияют параметры защиты, для каждого известного типа пользователей.

Специальная информация:

Доступ к системе должен проверяться и обсуждаться с администраторами соответствующих систем или сетей. Это тестирование может не являться необходимым, поскольку может входить в функции администрирования сетей или систем.

Тестирование восстановления после сбоев

Тестирование восстановления после сбоев позволяет убедиться, что цель тестирования может быть успешно восстановлена после различных сбоев аппаратного и программного обеспечения и сети с обширной потерей данных или целостности данных.

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

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

Цели методики:

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

прерывание питания в системе клиента

прерывание питания в системе сервера

прерывание соединения через сетевые серверы

прерывание соединения или потеря питания DASD (устройств прямого доступа к памяти) и контроллеров DASD

незавершенные циклы (прерывание процессов фильтрации данных, прерывание процессов синхронизации данных)

недопустимые указатели и ключи базы данных

недопустимые или поврежденные элементы данных в базе данных

Методика:

В качестве основы для создания серий транзакций для поддержки тестирования восстановления можно использовать тесты, уже созданные для тестирования функций и циклов бизнес-процесса. В первую очередь следует определить тесты успешности восстановления.

Прерывание питания в системе клиента: выключение питания ПК.

Прерывание питания в системе сервера: имитация или инициирование выключения питания процедур для сервера.

Прерывание через сетевые серверы: имитация или инициирование потери соединения с сетью (физическое отключение соединительных проводов или выключение питания сетевых серверов или маршрутизаторов).

Прерывание соединения или потеря питания DASD и контроллеров DASD: моделирование или физическое устранение соединения с одним или несколькими DASD или контроллерами DASD.

При достижении указанных выше условий или смоделированных условий следует выполнить дополнительные транзакции, и при достижении этого второго этапа тестирования следует вызвать процедуры восстановления.

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

Для тестирования следующих условий требуется достижение известного состояния базы данных. Несколько полей, указателей и ключей баз данных следует повредить вручную и непосредственно в базе данных (с помощью инструментов баз данных). Следует выполнить дополнительные транзакции, используя тесты из тестирования функций приложения и циклов бизнес-процесса и полностью завершенные циклы.

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

инструмент создания образов и восстановления базовой конфигурации

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

инструменты резервного копирования и восстановления

Критерии успешности:

Эта методика поддерживает тестирование:

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

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

Специальная информация:

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

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

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

Тестирование конфигурации

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

Цели методики:

Проверка цели тестирования в требуемых конфигурациях аппаратного и программного обеспечения с целью наблюдения и регистрации целевого алгоритма в различных конфигурациях и определения различий в состоянии конфигурации.

Методика:

Применение тестов функций.

Открытие и закрытие различного не являющегося целью тестирования связанного программного обеспечения, например, приложений Microsoft® Excel® и Microsoft® Word®, либо как части теста, либо до выполнения теста.

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

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

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

инструмент создания образов и восстановления базовой конфигурации

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

Критерии успешности:

Эта методика поддерживает тестирование одного или нескольких сочетаний целевых элементов теста, выполняемых в ожидаемых поддерживаемых средах разработки.

Специальная информация:

Какое не являющееся целью тестирования программное обеспечение требуется, доступно и к которому имеется доступ на рабочем столе?

Какие приложения обычно используются?

Какими данными оперируют приложения; например, большая электронная таблица, открытая в Excel, или содержащий 100 страниц документ в Word?

В качестве части этого теста следует также задокументировать сеть, сетевые серверы и базы данных систем в целом.

Тестирование установки

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

Цели методики:

Выполнение установки цели тестирования в каждой необходимой конфигурации аппаратного обеспечения при следующих условиях с целью наблюдения и регистрации алгоритма установки и изменений состояния конфигурации:

новая установка: новая система, в которой никогда ранее не устанавливалось <Имя проекта>

обновление: система, в которой ранее было установлено <Имя проекта>, та же версия

обновление версии: система, в которой ранее было установлено <Имя проекта>, более ранняя версия

Методика:

Разработка автоматизированных или выполняемых вручную сценариев для проверки условия целевой системы.

новая: <имя проекта> никогда не устанавливалось

<имя проекта> этой же или более ранней версии уже было установлено

Запуск или выполнение установки.

Применение определенного заранее подмножества сценариев тестирования функций, выполнение транзакций.

Оракулы:

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

Необходимые инструменты:

Для данной методики требуются следующие инструменты:

инструмент создания образов и восстановления базовой конфигурации

инструменты мониторинга установки (реестр, жесткий диск, CPU, память и так далее)

Критерии успешности:

Эта методика поддерживает тестирование установки разработанного продукта в одной или нескольких конфигурациях установки.

Специальная информация:

Какие транзакции <имя проекта> следует выбрать для составления достоверного теста того, что приложение <имя проекта> было установлено успешно, и что не пропущены важные компоненты программного обеспечения?

: Как тестировать и отлаживать базы данных

Автоматическое модульное тестирование (unit test) кода приложения - дело простое и понятное. А как тестировать базу данных? Или приложение, которое работает с базой данных. Ведь база - это не просто программный код, база данных - это объект, сохраняющий своё состояние. И если мы начнём в процессе тестирования изменять данные в базе (а без этого какое же у нас будет тестирование?!), то после каждого теста база будет изменяться. Это может помешать последующим тестам и необратимо испортить базу данных.

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

Алгоритм такой:

  1. открываем транзакцию;
  2. если нужно, выполняем подготовительные действия для тестирования;
  3. выполняем модульный тест (или просто запускаем сценарий, работу которого хотим проверить);
  4. проверяем результат работы сценария;
  5. отменяем транзакцию, возвращая базу данных в исходное состояние.

Даже если в тестируемом коде останутся незакрытые транзакции, внешний ROLLBACK всё равно откатит все изменения корректно.

Хорошо, если нам нужно протестировать SQL-сценарий или хранимую процедуру. А если мы тестируем приложение, которое само подключается к базе, открывая новое соединение? Кроме того, если мы занимаемся отладкой, то нам наверняка захочется посмотреть на базу глазами самого отлаживаемого приложения. Как быть в таком случае?

Не торопитесь сочинять распределённые транзакции, есть более простое решение! Штатными средствами SQL-сервера вы можете открыть транзакцию на одном соединении, а продолжить её на другом.

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

Последовательность действий такова:

Начав транзакцию в отладочном сеансе мы должны узнать её идентификатор. Это уникальная строка, по которой сервер различает транзакции. Этот идентификатор надо каким-то образом передать в тестируемое приложение.

Теперь задача приложения - прежде, чем оно начнёт делать то, что ему положено, привязаться к нашей контрольной транзакции.

Затем приложение начинает работать, в том числе запускать свои хранимые процедуры, открывать свои транзакции, менять режим изоляции... Но наш отладочный сеанс всё это время будет находиться внутри той же транзакции, что и приложение.

Допустим, приложение блокирует таблицу и начинает изменять её содержимое. В этот момент никакие другие соединения заглянуть в заблокированную таблицу не могут. Но только не наш отладочный сеанс! Из него мы можем смотреть на базу точно так же, как это делает приложение, так как SQL-сервер считает, что мы находимся в одной транзакции.

В то время как для всех остальных сеансов действия приложения скрыты блокировками...

Наш отладочный сеанс спокойно проходит сквозь блокировки (сервер думает, что это наши собственные блокировки)!

Или представьте, что приложение начинает работать со своими версиями строк в режиме SNAPSHOT. Как заглянуть в эти версии? Даже это возможно, если вы связаны общей транзакцией!

Не забудьте в конце этого увлекательного процесса откатить контрольную транзакцию. Это можно сделать как из отладочного сеанса (если процесс тестирования завершится нормально), так и из самого приложения (если в нём случится что-то непредвиденное).

Подробнее об этом Вы сможете узнать на курсах