- •Содержание
- •2.3.1. Основные положения
- •2.3.4. Пример выполнения типового задания
- •2.6.1. Обзор методов упрощения условных выражений
- •1.Цель практических занятий
- •2. Основные положения
- •2.1. Тестирование на основе областей эквивалентности и структурное тестирование
- •2.1.1. Области эквивалентности
- •2.1.2. Структурное тестирование. Тестирование ветвей
- •2.1.3. Пример решения типового задания
- •2.2. Модульное тестирование программного обеспечения
- •2.2.1. Общий порядок тестирования по
- •2.2.2. Порядок тестирования классов
- •2.2.3. Пример выполнения типового задания
- •2.3. Интеграционное тестирование программного обеспечения
- •2.3.1. Основные положения
- •2.3.2. Идентификация взаимодействий
- •2.3.3. Выбор тестовых случаев
- •2.3.4. Пример выполнения типового задания
- •2.4. Рефакторинг программного кода. Составление методов
- •2.4.1. Основные идеи рефакторинга программного кода
- •2.4.2. Составление методов
- •2.4.2.1. Выделение метода (Extract Method)
- •Мотивация
- •Техника
- •Использование локальных переменных
- •2.4.2.2. Встраивание метода (Inline Method)
- •Мотивация
- •2.4.2.3. Встраивание временной переменной (Inline Temp)
- •Мотивация
- •Техника
- •2.4.2.4. Замена временной переменной вызовом метода (Replace Temp with Query)
- •Мотивация
- •Техника
- •2.4.2.5. Введение поясняющей переменной (Introduce Explaining Variable)
- •Мотивация
- •Техника
- •2.4.2.6. Расщепление временной переменной (Split Temporary Variable)
- •Мотивация
- •Техника
- •2.4.2.7. Удаление присваиваний параметрам (Remove Assignments to Parameters)
- •Мотивация
- •Техника
- •2.4.2.8. Замена метода объектом методов (Replace Method with Method Object)
- •Мотивация
- •Техника
- •2.4.2.9. Замещение алгоритма (Substitute Algorithm)
- •Мотивация
- •Техника
- •2.5. Рефакторинг программного кода. Перемещение функций между объектами
- •2.5.1. Обзор методов перемещения функций между объектами
- •2.5.2. Перемещение метода (Move Method)
- •2.5.3. Перемещение поля (Move Field)
- •2.5.4. Выделение класса (Extract Class)
- •2.5.5. Встраивание класса (Inline Class)
- •2.5.6. Сокрытие делегирования (Hide Delegate)
- •2.5.7. Удаление посредника (Remove Middle Man)
- •2.5.8. Введение внешнего метода (Introduce Foreign Method)
- •2.5.9. Введение локального расширения (Introduce Local Extension)
- •2.6. Рефакторинг программного кода. Упрощение условных выражений
- •2.6.1. Обзор методов упрощения условных выражений
- •2.6.2. Декомпозиция условного оператора (Decompose Conditional)
- •Мотивация
- •Техника
- •2.6.3. Консолидация условного выражения (Consolidate Conditional Expression)
- •Мотивация
- •Техника
- •2.6.4. Консолидация дублирующихся условных фрагментов (Consolidate Duplicate Conditional Fragments)
- •Мотивация
- •Техника
- •2.6.5. Удаление управляющего флага (Remove Control Flag)
- •Мотивация
- •Техника
- •2.6.6. Замена вложенных условных операторов граничным оператором (Replace Nested Conditional with Guard Clauses)
- •Мотивация
- •Техника
- •2.6.7. Замена условного оператора полиморфизмом (Replace Conditional with Polymorphism)
- •Мотивация
- •Техника
- •2.6.8. Введение объекта Null (Introduce Null Object)
- •Мотивация
- •Техника
- •3. Варианты заданий и порядок выполнения работы
- •Библиографический список
2.2.3. Пример выполнения типового задания
В качестве примера рассмотрим тестирование класса TCommand следующего вида:
public class TCommand {
public int NameCommand;
public string GetFullName();
}
Спецификация тестового случая должна включать следующие пункты:
1) Название тестируемого класса: TCommand.
2) Название тестового случая: TCommandTest1.
3) Описание тестового случая – словесное описание логики теста с указанием тестовых данных: Тест проверяет правильность работы метода GetFullName() – получения полного названия команды на основе кода команды. В тесте подаются следующие значения кодов команд (входные значения): -1, 1, 2, 4, 6, 20, где -1 – запрещенное значение.
На основе спецификации создадим тестовый драйвер – класс TCommandTester, наследующий функциональность абстрактного класса Tester.
public class Log
{
//Создание лог файла
static private StreamWriter log=new StreamWriter("log.log");
static public void Add(string msg) //Добавление сообщения в лог файл
{
log.WriteLine(msg);
}
static public void Close() //Закрыть лог файл
{
log.Close();
}
}
abstract class Tester
{
protected void LogMessage(string s)
//Добавление сообщения в лог-файл
{
Log.Add(s);
}
}
class TCommandTester:Tester // Тестовый драйвер
{
TCommand OUT;
public TCommandTester()
{
OUT = new TCommand();
Run();
}
private void Run()
{
TCommandTest1();
}
private void TCommandTest1()
{
int[] commands = {-1, 1, 2, 4, 6, 20};
for(int i=0;i<=5;i++)
{
OUT.NameCommand = commands[i];
LogMessage(commands[i].ToString() + " : " + OUT.GetFullName());
}
}
static void Main()
{
TCommandTester CommandTester = new TCommandTester();
Log.Close();
}
}
Класс TCommandTester содержит метод TCommandTest1(), в котором реализована вся функциональность теста. В данном случае для покрытия спецификации достаточно перебрать следующие значения кодов команд: -1, 1, 2, 4, 6, 20, где -1 - запрещенное значение, и получить соответствующие им полное название команды с помощью метода GetFullName(). Пары соответствующих значений заносятся в log-файл для последующей проверки на соответствие спецификации.
Таким образом, для тестирования любого метода класса необходимо:
- Определить, какая часть функциональности метода должна быть протестирована, то есть при каких условиях он должен вызываться. Под условиями здесь понимаются параметры вызова методов, значения полей и свойств объектов, наличие и содержимое используемых файлов и т. д.
- Создать тестовое окружение, обеспечивающее требуемые условия.
- Запустить тестовое окружение на выполнение.
- Обеспечить сохранение результатов в файл для их последующей проверки.
- После завершения выполнения сравнить полученные результаты со спецификацией.
2.3. Интеграционное тестирование программного обеспечения
2.3.1. Основные положения
Основное назначение тестирования взаимодействий состоит в том, чтобы убедиться, что происходит правильный обмен сообщениями между объектами, классы которых уже прошли тестирование в автономном режиме (на модульном уровне тестирования).
Тестирование взаимодействия, или интеграционное тестирование, представляет собой тестирование собранных вместе, взаимодействующих модулей (объектов). В интеграционном тестировании можно объединять разное количество объектов – от двух до всех объектов тестируемой системы. При интеграционном тестировании используется подход «белого ящика». Целью интеграционного тестирования является только проверка правильности взаимодействия объектов, а не проверка правильности функционирования системы в целом.
