Автоматизация процесса тестирования программного обеспечения при использовании тестирования базового пути
Селуков Дмитрий Александрович, студент;
Полевщиков Иван Сергеевич, аспирант, ассистент
Пермский национальный исследовательский политехнический университет
Известно, что тестирование представляет собой один из этапов жизненного цикла разработки программного обеспечения (ПО) и важнейшую составляющую обеспечения качества ПО [1, 2]. Актуальной задачей является поиск подходов к автоматизации процесса тестирования ПО с целью повышения производительности труда за счет снижения временных затрат на выполнение рутинных операций.
Одним из способов тестирования ПО является тестирование базового пути [1, 3-5]. Этот способ тестирования основан на принципе «белого ящика» и дает возможность получить оценку комплексной сложности программы, а затем использовать эту оценку для определения необходимого количества тестовых вариантов. Тестовые варианты разрабатываются для проверки базового множества путей в программе и гарантируют однократное выполнение каждого оператора программы при тестировании.
Рассмотрим пример программы, написанной на языке C#. Протестируем эту программу с использованием способа тестирования базового пути и приведем подход к автоматизации процесса тестирования. Листинг программы (номера операторов показаны в тексте программы с использованием комментариев):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Program1
{
public class Class1
{
public int sumfora = 0; // 1
public int sumforb = 0; // 1
public int sumforc = 0; // 1
public Class1(int a, int b, int c)
{
while (a > b) // 2
{
a -= 3; // 3
if ((a > 0) /*4*/ && (a < 7) /*5*/)
c *= 3; // 6
else // 7
c -= 5; // 7
} // 8
sumfora = a; // 9
sumforb = b; // 9
sumforc = c; // 9
} // 10
}
}
Далее необходимо построить потоковый граф для данной программы (рис. 1).
Рис. 1. Потоковый граф для рассматриваемой задачи
Потоковый граф имеет 4 региона (, , , ), следовательно, цикломатическая сложность равна . Строим независимые пути для потокового графа:
Путь 1: 1-2-9-10.
Путь 2: 1-2-3-4-7-8-2-9-10.
Путь 3: 1-2-3-4-5-7-8-2-9-10.
Путь 4: 1-2-3-4-5-6-8-2-9-10.
Подготавливаем тестовые варианты, инициирующие выполнение каждого пути:
Тестовый вариант для пути 1 (ТВ1):
ИД (исходные данные): Пользователь ввел значение a меньшее чем значение b. Например, пользователь ввел значение a равное 10, b равное 11, с равное 6.
ОЖ.РЕЗ. (ожидаемые результаты): Результатом работы программы для рассматриваемого примера будут следующие значения переменных: а равно 10, b равно 11, с равно 6.
Тестовый вариант для пути 2 (ТВ2):
ИД: Пользователь ввел значение a большее чем значение b, причем a примет значение меньшее или равное 0 при проверке условия для if. Например, пользователь ввел значение a равное 0, b равное -3, с равное 7.
ОЖ.РЕЗ.: Результатом работы программы для рассматриваемого примера будут следующие значения переменных: а равно -3, b равно -3, с равно 2.
Тестовый вариант для пути 3 (ТВ3):
ИД: Пользователь ввел значение a большее чем значение b, причем a примет значение большее или равное 7 при проверке условия для if. Например, пользователь ввел значение a равное 12, b равное 11, с равное 8.
ОЖ.РЕЗ.: Результатом работы программы для рассматриваемого примера будут следующие значения переменных: а равно 9, b равно 11, с равно 3.
Тестовый вариант для пути 4 (ТВ4):
ИД: Пользователь ввел значение a большее чем значение b, причем a одновременно больше нуля и меньше 7. Например, пользователь ввел значение a равное 5, b равное 4, с равное 10.
ОЖ.РЕЗ.: Результатом работы программы для рассматриваемого примера будут следующие значения переменных: а равно 2, b равно 4, с равно 30.
Дальнейший шаг процесса тестирования, а именно сравнение реальных и ожидаемых результатов работы программы можно автоматизировать. Для этого были использованы возможности для написания тестовых вариантов на языке C#, предоставляемые средой программирования MS Visual Studio [6-9].
Код тестовых вариантов для рассматриваемой задачи с комментариями:
using System; // Подключается автоматически при создании тестового проекта
using Microsoft.VisualStudio.TestTools.UnitTesting; // Подключается автоматически при создании тестового проекта
using Program1; // Подключаем сами, для связки с программой, которую будем тестировать
namespace Testforprogram1 // Пространство имен проекта
{
[TestClass] // Главный тестовый класс
public class UnitTest1
{
[TestMethod] // Начало описания тестового метода
public void TestMethod1() // Метод, соответствующий ТВ1
{
Class1 cl = new Class1(10, 11, 6); // Создаем переменную типа Class1, который находится в тестируемой программе, и подаем на вход 3 числа
Assert.AreEqual(10, cl.sumfora); // Вызываем метод AreEqual и передаем в него 2 параметра: первый - это то число, которое должно получиться, а второй - это то, что записала программа в данную переменную. В результате число 10 сравнивается с cl.sumfora и если они совпадают, то возвращается true
Assert.AreEqual(11, cl.sumforb); // Аналогично вышеописанному
Assert.AreEqual(6, cl.sumforc); // Аналогично вышеописанному
}
[TestMethod] // Объявляем о создании следующего тестового метода
public void TestMethod2() // Метод, соответствующий ТВ2
{
Class1 cl = new Class1(0, -3, 7);
Assert.AreEqual(-3, cl.sumfora);
Assert.AreEqual(-3, cl.sumforb);
Assert.AreEqual(2, cl.sumforc);
}
[TestMethod]
public void TestMethod3() // Метод, соответствующий ТВ3
{
Class1 cl = new Class1(12, 11, 8);
Assert.AreEqual(9, cl.sumfora);
Assert.AreEqual(11, cl.sumforb);
Assert.AreEqual(3, cl.sumforc);
}
[TestMethod]
public void TestMethod4()// Метод, соответствующий ТВ4
{
Class1 cl = new Class1(5, 4, 10);
Assert.AreEqual(2, cl.sumfora);
Assert.AreEqual(4, cl.sumforb);
Assert.AreEqual(30, cl.sumforc);
}
}
}
Поскольку данные тестовые методы возвращают только true в случае успешного выполнения теста и false в случае неуспешного выполненного теста, с указанием соответствующей ошибки, то результатами данных тестов может служить соответствующее сообщение об этом. Для рассматриваемой задачи вывод результатов тестирования программы представлен на рис. 2.
Рис. 2. Результаты тестирования программы
Таким образом, предлагаемый подход к автоматизации позволяет повысить эффективность процесса тестирования ПО способом тестирования базового пути за счет уменьшения количества рутинных операций при сравнении реальных и ожидаемых результатов работы программы.
Литература:
- Орлов С.А., Цилькер Б.Я. Технологии разработки программного обеспечения: Учебник для вузов. 4-е изд. Стандарт третьего поколения. СПб.: Питер, 2012. 608 с.
- Темичев А.А., Файзрахманов Р.А.. Подбор параметров нагрузочного тестирования систем мониторинга с использованием нечеткой логики // Инженерный вестник Дона. 2015. №3. URL: ivdon.ru/ru/magazine/archive/n3y2015/3153.
- Полевщиков И.С. Разработка методического пособия на тему «Тестирование базового пути» (для студентов бакалавриата направления «Программная инженерия») // Педагогика и современность. 2013. №4. С. 83-85.
- Полевщиков И.С. Особенности изучения способа тестирования базового пути студентами бакалавриата в рамках дисциплины «Тестирование программного обеспечения» (часть 1) // Молодой ученый. 2015. №18(98). С. 10-12.
- Полевщиков И.С. Особенности изучения способа тестирования базового пути студентами бакалавриата в рамках дисциплины «Тестирование программного обеспечения» (часть 2) // Молодой ученый. 2015. №18(98). С. 13-15.
- Unit тесты на практике. URL: habrahabr.ru/post/191986/ (Дата обращения: 24.11.2015).
- Юнит тестирование в C# на примере Visual Studio 2008. testerway.blogspot.ru/2009/07/c-visual-studio-2008-unit-test-in-c.html (Дата обращения: 24.11.2015).
- Модульное тестирование кода. URL: msdn.microsoft.com/ru-ru/library/dd264975.aspx (Дата обращения: 24.11.2015).
- Краткое руководство. Разработка через тестирование с использованием обозревателя тестов. URL: msdn.microsoft.com/ru-ru/library/hh212233.aspx (Дата обращения: 24.11.2015).