ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.12.2023
Просмотров: 99
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
58 проводится с помощью вызова кода, который необходимо проверить и при поддержке сред разработки, таких как фреймворки для модульного тестирования или инструменты для отладки.
Один из наиболее эффективных подходов к компонентному
(модульному) тестированию – это подготовка автоматизированных тестов до начала основного кодирования (разработки) программного обеспечения. Это называется разработка от тестирования (test-driven development) или подход тестирования вначале (test first approach). При этом подходе создаются и интегрируются небольшие куски кода, напротив которых запускаются тесты, написанные до начала кодирования. Разработка ведется до тех пор пока все тесты не будут успешно пройдены.
Несмотря на свою схожесть, компонентное и модульное тестирование не являются синонимами [13]. Хотя в общем данные методики тестирования представляют одно и тоже, разница лишь в том, что в компонентном тестировании в качестве параметров функций используют реальные объекты и драйверы, а в модульном тестировании – конкретные значения.
Функциональное тестирование является еще одним из ключевых видов тестирования, задача которого – установить соответствие разработанного программного обеспечения исходным функциональным требованиям заказчика. Проведение функционального тестирования позволяет проверить способность информационной системы в определенных условиях решать задачи, нужные пользователям.
В зависимости от степени доступа к коду системы можно выделить два типа функциональных испытаний:
ー тестирование black box (черный ящик) – проведение функционального тестирования без доступа к коду системы;
ー тестирование white box (белый ящик) – функциональное тестирование с доступом к коду системы.
59
Тестирование black box проводится без знания внутренних механизмов работы системы и опирается на внешние проявления ее работы. При этом тестировании проверяется поведение ПО при различных входных данных и внутреннем состоянии систем. В случае тестирования white box создаются тест-кейсы, основанные преимущественно на коде системы ПО. Также существует расширенный тип black-box тестирования, включающего в себя изучение кода, – так называемый grey box (серый ящик).
4.2 Компонентное тестирование
Методология компонентного тестирования заключается в написании юнит-тестов (кода, моделирующего различные варианты использования программного средства), их запуска и просмотра результатов тестирования.
В данной работе используется фреймворк тестирования NUnit, облегчающий написание и запуск тестов, который также позволяет проводить тестирование на ОС Linux в среде разработки MonoDevelop (в отличие от Microsoft Testing
Framework, работающего только в среде разработки Visual Studio).
NUnit – открытая среда юнит-тестирования приложений для приложений на платформе .NET. Она была портирована с языка Java, реализация на котором известна, как JUnit. Первые версии NUnit были написаны на J#, но затем весь код был переписан на C# с использованием таких новшеств .NET, как атрибуты [14].
Существуют также известные расширения оригинального пакета NUnit, большая часть из них также с открытым исходным кодом. NUnit.Forms дополняет NUnit средствами тестирования элементов пользовательского интерфейса Windows Forms. NUnit.ASP выполняет ту же задачу для элементов интерфейса в ASP.NET.
Тесты NUnit могут выполняться как с помощью отдельного менеджера тестов NUnit, так и с помощью IDE MonoDevelop или встраиваться в проекты
60
Microsoft Test Project, позволяя использовать менеджер тестов среды разработки Visual Studio.
В данной работе для тестирования использовался менеджер тестов среды разработки MonoDevelop.
В процессе разработки и кодирования программных средств были выделены два основных компонента системы: API и сервер приема и обработки, каждый из которых был разделен на отдельные модули. Для основных модулей были написаны модульные тесты (код тестов находится в приложении А).
Для улучшения кода юнит-тестов пришлось видоизменить класс
SettingsStorage путем добавления к нему двух методов для инициализации настроек из памяти.
Тесты были написаны для основных процессов: загрузка настроек, соединение, проверка протокола и передача сообщений. Результаты выполнения тестов изображены на рисунке 22.
Рисунок 22 – Результаты работы модульных тестов
Как видно, все тесты были отработаны успешно.
Попутно с тестированием были рассчитаны метрики кода. В рассчитанные метрики входят цикломатическая сложность программы, глубина наследования и сопровождаемость.
61
Цикломатическая сложность программы (ЦСП, англ. Cyclomatic complexity) – структурная (или топологическая) мера сложности программ, используемая для измерения качества программного обеспечения, основанная на методах статического анализа кода. ЦСП равна увеличенному на единицу цикломатическому числу графа программы. При вычислении цикломатической сложности используется граф потока управления программы: узлы графа соответствуют неделимым группам команд программы и ориентированным ребрам, каждый из которых соединяет два узла и соответствует двум командам, вторая из которых может быть выполнена сразу после первой. Цикломатическая сложность может также быть применена для отдельных функций, модулей, методов или классов в пределах программы.
Цикломатическая сложность части программного кода — количество линейно независимых маршрутов через программный код. Например, если исходный код не содержит никаких точек ветвления или циклов, то сложность равна единице, поскольку, есть только единственный маршрут через код. Если код имеет единственный оператор «if», содержащий простое условие, то существует два пути через код: один если условие оператора «if» принимает значение «true» и второй, когда условие принимает значение
«false».
Индекс удобства поддержки (сопровождаемость) же вычисляется на основе трех метрик: цикломатическая сложность, число строк кода и вычислительная сложность. Значение индекса ниже 10 обозначает проблемный код, от 10 до 20 – код, модификация которого сложна.
Цикломатическая сложность ПС сервера приема и обработки сообщений имеет значение 294, из которых 171 путь вносят сгенерированные прокси-классы базы данных. Индекс сопровождаемости всего проекта имеет значение 75 (хорошо), а средняя глубина наследования классов – 4.
Результаты функционального тестирования отображены в таблице 15.
62
Таблица 15 – Результаты функционального тестирования
Загрузка настроек
Запустить систему акторов и дождаться загрузки настроек
Соответствует ожиданиям
Запуск сервера
Запустить систему акторов и дождаться сообщение о готовности принимать соединения
Соответствует ожиданиям
Соединение с сервером
Установить соединение с сервером с помощью API
Соответствует ожиданиям
Установка защищенного соединения
Отправить запрос на защиту соединения
Соединение зашифровано, соответствует ожиданиям
Отправка сообщения
Отправить сообщение от прикладной системы
Сообщение сохранено в БД, соответствует ожиданиям
Отключение от сервера
Отправить запрос на закрытие соединения
Соединение разорвано, соответствует ожиданиям
В ходе проведения функционального тестирования было выявлено, что программные средства исправно выполняют свои функции.
63
Заключение
В процессе выполнения выпускной квалификационной работы был выполнен анализ предметной области, в рамках которого были проанализированы схожие существующие программные средства приема и анализа сообщений, были оценены их подходы, поставлена задача на разработку и определена стоимость разработки. Был проведен анализ требований, заключающийся в проведении анализа вариантов использования программных средств и уточнении требований. Были определены подходы к различным действиям и общая архитектура программных средств; были определены средства разработки ПС.
В результате были разработаны программные средства доставки, приема и обработки сообщений, а именно API для компонентов прикладной системы и сервер обработки сообщений.
Разработанные программные средства выполняют все поставленные задачи и соответствуют требованиям, поставленным к работе.
Тестирование заключалось в определении методов тестирования и выполнении тестов. Были написан код модульных тестов, с помощью которого выполнялось тестирование ПС. Результаты компонентного и функционального тестирования показали корректность работы программных средств.
64
Список использованных источников
1.
The Original StatsD [Электронный ресурс]. – Режим доступа: https://github.com/iamcal/Flickr-StatsD – (проверено 25.02.2016).
2.
StatsD Metrics [Электронный ресурс]. – Режим доступа: https://github.com/b/statsd_spec – (проверено 25.02.2016).
3.
Мониторинг сервисов с Prometheus [Электронный ресурс]. –
Режим доступа: https://habrahabr.ru/company/selectel/blog/275803/
–
(проверено 25.02.2016).
4.
Ganglia и Nagios. Взаимодополняющий удаленный мониторинг
[Электронный ресурс]. – Режим доступа: https://habrahabr.ru/post/166171/ –
(проверено 25.02.2016).
5.
Ganglia Monitoring For Sysadmins [Электронный ресурс]. – Режим доступа: https://github.com/ganglia/monitor-core/wiki/Ganglia-Documents
(проверено 25.02.2016).
6. Биография Генри Ганта [Электронный ресурс]. – Режим доступа: http://www.mental-skills.ru/synopses/524.html – (проверено 09.06.2016).
7.
Иванов Ф. Н. Д. Моделирование на UML [Электронный ресурс]. – Режим доступа: http://book.uml3.ru/sec_1_7 – (проверено
27.04.2016).
8. Общие сведения о платформе .NET Framework [Электронный ресурс].
–
Режим доступа: https://msdn.microsoft.com/ru- ru/library/zw4w595w(v=vs.110).aspx – (проверено 09.06.2016).
9.
Brazil B. Push vs Pull for Monitoring [Электронный ресурс]. –
Режим доступа: http://www.boxever.com/push-vs-pull-for-monitoring
–
(проверено 25.02.2016).
10.
E
l-Kady S. Poodle Hastened the Death of SSL v3.0 [Электронный ресурс]. – Режим доступа: http://www.digitalqatar.qa/en/2014/11/13/poodle- hastened-the-death-of-ssl-v3-0/ – (проверено 29.04.2016).
65 11.
Таненбаум Э. Компьютерные сети. — Питер; 2007. — 992 c
12.
Caché | Современная система управления базами данных |
InterSystems
[Электронный ресурс].
–
Режим доступа: http://www.intersystems.com/ru/our-products/cache/cache-overview/
–
(проверено 21.05.2016).
13.
Про Тестинг - Тестирование - Уровни Тестирования ПО -
Компонентное или Модульное тестирование - Component or Unit Testing
[Электронный ресурс].
–
Режим доступа: http://www.protesting.ru/testing/levels/component.html
–
(проверено
21.05.2016).
14.
Thomas A. H. D. Pragmatic Unit Testing in C# with NUnit. — The
Pragmatic Bookshelf; 2004. — 159 c.
66
ГЛОССАРИЙ
Приложение А
(обязательное)
67
Масштабирование – наращивание вычислительной мощности системы.
Масштабируемость – способность системы, сети или процесса справляться с увеличением рабочей нагрузки (увеличивать свою производительность) при масштабировании.
Кластер – объединение нескольких однородных элементов, которое может рассматриваться как самостоятельная единица, обладающая определенны-ми свойствами. В информатике – группа компьютеров, объединенных высокоскоростными каналами связи и представляющая с точки зрения пользователя единый аппаратный ресурс.
Журнализация – процесс записи в системный журнал информации о сообщениях, запросах, выполнявшихся программах, использованных наборах данных и других сведений.
Мониторинг – процесс непрерывного наблюдения и регистрации данных о каком-либо объекте или наблюдение за состоянием процесса.
Метрика – значение определенного параметра какого-либо процесса.
API
– англ. application programming interface, интерфейс программирования приложений.
Язык UML – общецелевой язык визуального моделирования, который разработан для спецификации, визуализации, проектирования и документирования компонентов программного обеспечения, бизнес- процессов и других систем.
Система
- это множество элементов(подсистем, объектов), находящихся в отношениях и связях друг с другом. Совокупность подсистем, составляющих систему, служит определенной цели. Каждый объект системы имеет свое состояние и свой набор свойств и может являться системой меньшего размера.
Подсистема - набор объектов и подсистем, обеспечивающих некоторую функциональность и взаимодействующих как между собой, так и с внешней
68 системой (через определенный интерфейс). В состав подсистемы может входить один или более взаимонезависимых объектов и/или подсистем.
Сообщение - форма представления информации, имеющая признаки начала и конца и предназначенная для передачи по какой-либо среде связи. В данной работе каждое сообщение содержит либо уведомление о происхождении какого-либо события, либо информацию о каком-либо свойстве подсистемы.
Отказоустойчивость – свойство технической системы сохранять свою работоспособность после отказа одного или нескольких составных компонентов.
Фреймворк – англ. framework, каркас – программная платформа, определяющая структуру программной системы; программное обеспечение, облегчающее разработку и объединение разных компонентов большого программного проекта.
69
ЛИСТИНГ ПРОГРАММЫ
Приложение Б
(обязательное)
70
Base.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Akka.Actor; using Akka.Monitoring; using Akka.Monitoring.StatsD; namespace EvServerSystem
{ public class Base
{
Akka.Actor.ActorSystem _system;
IActorRef Core; public void Init ()
{
Console.WriteLine ("EvServer INIT\n");
_system = ActorSystem.Create("local-sys");
Core = _system.ActorOf
} public void Stop()
{
//Console.WriteLine("EvServer is stoped\n");
//_system.Stop(Core);
//Akka.Actor.
}
}
}
Server.cs using Akka.Actor; using System.Net; using System.Net.Sockets; using EvServerSystem.AppSock; using System; using Akka.Monitoring; using System.Net; using System.Net.Sockets; using System.IO; namespace EvServerSystem
{
///
/// Main server actor. Akka address: /user/local-sys
///
{
///
/// Initializes a new instance of the
/// Reads settings, initiates DB connection and new
///
71 public Server ()
{
//Получение конфигурации соединений из XML-файла var settings = SettingsStorage.Instance; if (settings == null) {
Console.WriteLine ("E: Please fill in settings and restart the app!");
SettingsStorage.Save ();
Console.ReadLine ();
Environment.Exit (1);
}
//Соединение с БД if (settings.ConnectionString != "") { try {
//DB.DBConnection.CreateConnection
(settings.ConnectionString);
} catch (Exception e) {
Console.WriteLine (String.Format ("E: Can't connect to
Cache DB: {0}", e.Message));
Console.WriteLine ("Bailing out");
Console.ReadLine ();
Environment.Exit (2);
}
}
//Ожидание соединения с клиентскими приложениями (pull-метод) var ep = new IPEndPoint (IPAddress.Any, (int)settings.AppSocketPort); var ssock = Context.ActorOf (Props.Create (() => new
SSock.ServerSocketActor (ep)), "server-socket"); ssock.Tell (true);
Console.WriteLine ("I: Ready to accept connections");
//Подключение к компанентам, работующим в режиме сервера (push-метод) try
{ string component = settings.PassiveComponents.Split(';')[0]; string id_component = component.Split(',')[0]; string address_component = component.Split(',')[1]; string ip_component = address_component.Split(':')[0]; string port_component = address_component.Split(':')[1]; var ep_component = new IPEndPoint(IPAddress.Parse(ip_component),
Convert.ToInt16(port_component));
TcpClient _client = new TcpClient();
_client.Connect(ep_component); var _stream = _client.GetStream();
StreamReader _sr = new StreamReader(_stream);
} catch (Exception ex)
{
Console.WriteLine("E: Could not connect to component!");
Console.WriteLine(ex.Message);
Console.ReadLine();
Environment.Exit(1);
}
}
#region IHandle implementation
72
///
/// Handles the message from
///
///
Application's TCP socket.
public void Handle (TcpClient message)
{
//got client from ServerSocket
//AppSocketActor address: /user/core/IP var appsock = Context.ActorOf
{0}", message.Client.RemoteEndPoint.ToString ()));
Console.Write(message.Client.RemoteEndPoint.ToString());
//kick start
//appsock.Tell(message);
//Context.IncrementMessagesReceived ();
}
#endregion
}
}
SettingsStorage.cs using System.IO; using System.Xml.Serialization; using System.Security.Cryptography.X509Certificates; using System.Xml; using InterSystems.Data.CacheTypes; using System.Data; namespace EvServerSystem
{
///
/// Server settings storage.
///
[XmlRoot ("EvServerStartupData")] public class SettingsStorage
{
///
/// Gets or sets the connection string.
///
///
///
/// Gets a value indicating whether this instance is ssl enabled.
///
///
//var serverCertificate = new X509Certificate2(ServerCertificateFile);
[XmlIgnore] public X509Certificate2 ServerCert{ get; private set; } public bool AcceptEncryptedOnly { get; set; }
///
/// Port to listen for applications on.
///