Поскольку
В спецификации тестового случая задано состояние окружения (входные данные) и ожидаемая последовательность событий в системе (ожидаемый результат). После прогона тестового случая мы получаем реальную последовательность событий в системе (,) при заданном состоянии окружения. Сравнивая фактический результат с ожидаемым, можно сделать вывод о том, прошла или не прошла тестируемая система испытание на заданном тестовом случае. В качестве ожидаемого результата будем использовать спецификацию тестового случая, поскольку она определяет, как, для заданного состояния окружения, система должна функционировать.
(рис 4-15) Краткое описание тестируемой системы 'Поступление подшипника на склад'Спецификация тестового случая №1:
Состояние окружения (входные данные - X ):
Статус склада - 32. Пришел подшипник.
Статус обмена с терминалом подшипника (0 - есть подшипник) и его параметры - "Статус=0 Диаметр=12".
Статус обмена с терминалом оси (1 - нет оси) и ее параметры - "Статус=1 Диаметр=12".
"Статус=1 Диаметр=12".
Статус команды - 0. Команда успешно принята.
Сообщение от склада - 1. Команда успешно выполнена.
Ожидаемая последовательность событий (выходные данные – Y):
Система запрашивает статус склада (вызов функции GetStoreStat ) и получает 32
Система запрашивает параметры подшипника (вызов функции GetRollerPar ) и получает Статус = 0 Диаметр=12
Система запрашивает параметры оси (вызов функции GetAxlePar ) и получает Статус = 1 Диаметр=0
Система добавляет в очередь команд склада на последнее место команду SendR (получить из приемника в ячейку) (вызов функции SendStoreCom ) и получает сообщение о том, что команда успешно принята – статус = 0
Система запрашивает склад о результатах выполнения команды (вызов функции GetStoreMessage ) и получает сообщение о том, что команда успешно выполнена - статус = 1
Выходные данные (результаты выполнения Yв) – зафиксированы в журнале теста ()
ВЫЗОВ: GetStoreStat РЕЗУЛЬТАТ: 32 ВЫЗОВ: GetRollerPar РЕЗУЛЬТАТ: Статус = 0 Диаметр = 12 ВЫЗОВ: GetAxlePar РЕЗУЛЬТАТ: Статус = 1 Диаметр = 0 ВЫЗОВ: SendStoreCom РЕЗУЛЬТАТ: 0 ВЫЗОВ: GetStoreMessage РЕЗУЛЬТАТ: 1
Приведенный на примере 7.2 тест был разработан в соответствии со спецификацией тестового случая №1. Детальная спецификация приведена в FS (Практикум, Приложение 1), результаты прогона показаны на примере 7.3.
class Test1:Test {
override public void start()
{
// Задаем состояние окружения
// (входные данные)
StoreStat="32"; //Поступил подшипник
RollerPar="0 NewUser Depot1 123456 1 12 1 1";
// статус обмена с терминалом подшипника
// (0 - есть подшипник) и его параметры
AxlePar="1 NewUser Depot1 123456 1 0 12 12";
// статус обмена с терминалом оси
// (1 - нет оси) и ее параметры
CommandStatus="0";
// команда успешно принята
StoreMessage="1"; // успешно выполнена
// Получаем информацию о функционировании
// системы
wait("GetStoreStat");
//опрос статуса склада
wait("GetRollerPar");
// Получение информации о подшипнике
// с терминала подшипника
wait("GetAxlePar");
// Получение информации об оси
// с терминала оси
wait("SendStoreCom");
// добавление в очередь команд склада
// на первое место команды GetR
// (получить из приемника в ячейку)
wait("GetStoreMessage");
// Получение сообщения от склада о
// результатах выполнения команды
// В результате первый подшипник
// должен быть принят
}
}
class Test1 : public Test {
public:
void start() {
// Задаем состояние окружения
// (входные данные)
// Поступил подшипник
strcpy(StoreStat,"32");
// статус обмена с терминалом подшипника
// (0 - есть подшипник) и его параметры
strcpy(RollerPar, "0 NewUser Depot1 123456 1 12 1 1");
// статус обмена с терминалом оси
// (1 - нет оси) и ее параметры
strcpy(AxlePar, "1 NewUser Depot1 123456 1 0 12 12");
strcpy(CommandStatus,"0");
//команда успешно принята
strcpy(StoreMessage,"1");
//успешно выполнена
// Получаем информацию о
// функционировании системы
wait("GetStoreStat");
//опрос статуса склада
wait("GetRollerPar");
// Получение информации о подшипнике
// с терминала подшипника
wait("GetAxlePar");
// Получение информации об оси
// с терминала оси
wait("SendStoreCom");
// добавление в очередь команд склада
// на первое место команды GetR
// (получить из приемника в ячейку)
wait("GetStoreMessage");
// Получение сообщения от склада о
// результатах выполнения команды
// В результате первый подшипник
// должен быть принят
}
}
После завершения теста следует просмотреть текстовый журнал теста, чтобы выяснить, какая последовательность событий в системе была реально зафиксирована (выходные данные) и сравнить их с ожидаемыми результатами, заданными в спецификации тестового случая1. Пример журнала теста ():
Test started CALL:GetStoreStat 0 RETURN:32 CALL:GetRollerPar RETURN:0 NewUser Depot1 123456 1 12 1 1 CALL:GetAxlePar RETURN:1 NewUser Depot1 123456 1 0 12 12 CALL:SendStoreCom 1 0 0 1 0 0 0 RETURN:0 CALL:GetStoreMessage RETURN:1
Пропуск огромного объема тестов, характерного для этапа
Получив отчет об ошибке, программист анализирует исходный код, находит ошибку, исправляет ее и модульно или интеграционно тестирует результат.
В свою очередь тестировщик, проверяя внесенные программистом изменения, должен:
Например, при тестировании класса TСommandQueue запускаем тесты ():
// Тест проверяет, создается ли объект // типа TCommand и добавляется ли он // в конец очереди. private void TCommandQueueTest1() // Тест проверяет добавление команд // в очередь на указанную позицию. // Также проверяется правильность // удаления команд из очереди. private void TCommandQueueTest2()
// Тест проверяет, создается ли объект // типа TCommand и добавляется ли он // в конец очереди. void TCommandQueueTest1() // Тест проверяет добавление команд // в очередь на указанную позицию. // Также проверяется правильность // удаления команд из очереди. void TCommandQueueTest2()
При этом первый тест выполняется успешно, а второй нет, т.е. команда добавляется в конец очереди команд успешно, а на указанную позицию - нет. Разработчик анализирует код, который реализует тестируемую функциональность:
...
if ((Position<-1)
(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
if ((Position <-1)(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
Анализ показывает, что ошибка заключается в использовании неверного знака сравнения в первой строке фрагмента. Далее программист исправляет ошибку, например следующим образом:
...
if ((Position>=-1)
(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
...
if ((Position>=-1)
(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
Для проверки скорректированного кода хочется пропустить только тест TCommandQueueTest2. Можно убедиться, что тест TCommandQueueTest2 будет выполняться успешно. Однако одной этой проверки недостаточно. Если мы повторим пропуск двух тестов, то при запуске первого теста, TCommandQueueTest1, будет обнаружен новый дефект. Повторный анализ кода показывает, что ветка else не выполняется. Таким образом, исправление в одном месте привело к ошибке в другом, что демонстрирует необходимость проведения полного
В каждом конкретном проекте должны быть определены задачи, ресурсы и технологии для каждого уровня тестирования таким образом, чтобы каждый из типов дефектов, ожидаемых в системе, был "адресован", то есть в общем наборе тестов должны иметься тесты, направленные на выявление дефектов подобного типа. Табл. 4.3 суммирует характеристики свойств модульного, интеграционного и системного уровней тестирования. Задача, которая стоит перед тестировщиками и менеджерами, заключается в оптимальном распределении ресурсов между всеми тремя типами тестирования. Например, перенесение усилий на поиск фиксированного типа дефектов из области системного в область
| Модульное | Интеграционное | Системное | |
|---|---|---|---|
| Типы дефектов | Локальные дефекты, такие как опечатки в реализации алгоритма, неверные операции, логические и математические выражения, циклы, ошибки в использовании локальных ресурсов, рекурсия и т.п. | Интерфейсные дефекты, такие как неверная трактовка параметров и их формат, неверное использование системных ресурсов и средств коммуникации, и т.п. | Отсутствующая или некорректная функциональность, неудобство использования, непредусмотренные данные и их комбинации, непредусмотренные или неподдерживаемые сценарии работы, ошибки совместимости, ошибки пользовательской документации, ошибки переносимости продукта на различные платформы, проблемы производительности, инсталляции и т.п. |
| Необходимость в системе тестирования | Да | Да | Нет (*) |
| Цена разработки системы тестирования | Низкая | Низкая до умеренной | Умеренная до высокой или неприемлемой |
| Цена процесса тестирования, то есть разработки, прогона и анализа тестов | Низкая | Низкая | Высокая |
(*) прямой необходимости в системе тестирования нет, но цена процесса
Поскольку
В спецификации тестового случая задано состояние окружения (входные данные) и ожидаемая последовательность событий в системе (ожидаемый результат). После прогона тестового случая мы получаем реальную последовательность событий в системе (,) при заданном состоянии окружения. Сравнивая фактический результат с ожидаемым, можно сделать вывод о том, прошла или не прошла тестируемая система испытание на заданном тестовом случае. В качестве ожидаемого результата будем использовать спецификацию тестового случая, поскольку она определяет, как, для заданного состояния окружения, система должна функционировать.
(рис 4-15) Краткое описание тестируемой системы 'Поступление подшипника на склад'Спецификация тестового случая №1:
Состояние окружения (входные данные - X ):
Статус склада - 32. Пришел подшипник.
Статус обмена с терминалом подшипника (0 - есть подшипник) и его параметры - "Статус=0 Диаметр=12".
Статус обмена с терминалом оси (1 - нет оси) и ее параметры - "Статус=1 Диаметр=12".
"Статус=1 Диаметр=12".
Статус команды - 0. Команда успешно принята.
Сообщение от склада - 1. Команда успешно выполнена.
Ожидаемая последовательность событий (выходные данные – Y):
Система запрашивает статус склада (вызов функции GetStoreStat ) и получает 32
Система запрашивает параметры подшипника (вызов функции GetRollerPar ) и получает Статус = 0 Диаметр=12
Система запрашивает параметры оси (вызов функции GetAxlePar ) и получает Статус = 1 Диаметр=0
Система добавляет в очередь команд склада на последнее место команду SendR (получить из приемника в ячейку) (вызов функции SendStoreCom ) и получает сообщение о том, что команда успешно принята – статус = 0
Система запрашивает склад о результатах выполнения команды (вызов функции GetStoreMessage ) и получает сообщение о том, что команда успешно выполнена - статус = 1
Выходные данные (результаты выполнения Yв) – зафиксированы в журнале теста ()
ВЫЗОВ: GetStoreStat РЕЗУЛЬТАТ: 32 ВЫЗОВ: GetRollerPar РЕЗУЛЬТАТ: Статус = 0 Диаметр = 12 ВЫЗОВ: GetAxlePar РЕЗУЛЬТАТ: Статус = 1 Диаметр = 0 ВЫЗОВ: SendStoreCom РЕЗУЛЬТАТ: 0 ВЫЗОВ: GetStoreMessage РЕЗУЛЬТАТ: 1
Приведенный на примере 7.2 тест был разработан в соответствии со спецификацией тестового случая №1. Детальная спецификация приведена в FS (Практикум, Приложение 1), результаты прогона показаны на примере 7.3.
class Test1:Test {
override public void start()
{
// Задаем состояние окружения
// (входные данные)
StoreStat="32"; //Поступил подшипник
RollerPar="0 NewUser Depot1 123456 1 12 1 1";
// статус обмена с терминалом подшипника
// (0 - есть подшипник) и его параметры
AxlePar="1 NewUser Depot1 123456 1 0 12 12";
// статус обмена с терминалом оси
// (1 - нет оси) и ее параметры
CommandStatus="0";
// команда успешно принята
StoreMessage="1"; // успешно выполнена
// Получаем информацию о функционировании
// системы
wait("GetStoreStat");
//опрос статуса склада
wait("GetRollerPar");
// Получение информации о подшипнике
// с терминала подшипника
wait("GetAxlePar");
// Получение информации об оси
// с терминала оси
wait("SendStoreCom");
// добавление в очередь команд склада
// на первое место команды GetR
// (получить из приемника в ячейку)
wait("GetStoreMessage");
// Получение сообщения от склада о
// результатах выполнения команды
// В результате первый подшипник
// должен быть принят
}
}
class Test1 : public Test {
public:
void start() {
// Задаем состояние окружения
// (входные данные)
// Поступил подшипник
strcpy(StoreStat,"32");
// статус обмена с терминалом подшипника
// (0 - есть подшипник) и его параметры
strcpy(RollerPar, "0 NewUser Depot1 123456 1 12 1 1");
// статус обмена с терминалом оси
// (1 - нет оси) и ее параметры
strcpy(AxlePar, "1 NewUser Depot1 123456 1 0 12 12");
strcpy(CommandStatus,"0");
//команда успешно принята
strcpy(StoreMessage,"1");
//успешно выполнена
// Получаем информацию о
// функционировании системы
wait("GetStoreStat");
//опрос статуса склада
wait("GetRollerPar");
// Получение информации о подшипнике
// с терминала подшипника
wait("GetAxlePar");
// Получение информации об оси
// с терминала оси
wait("SendStoreCom");
// добавление в очередь команд склада
// на первое место команды GetR
// (получить из приемника в ячейку)
wait("GetStoreMessage");
// Получение сообщения от склада о
// результатах выполнения команды
// В результате первый подшипник
// должен быть принят
}
}
После завершения теста следует просмотреть текстовый журнал теста, чтобы выяснить, какая последовательность событий в системе была реально зафиксирована (выходные данные) и сравнить их с ожидаемыми результатами, заданными в спецификации тестового случая1. Пример журнала теста ():
Test started CALL:GetStoreStat 0 RETURN:32 CALL:GetRollerPar RETURN:0 NewUser Depot1 123456 1 12 1 1 CALL:GetAxlePar RETURN:1 NewUser Depot1 123456 1 0 12 12 CALL:SendStoreCom 1 0 0 1 0 0 0 RETURN:0 CALL:GetStoreMessage RETURN:1
Пропуск огромного объема тестов, характерного для этапа
Получив отчет об ошибке, программист анализирует исходный код, находит ошибку, исправляет ее и модульно или интеграционно тестирует результат.
В свою очередь тестировщик, проверяя внесенные программистом изменения, должен:
Например, при тестировании класса TСommandQueue запускаем тесты ():
// Тест проверяет, создается ли объект // типа TCommand и добавляется ли он // в конец очереди. private void TCommandQueueTest1() // Тест проверяет добавление команд // в очередь на указанную позицию. // Также проверяется правильность // удаления команд из очереди. private void TCommandQueueTest2()
// Тест проверяет, создается ли объект // типа TCommand и добавляется ли он // в конец очереди. void TCommandQueueTest1() // Тест проверяет добавление команд // в очередь на указанную позицию. // Также проверяется правильность // удаления команд из очереди. void TCommandQueueTest2()
При этом первый тест выполняется успешно, а второй нет, т.е. команда добавляется в конец очереди команд успешно, а на указанную позицию - нет. Разработчик анализирует код, который реализует тестируемую функциональность:
...
if ((Position<-1)
(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
if ((Position <-1)(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
Анализ показывает, что ошибка заключается в использовании неверного знака сравнения в первой строке фрагмента. Далее программист исправляет ошибку, например следующим образом:
...
if ((Position>=-1)
(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
...
if ((Position>=-1)
(Position<=this.Items.Count))
{
this.Items.Insert(Position, Command);
}
else
{
if (Position==-1)
{
this.Items.Add(Command);
}
}
Для проверки скорректированного кода хочется пропустить только тест TCommandQueueTest2. Можно убедиться, что тест TCommandQueueTest2 будет выполняться успешно. Однако одной этой проверки недостаточно. Если мы повторим пропуск двух тестов, то при запуске первого теста, TCommandQueueTest1, будет обнаружен новый дефект. Повторный анализ кода показывает, что ветка else не выполняется. Таким образом, исправление в одном месте привело к ошибке в другом, что демонстрирует необходимость проведения полного
В каждом конкретном проекте должны быть определены задачи, ресурсы и технологии для каждого уровня тестирования таким образом, чтобы каждый из типов дефектов, ожидаемых в системе, был "адресован", то есть в общем наборе тестов должны иметься тесты, направленные на выявление дефектов подобного типа. Табл. 4.3 суммирует характеристики свойств модульного, интеграционного и системного уровней тестирования. Задача, которая стоит перед тестировщиками и менеджерами, заключается в оптимальном распределении ресурсов между всеми тремя типами тестирования. Например, перенесение усилий на поиск фиксированного типа дефектов из области системного в область
| Модульное | Интеграционное | Системное | |
|---|---|---|---|
| Типы дефектов | Локальные дефекты, такие как опечатки в реализации алгоритма, неверные операции, логические и математические выражения, циклы, ошибки в использовании локальных ресурсов, рекурсия и т.п. | Интерфейсные дефекты, такие как неверная трактовка параметров и их формат, неверное использование системных ресурсов и средств коммуникации, и т.п. | Отсутствующая или некорректная функциональность, неудобство использования, непредусмотренные данные и их комбинации, непредусмотренные или неподдерживаемые сценарии работы, ошибки совместимости, ошибки пользовательской документации, ошибки переносимости продукта на различные платформы, проблемы производительности, инсталляции и т.п. |
| Необходимость в системе тестирования | Да | Да | Нет (*) |
| Цена разработки системы тестирования | Низкая | Низкая до умеренной | Умеренная до высокой или неприемлемой |
| Цена процесса тестирования, то есть разработки, прогона и анализа тестов | Низкая | Низкая | Высокая |
(*) прямой необходимости в системе тестирования нет, но цена процесса
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.