Наиболее распространенным способом разработки тестов является
создание тестового кода вручную. Такой способ создания тестов является
наиболее гибким, однако производительность тестировщиков при
создании тестового кода соизмерима с производительностью
разработчиков при создании кода продукта, а объемы тестового кода
часто бывают в 1-10 раз больше объема самого продукта.
В этом случае запуск тестов осуществляется вручную. Проверку,
прошла ли тестируемая система испытания на заданном тестовом случае,
тестировщик также осуществляет вручную, сравнивая фактические
результаты журнала теста c ожидаемыми результатами, описанными в
спецификации тестового случая.
Функции dll-библиотеки обеспечивают обращение к серверу для
получения информации о состоянии элементов комплекса и возвращают
серверу информацию о функционировании системы. Значит, для
моделирования состояния окружения ( входных данных ) необходимо
создать специальный сервер.
Кроме того, необходимо сохранять получаемую от сервера
информацию о функционировании системы ( выходные данные ) в журнале
(рис. 5.1).
Рис. 5.1.
Система и ее окружение (ручное тестирование)
При разработке тестов был использован следующий подход:
- состояние окружения задается в тесте (входные данные);
- в тесте создается сервер:
- сервер по запросу от dll передает информацию о заданном
состоянии окружения;
- сервер получает от dll информацию о функционировании системы;
- получаемая информация сохраняется в журнале теста.
Подробное описание тестового случая №1
Ознакомление с настоящим пунктом полезно предварить изучением
п. 7, содержащего описание ручного тестирования. Здесь
рассматривается та часть теста на C#, которую вам придется написать
самостоятельно при выполнении заданий. Приведенный пример был
разработан в соответствии со спецификацией тестового случая N1. Для
простоты будем считать, что события происходят последовательно в
строго заданном порядке. Реально наша система представляет собой
многопоточное приложение, поэтому мы не можем это гарантировать.
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");
//Получение сообщения от склада о результатах выполнения команды
//В результате первый подшипник должен быть принят
wait("GetStoreStat"); //опрос статуса склада
wait("GetRollerPar");
//Получение информации о подшипнике с терминала подшипника
wait("GetAxlePar");
//Получение информации об оси с терминала оси
wait("SendStoreCom");
//добавление в очередь команд склада на первое место
//команды GetR (получить из приемника в ячейку)
wait("GetStoreMessage");
//Получение сообщения от склада о результатах выполнения
//команды. В результате второй подшипник должен быть принят
//Задаем новое состояние окружения (входные данные)
RollerPar="1 NewUser Depot1 123456 1 12 1 1";
//статус обмена с терминалом подшипника (1 - нет подшипника)
//и его параметры
AxlePar="0 NewUser Depot1 123456 1 0 12 12";
//статус обмена с терминалом оси (0 - есть ось) и ее параметры
//Получаем информацию о функционировании системы
wait("GetStoreStat"); //опрос статуса склада
wait("GetRollerPar");
//Получение информации о подшипнике с терминала подшипника
wait("GetAxlePar");
//Получение информации об оси с терминала оси
wait("SendStoreCom");//Добавление в очередь команд склада на
последнее место //команды SendR (ячейку на выход)
wait("GetStoreMessage");
//Получение сообщения от склада о результатах выполнения
//команды
//В результате первый подшипник для оси должен быть выдан
wait("SendStoreCom");
//Добавление в очередь команд склада на последнее место
//команды SendR (ячейку на выход)
wait("GetStoreMessage");
//Получение сообщения от склада о результатах выполнения
//команды.
//В результате второй подшипник для оси должен быть выдан
wait("SendStoreCom");
//Добавление в очередь команд склада на последнее место
//команды Term (завершение команд выдачи)
wait("GetStoreMessage");
//Получение сообщения от склада о результатах выполнения
//команды
finish();
}
}
Пример
5.1.
Пример фрагмента теста (вариант 1)
(html,
txt)
При разработке тестов не обязательно дожидаться каждого события,
которое должно происходить в соответствии со случаем использования.
Достаточно вызвать wait для событий, после наступления которых надо
менять состояние окружения. В период ожидания наступления события,
заданного в wait, может происходить любое количество других событий. Все
эти события будут занесены в журнал. При необходимости ждать
не первого, а n-го вызова можно вызывать wait с одним и тем же параметром
n раз (например, в цикле). При таком подходе тест будет гораздо короче,
например приведенный выше тест будет выглядеть следующим образом:
class Test1:Test
{
override public void start()
{
StoreStat="32";//Пришел подшипник
RollerPar="0 NewUser Depot1 123456 1 12 1 1";//его параметры
AxlePar="1 NewUser Depot1 123456 1 0 12 12";//нет оси
CommandStatus="0";//команда успешно принята
StoreMessage="1";//команда успешно выполнена
wait("SendStoreCom");//первый подшипник принят
wait("SendStoreCom");//второй подшипник принят
RollerPar="1 NewUser Depot1 123456 1 12 1 1";
//больше нет подшипников
AxlePar="0 NewUser Depot1 123456 1 0 12 12";//есть ось
wait("SendStoreCom");//выдача подшипника
wait("SendStoreCom");//выдача подшипника
wait("SendStoreCom");//завершение выдачи
finish();}
}
Пример
5.2.
Пример фрагмента теста (вариант 2)
(html,
txt)